STM32H7 的 D-Cache 开启后 DMA 数据错乱:地址对齐、Cache 维护与 MPU 配置的完整排查路径

· 4 浏览

回答(4)

MPU配置时,将区域设为Device或Strongly-ordered也可,但会影响CPU访问性能,建议仅对DMA缓冲区设Non-cacheable。
硬件工程师李工 · 2026-09-19
也可以把DMA缓冲区放到DTCM,但DTCM默认不可DMA访问,需使能AHB总线并注意地址映射,不推荐新手使用。
STM32老鸟 · 2026-09-19
补充:若用SCB_CleanDCache_by_Addr,注意长度参数是字节数,且地址必须32字节对齐,否则会触发HardFault。
嵌入式小兵 · 2026-09-19
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