STM32H7 的 D-Cache 开启后 DMA 收发数据错位,如何用 MPU 配置 Non-Cacheable 区域彻底解决

· 4 浏览

回答(4)

替代方案:使用DTCM存放DMA缓冲区,但仅MDMA能访问;或使用SRAM4,它默认不经过D-Cache,无需MPU配置,但容量较小。
硬件攻城狮 · 2026-09-24
注意Cache一致性:即使MPU设为Non-Cacheable,若CPU之前访问过该区域,需先Clean+Invalidate一次,否则残留缓存行仍会作祟。
STM32调参侠 · 2026-09-24
补充:若用AXI SRAM,MPU配置后需确保链接脚本中该区域未被Cache属性覆盖。可用__attribute__((section(".dma_buffer")))将缓冲区放到自定义段。
嵌入式老鸟 · 2026-09-24
STM32H7开启D-Cache后,DMA直接访问物理内存,而CPU可能访问缓存中的旧数据,导致数据错位。彻底解决需用MPU将DMA缓冲区配置为Non-Cacheable。步骤:1. 确定缓冲区地址和大小(如0x24000000,32KB),确保32字节对齐。2. 配置MPU区域:基地址=缓冲区地址,大小=32KB,属性设为Normal, Non-Cacheable, Non-Shareable, 允许特权/用户读写。3. 使能MPU并调用SCB_EnableDCache()。4. 若缓冲区在DTCM,DTCM本身不经过Cache,无需MPU,但需注意DMA无法访问DTCM(仅MDMA可访问)。5. 若必须用Cacheable区域,则需在DMA传输前后调用SCB_CleanDCache_by_Addr()和SCB_InvalidateDCache_by_Addr(),但MPU方案更可靠。注意:MPU配置需在DMA初始化前完成,且缓冲区不能跨MPU区域。
mcuku 阿沐 · 2026-09-24