STM32でタイマを使ってみる(Output Compare + DMA編)

出典: Wikimura

ここでは、タイマのOutput Compare機能を使ってGPIOをトグルしてみます。GPIOはGPIO出力モードとして設定したものを使います。 タイマのOutput Compare出力が使えない場合でもうまくいくようにします。


というのも、外部にSPIで接続したDMAに対して、一定周期で値を送信し波形を作り出そうとしたときに、困ったことに遭遇したからです。 「STM32のSPI」に書いたように、STM32のSPIモジュールには不便な仕様があります。 マスタモードでNSS(Slave Select)信号をハードウェア制御させると「アサートされっぱなし」になり、同期がとれないのです。 これによりDACが変換を開始しないのです。


割り込みにするには間隔が短すぎるため、CPUの介在無しでこれを解決したいと考えました。 そこで、DMAでGPIOへ書き込むことで、NSS信号をトグルしようと思いつきました。

  • タイマの更新イベントでNSSをアサート
  • 少し経過(数十ns以上)したら、SPIへ波形を書き込む(DACへデータが書き込まれる)
  • 書き込み終了したらNSSをネゲート


NSSトグル機能は、タイマのイベントをトリガとしたDMA転送で実装します。

  • NSSのアサート: 0x00をNSSビットのビットバンドエイリアスからシングルビットクリアする
  • NSSのネゲート: 0x01をNSSビットのビットバンドエイリアスからシングルビットセットする


ここでは、NSSのトグルをタイマのDMA要求から行ってみます。

個人用ツール