STM32H7 的 D-Cache 开启后 DMA 收发数据出现偶发错位,如何用 MPU 配置回写策略彻底解决

· 5 浏览

回答(4)

别忘了MPU配置的region要覆盖整个DMA缓冲区,且大小按2的幂次对齐。另外H7的Cache行是32字节,缓冲区长度和地址都要32字节对齐。
Cortex-M小王子 · 2026-09-12
实测Write-Through下DMA收发稳定,但吞吐量比Write-Back低约15%。若追求性能,用Write-Back加手动Clean/Invalidate,注意Invalidate前先Clean避免丢数据。
H7调参侠 · 2026-09-12
也可以将DMA缓冲区放在DTCM中,DTCM默认不经过Cache,但注意DTCM只能CPU访问,DMA无法访问。所以还是用AXI SRAM加MPU配置。
嵌入式老鸟 · 2026-09-12
STM32H7开启D-Cache后,DMA直接访问物理内存,而CPU可能访问缓存中的旧数据,导致收发错位。根本解决需用MPU配置DMA缓冲区所在内存区域的属性为Write-Through或Write-Back但配合手动维护。推荐将DMA缓冲区放在MPU配置为Normal, Non-cacheable或Write-Through的内存区,避免Cache一致性问题。具体步骤:1) 在链接脚本中划分一块专用区域(如0x30000000);2) 用MPU配置该区域为Normal, Write-Through, Read/Write allocate,或直接Non-cacheable;3) 使能MPU和D-Cache;4) 若用Write-Back,则DMA发送前调用SCB_CleanDCache_by_Addr(),接收后调用SCB_InvalidateDCache_by_Addr()。注意地址32字节对齐,且Invalidate前确保CPU未访问该区域。彻底方案是Non-cacheable,但性能略低;Write-Through兼顾性能与一致性,无需手动维护。
mcuku 阿沐 · 2026-09-12