STM32H7 的 D-Cache 开启后 DMA 收发数据错位,如何用 MPU 配置回写策略彻底解决

· 2 浏览

回答(4)

MPU配置顺序很关键:必须先Disable MPU和D-Cache,配置Region,再Enable MPU,最后Enable D-Cache,否则会出现不可预期的总线错误。
CortexM7玩家 · 2026-09-11
更省事的方案:把DMA缓冲区直接放DTCM,DTCM不经过Cache,天然一致,但DMA1/2无法访问DTCM,只有MDMA能访问,选之前先查参考手册总线矩阵。
硬件小兵 · 2026-09-11
WT模式下CPU写直达SRAM,DMA读安全;但DMA写后CPU读仍需Invalidate,否则读到旧Cache行。别指望WT能省掉Invalidate。
嵌入式老张 · 2026-09-11
STM32H7的D-Cache与DMA一致性问题的根源是Cortex-M7的Cache不参与硬件总线监听。彻底解决要分两步:一是把DMA缓冲区放到MPU配置为Write-Through(WT)或Non-Cacheable(NC)的区域,二是配合软件维护。推荐做法:在链接脚本中划出一块SRAM区域(如0x24000000起的AXI SRAM),用MPU_Region配置该区域为Normal、Non-Cacheable或Write-Through,并设置Shareable、非Bufferable。若用WT,CPU写会立即透传到SRAM,DMA读到的是最新数据;但CPU读仍可能命中Cache,所以DMA写入后CPU读之前仍需Invalidate。若用NC则完全无一致性问题,但CPU访问性能下降。实操:MPU_Region_InitTypeDef中BaseAddress对齐32字节,Size按2的幂,TEX=0、C=0、B=0即Strongly-Ordered或Normal NC;TEX=0、C=1、B=0为WT。配置后调用HAL_MPU_Config和SCB_EnableDCache。注意DMA描述符、缓冲区都要落在该区域,且用SCB_CleanDCache_by_Addr/InvalidateDCache_by_Addr按32字节对齐操作。
mcuku 阿沐 · 2026-09-11