Inside of LOVOT

GROOVE X 技術ブログ

STM32 DMAMUXについて

この記事はGROOVE X Advent Calendar 2025 18日目の記事です。

はじめに

こんにちは。ファームウェアの開発を担当してるf-sakashitaと申します。

LOVOTにおけるファームウェアのお話は過去記事をご覧ください。

tech.groove-x.com

tech.groove-x.com

ファームウェアチームは常に最近の技術動向についてアンテナを張っています。

今回はSTMicroelectronics社の展開するSTM32シリーズで一部のものに搭載されているDMAMUXという機能が気になったため、実機を使って調査してみました。

こちらについて解説したいと思います。

DMAMUXとは?

STMicroelectronics社公式の資料より参照

https://www.stmcu.jp/wp/wp-content/uploads/files/presentation-ja/STM32G4/07_STM32G4-System-Direct_Memory_Access_(DMA+DMAMUX)-J-.pdf

DMA リクエストルータ(DMAMUX)の機能:
- プログラム可能なリクエストソース選択:DMAモードでペリフェラルから、あるいは、トリガ後に内部生成
- 同期モード:DMAMUXリクエストカウンタを用いて同期入力(ハードウェアイベント)から
- リクエスト連鎖:DMAMUXリクエストカウンタを用いて、別のリクエスト/チャネルへの入力トリガあるい は同期であるイベントを生成

つまり、何ができるの?

一言で言えば、特定のハードウェアイベント発生時に、CPUの介在なしにDMA転送を自動で開始・同期できる機能です。

例えば、「ある入力ピンの状態がHigh → Lowとなったとき、このFalling edgeをトリガーに、特定のUARTの送信バッファへ所望のデータをDMA経由で転送する」、というものです。

これまでこういった機能を実装するには、

  1. イベントをポーリングや割り込みを使って逐次監視する
  2. イベント発生時にDMA転送を開始する関数を呼び出す

いう手順が必要でした。

しかし、DMAMUXはこれらの処理をハードウェアレベルで完結させるため、イベント発生から転送開始までのレイテンシを短縮し、CPUの負荷を抑えることができます。

では、実際に評価ボードを用いてスイッチが押下されたときにUARTのDMA転送を開始する処理を実装してみます。

実装

環境

  • Tools : STM32CubeIDE 2.0.0 & STM32CubeMX v6.16.0
  • 評価ボード : NUCLEO-G071RB

目標

評価ボード上のUser Button(PC13)を押下したときにUART2の送信ピン(PA2)から4バイトずつデータを送信するようにします。

送信データは「0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88」の計8バイトとします。

ペリフェラル設定

GPIO & NVIC

User Buttonを押下のイベント検出のため、EXTI・Falling edge設定にします。

  • GPIO mode : External Interrupt Mode with Falling edge trigger detection
  • EXTI line 4 to 15 interrupts : Enabled

UART

今回はデフォルト設定のままにします。

DMA

  • Enable synchronization : Enabled
  • Synchronization signal : EXTI13を選択
  • Request Number:イベント発生時に何回DMA転送するかを決めるパラメータです。今回はSWを押下するたびに4バイト送信する&DMA転送サイズはbyteとしているため、4をセットします。

コーディング

main関数のwhile前にHAL_UART_Transmit_DMA関数を呼び出して転送するデータをセットしておきます。

int main(void)
{
  /*** 省略 ***/
  
  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_DMA_Init();
  MX_USART2_UART_Init();
  /* USER CODE BEGIN 2 */
  // 送信データをセット
  uint8_t tx_data[8] = {0x11,0x22,0x33,0x44,0x55,0x66,0x77,0x88};
  HAL_UART_Transmit_DMA(&huart2, tx_data, 8);
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
}

動作確認

User button押下1回目の様子。正常にFalling edgeをトリガーに0x11, 0x22, 0x33, 0x44のデータが送信されています。

User button押下2回目の様子。正常にFalling edgeをトリガーに0x55, 0x66, 0x77, 0x88のデータが送信されています。

おわりに

今回はSTM32のDMAMUXという機能について、実機を用いて紹介してみました。 トリガーとなるイベントは入力ピンだけじゃなく、一部のTimerや他DMAMUXのイベントもトリガーにできます。 DMA転送があるイベントと同期が取れるようになることで、より効率的なアプリケーションの開発ができそうです。

弊社ではファームウェアエンジニアを募集中ですので、ご興味のある方は是非ご応募ください。 新しい仲間がジョインされることを楽しみにしています。

recruit.jobcan.jp