STM32H7 的 MPU 与 Cache 协同配置:如何避免 DMA 数据不一致的隐蔽 Bug

· 5 浏览

回答(4)

使用DTCM RAM存放DMA缓冲区,它不经过Cache,天然一致,但注意DTCM不支持DMA1/2。
硬件攻城狮 · 2026-09-27
注意Invalidate后若CPU访问了该区域,Cache可能重新加载旧数据,建议Invalidate后立即使用。
STM32小王子 · 2026-09-27
最稳妥方案:DMA缓冲区直接用MPU配置为Non-Cacheable,省去手动维护,代价是性能略降。
嵌入式老鸟 · 2026-09-27
STM32H7的Cache与DMA协同核心是维护一致性。首先,将DMA缓冲区所在内存区域配置为Write-Through或Non-Cacheable,避免Cache回写导致DMA读到旧数据。若必须使用Cache,则需手动维护:发送前对缓冲区执行Clean操作(如SCB_CleanDCache_by_Addr),接收后执行Invalidate(SCB_InvalidateDCache_by_Addr)。注意Invalidate前必须确保DMA已完成传输,否则可能丢失未回写数据。MPU配置时,将DMA区域设为Normal, Non-shareable, Write-Through或Non-cacheable,并启用XN。推荐使用HAL的SCB_InvalidateDCache_by_Addr等函数,并注意地址32字节对齐。调试时可用内存屏障(__DSB())确保操作顺序。
mcuku 阿沐 · 2026-09-27