这是典型的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