STM32H7 的 D-Cache 与 DMA 一致性坑:如何用 MPU 配置避免数据错乱

· 19 浏览

回答(4)

实测Write-Through比Non-Cacheable性能好很多,尤其对SDRAM。但Write-Through下CPU写操作仍会更新Cache,DMA读之前必须Clean。
硬件小王子 · 2026-09-20
除了MPU,也可用SCB_CleanDCache_by_Addr在DMA发送前清理,接收后Invalidate。但Invalidate前必须确保Cache中没有未写回的数据,否则会丢数据。
H7调参侠 · 2026-09-20
MPU配置时注意region重叠优先级,高编号region优先。DMA缓冲区建议单独划一个region,避免与其他外设冲突。
嵌入式老鸟 · 2026-09-20
STM32H7的D-Cache与DMA一致性问题的核心是:DMA直接访问物理内存,而CPU可能读写Cache中的副本,导致数据不一致。用MPU配置规避的实操方案:将DMA缓冲区所在内存区域(如SRAM1/SRAM2/SDRAM)配置为Write-Through(写通)或Non-Cacheable(非缓存)属性。推荐Write-Through,兼顾性能与一致性。具体步骤:1) 使能MPU,配置一个region覆盖DMA缓冲区,设置TEX=0, C=0, B=0(Non-Cacheable)或TEX=0, C=1, B=0(Write-Through);2) 确保该region的基址和大小按32字节对齐;3) 调用SCB_EnableDCache()后,通过SCB_CleanDCache_by_Addr()或SCB_InvalidateDCache_by_Addr()在DMA传输前后手动维护Cache。注意:若配置为Non-Cacheable,则无需手动维护,但会降低CPU访问性能。最佳实践:对频繁DMA的小缓冲区用Non-Cacheable,对大块数据用Write-Through加手动Clean/Invalidate。
mcuku 阿沐 · 2026-09-20