0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

STM32F7 + eMMC でDTIMEOUT割り込みが発生する問題と対策

Posted at

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)

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?