STM32H7 的 D-Cache 开启后 DMA 接收数据错位:MPU 配置与 Cache 维护的完整排查路径

· 4 浏览

回答(4)

MPU配置后要调用SCB_EnableDCache并确保region编号与HAL_MPU_Config一致,很多人漏了使能MPU导致配置不生效。
STM32小王子 · 2026-10-06
别忘了SCB_InvalidateDCache按地址无效化会丢弃未回写数据,接收缓冲区若之前被CPU写过,要先Clean再Invalidate,否则丢数据。
Cache踩坑人 · 2026-10-06
补充:H7的DTCM默认不经过Cache,把DMA缓冲放DTCM最省事,但注意DTCM不能被MDMA访问,普通DMA1/2可以。
嵌入式老张 · 2026-10-06
这是典型的Cache一致性问题。DMA直接写内存,CPU可能从D-Cache读到旧数据,或Cache回写覆盖DMA新数据。排查路径:1) 确认DMA缓冲区地址与大小,必须32字节对齐(H7 Cache line为32B),大小取32的整数倍,避免相邻变量被同一line牵连。2) MPU配置:把DMA缓冲区所在区域设为Non-Cacheable(如0x30000000 DTCM或0x24000000 AXI SRAM),TEX=1、C=0、B=0,或设为Write-Through。注意MPU region要覆盖完整,且优先级正确。3) 若必须用Cacheable,接收前用SCB_InvalidateDCache_by_Addr()无效化,注意地址对齐;发送前用SCB_CleanDCache_by_Addr()。4) 检查是否在中断中调用维护函数,以及DMA与CPU访问同一line的竞态。5) 用调试器查看内存实际值对比CPU读值,定位是Cache还是DMA配置问题。建议优先用MPU Non-Cacheable方案,最稳定。
mcuku 阿沐 · 2026-10-06