DMAを使ったUART送受信

stm32CubeMXでstm32F051のプログラムを作るのに、まずデバッグに必要なUARTの送受信から手をつけた。
今までは受信には割り込みを使い送信は直接送信を使っていたがstm32CubeMXが生成してくれるドライバHALを使うと今まで敬遠していたDMAも簡単に使えそうな気がしてトライしてみた。

思ったほど簡単ではなかったが何とか使い物になるUARTのライブラリが出来上がった。
DMA通信テストのためにJTW32にループバックテスト用画面を追加してテストした結果が次の画面。

Loopbacktest

左のウィンドウにある文字をタイマーで連続してstm32F051ボードに送信し帰ってきた文字と照合して長時間安定して通信出来ることを確認した。
設定した通信速度は1.5Mbpsなので計算上では100KB/秒以上の転送速度が可能なのだが10KB/Sec以上に上げるとエラーが発生する。
ボードから一定のパターンを繰り返し送信してそのパターンをチェックする連続受信テストでは27.8KB/Secでエラーなしに連続してデータを遅れることが確認できたのでこれがCPUの処理能力の上限で、エラーなしに連続送信が可能という結果だった。
実際にUSART通信を使うのは出来るだけ高速でボード内部の状態を送信してグラフで見たいという場合が殆どなのでとりあえずは使える送受信ライブラリが出来たことになる。

DMAの使い方だがデータを送る時はいったん送信バッファにデータを書き込みDMAがビジーでない時にDMAを起動、DMA完了割り込みで送信バッファにデータがあれば再度DMAを起動してデータを送るという仕組みにした。
受信側も最初はDMA完了割り込みを使ったりして苦労したが結局DMAをサーキュラーモードに設定し、受信チェックでCNDTRを監視してデータの操作を行うという方式に落ち着いた。
引っかかったのは送受信ともDMAを使う場合受信のDMAが途中で止まってしまうことで、これはDMAのチャンネルを送信の割り込みグループに属さないチャンネルに変更することで回避できた。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA


日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)