CubeIDEが生成するコードでDMAによるシリアル転送ができない

メモです。

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

症状

HAL_UART_Transmit_DMA() を実行しても HAL_UART_TxCpltCallback() が呼ばれません。

原因

CubeIDEのバグです。main()の中で以下のコードが実行されますが、このコード列は間違っています。

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_USART3_UART_Init();
  MX_DMA_Init();

正しくは以下の順序です。

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_DMA_Init();
  MX_USART3_UART_Init();

ワークアラウンド

ソースコードを編集して正しい順序に正します。しかし、この方法では再度デバイス・コンフィギュレーション・ツールからコード生成をすると、元に戻ります。

そこでデバイス・コンフィギュレーション・ツールのプロジェクトマネージャーで、Generated Function Callの順序を変更します。こうしておけば、再度コード生成してもバグが戻りません。

関数生成順序の変更

その他

この問題は以前修正されましたが、再度発生しました。

コメントする

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