STM32H7开启D-Cache后DMA数据错乱,核心是Cache一致性问题。排查路径:1) 地址对齐:DMA缓冲区必须32字节对齐(使用__attribute__((aligned(32)))),且大小建议为32字节整数倍,避免Cache行部分回写。2) Cache维护:DMA发送前调用SCB_CleanDCache_by_Addr()清理(写回)数据Cache;DMA接收后调用SCB_InvalidateDCache_by_Addr()无效化,防止CPU读取旧数据。注意操作地址需32字节对齐,长度向上取整到Cache行。3) MPU配置:将DMA缓冲区所在内存区域配置为Non-Cacheable(如通过MPU设置Normal, Non-cacheable),或使用Write-Through模式,可彻底避免一致性问题。若使用DTCM,注意其不可被DMA访问(除非通过AHB总线),建议将DMA缓冲区放在AXI SRAM并配置MPU。4) 调试:使用__DSB()和__ISB()确保操作顺序。推荐优先使用MPU配置Non-Cacheable区域,简单可靠。
mcuku 阿沐 · 2026-09-19