この記事はGROOVE X Advent Calendar 2025 18日目の記事です。
はじめに
こんにちは。ファームウェアの開発を担当してるf-sakashitaと申します。
LOVOTにおけるファームウェアのお話は過去記事をご覧ください。
ファームウェアチームは常に最近の技術動向についてアンテナを張っています。
今回はSTMicroelectronics社の展開するSTM32シリーズで一部のものに搭載されているDMAMUXという機能が気になったため、実機を使って調査してみました。
こちらについて解説したいと思います。
DMAMUXとは?
STMicroelectronics社公式の資料より参照
DMA リクエストルータ(DMAMUX)の機能:
- プログラム可能なリクエストソース選択:DMAモードでペリフェラルから、あるいは、トリガ後に内部生成
- 同期モード:DMAMUXリクエストカウンタを用いて同期入力(ハードウェアイベント)から
- リクエスト連鎖:DMAMUXリクエストカウンタを用いて、別のリクエスト/チャネルへの入力トリガあるい は同期であるイベントを生成
つまり、何ができるの?
一言で言えば、特定のハードウェアイベント発生時に、CPUの介在なしにDMA転送を自動で開始・同期できる機能です。
例えば、「ある入力ピンの状態がHigh → Lowとなったとき、このFalling edgeをトリガーに、特定のUARTの送信バッファへ所望のデータをDMA経由で転送する」、というものです。
これまでこういった機能を実装するには、
- イベントをポーリングや割り込みを使って逐次監視する
- イベント発生時に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 detectionEXTI line 4 to 15 interrupts:Enabled


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

DMA
Enable synchronization:EnabledSynchronization 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転送があるイベントと同期が取れるようになることで、より効率的なアプリケーションの開発ができそうです。
弊社ではファームウェアエンジニアを募集中ですので、ご興味のある方は是非ご応募ください。 新しい仲間がジョインされることを楽しみにしています。