STM32F7 + eMMC でDTIMEOUT割り込みが発生する問題と対策
はじめに
STM32F7シリーズのSDMMCモジュールを使用してeMMCとDMA通信を行う際、DTIMEOUT(データタイムアウト)割り込みが予期せず発生する問題に遭遇しました。
通常、DMA転送完了時に DTEN ビットは自動的にクリアされ、データタイムアウトタイマーも停止するはずですが、実際にはタイマーが停止せずDTIMEOUTが発生するケースがあります。
本記事では、この問題の詳細と対策方法について解説します。
発生する問題
DTIMEOUT 割り込みが予期せず発生し、通信が停止する
原因
HALライブラリでは、DMA受信完了後に以下の処理が行われます。
SDMMC1->DCTRL &= ~SDMMC_DCTRL_DMAEN; // DMAENビットをクリア
しかし、これでは DCTRL の DTEN ビット(データ転送有効)が完全にクリアされないことがあり、データタイムアウトタイマーが停止せず、DTIMEOUT割り込みが発生する場合があります。
これは、STのリファレンスマニュアルに記載されている動作と一致しない ため、特定の条件下で発生する可能性のある不具合と考えられます。
対策
DMA受信完了後に、単に DMAEN をクリアするのではなく、DCTRL 全体を 0x0 に設定 することで、この問題を回避できます。
修正前
SDMMC1->DCTRL &= ~SDMMC_DCTRL_DMAEN; // DMAENビットをクリア
修正後
SDMMC1->DCTRL = 0x0; // DCTRLレジスタ全体をクリア
これを HAL_MMC_DMAReceiveCpltCallback() 内で適用することで、DTIMEOUT の発生を防ぐことができます。
参考
Unexpected DTIMEOUT interrupt in STM32F7 eMMC DMA Receive (ST Community)