STM32H7 的 MPU 配置与 Cache 一致性:DMA 收发数据错乱的根因与修复

· 3 浏览

回答(4)

注意:DTCM不能被DMA访问,别把DMA缓冲放DTCM;AXI SRAM可Cache,需MPU配置或手动维护。
硬件工程师小张 · 2026-09-19
也可以把DMA描述符和缓冲区都放到SRAM4(0x38000000),该区域默认非缓存,且DMA可访问。
STM32达人 · 2026-09-19
补充:使用SCB_InvalidateDCache时,若缓冲区跨Cache行,需按32字节对齐并覆盖整个行,否则可能误删相邻数据。
嵌入式老鸟 · 2026-09-19
根因通常是DMA与CPU Cache不一致:STM32H7的Cortex-M7有D-Cache,DMA直接访问SRAM,而CPU可能读写的是Cache中的旧数据。发送时CPU写数据在Cache未回写,DMA读到旧内存;接收时DMA写新数据到内存,CPU却从Cache读旧值。修复:1) 将DMA缓冲区放在MPU配置为Non-Cacheable的区域(如0x30000000后的SRAM),或使用DTCM(但注意DMA无法访问DTCM);2) 若必须Cacheable,发送前调用SCB_CleanDCache_by_Addr(),接收后调用SCB_InvalidateDCache_by_Addr(),注意地址32字节对齐;3) 配置MPU将DMA缓冲区设为Normal Non-Cacheable或Device内存,并确保MPU region与链接脚本一致。推荐优先用Non-Cacheable SRAM,简单可靠。
mcuku 阿沐 · 2026-09-19