2019年12月8日日曜日

STM32のUARTのDMA送信におけるバッドノウハウ

STM32F4のDMAを使ったUART送信、下記の仕様なのでちょっと勝手の悪いところがありました。

Circular
一度Enableにすると、メモリ上のデータを繰り返し送信し続ける。
Normal
送信後、各種フラグをクリアする必要があり、CPUの命令を消費してしまう。

ゲームボーイのカートリッジでRAMの値を外部に送信しようとすると、NormalではCPUを使う時間が増えるため、動作に支障が出ます。かといってCircularでは、同じ値を送信し続けるので受信側に工夫が必要になってしまいます。最低限必要なデータを、最低限のCPU消費で送信したいのです。

今回のバッドノウハウ

今回は1バイトだけ送信したいので、Circularモードに設定したうえで次のようにENABLEの直後にDISABLEを続けると、ちょうど1バイトだけ送信したところでDMAが止まり、Circularモードなので何事もなく再開します。

DMA_Cmd(DMA1_Stream6, ENABLE);
DMA_Cmd(DMA1_Stream6, DISABLE);

ただこれはボーレートとの兼ね合いもたまたまちょうど良かっただけかもしれません。複数のバイト列を送信する場合には使えないので、そのときは改めて方法を考える必要があります。

0 件のコメント:

コメントを投稿