Normal DMA転送でHalf Complete 割り込みが発生する

メモです。

  • CubeIDE 1.7.0
  • Ubuntu 20.04 LTS
  • STM32F091, F446, F722, F746, G070, G431, H743, L412

症状

先に報告した「CubeIDEが生成するコードでDMAによるシリアル転送ができない」問題のワークアラウンドを適用すると、シリアルに対してDMA転送ができるようになります。しかしながら、DMAをノーマル・モードに設定しているにもかかわらず、サーキュラー・モードでしか呼ばれないはずのHaf Complete割り込みコールバックが呼ばれます。手元のNculeoすべてで再現します。シリアル転送以外のペリフェラルで同様の問題が起きるか否かは調べていません。

シリアルDMA転送にサーキュラー・モードとノーマル・モードを混在させた時には問題になるかもしれません。

ノーマルDMA転送を設定する
DMA Half Completeのコールバックが呼ばれる

原因

不明です。いつからあるバグなのかも不明です。

ワークアラウンド

ユーザー・コールバック関数であるHal_UART_TxHalfCpltCallback()の中で、必ず「サーキューラー・モードに設定したシリアルポートか否か」を確認するようにします。

コメントする

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください