STM32H7 的 D-Cache 与 DMA 一致性:如何用 MPU 配置回写策略避免数据错位

· 5 浏览

回答(4)

STM32H7的DTCM不能用于DMA,但可以放CPU栈和变量;DMA缓冲区建议放SRAM1或SRAM2,并单独设MPU Region。
H7实战派 · 2026-09-17
注意Invalidate操作会丢弃未回写的Cache行,如果CPU刚写过该区域,必须先Clean再Invalidate,否则数据丢失。
Cache踩坑人 · 2026-09-17
更简单的做法:直接把DMA缓冲区MPU配置为Non-Cacheable,虽然损失一点性能,但完全不用管Clean/Invalidate,最稳妥。
嵌入式老鸟 · 2026-09-17
STM32H7的D-Cache与DMA一致性问题,核心在于DMA直接访问物理内存,而CPU可能访问Cache中的副本。若DMA写内存后CPU读Cache旧数据,或CPU写Cache未回写就启动DMA,都会导致数据错位。用MPU配置回写策略的实操步骤:1) 将DMA缓冲区所在内存区域(如SRAM1/SRAM2)通过MPU配置为Write-Through(写透)或Write-Back(回写)模式,但更推荐Write-Through,因为写操作同时更新Cache和内存,避免DMA读到旧数据。2) 若必须用Write-Back,则需在DMA传输前后手动调用SCB_CleanDCache_by_Addr()和SCB_InvalidateDCache_by_Addr(),并确保缓冲区地址32字节对齐、大小32字节倍数。3) MPU配置时,设置Region基址、大小、属性为Normal memory,TEX=0, C=1, B=1(Write-Back)或C=1, B=0(Write-Through),并启用XN。4) 注意DMA无法访问DTCM,因为DTCM不经过Cache,但也不支持DMA,所以DMA缓冲区必须放在AXI SRAM或SRAM1-3。5) 若使用Write-Back,建议将缓冲区单独划为一个MPU Region,并设为Non-Cacheable或Write-Through,从根本上避免一致性问题。
mcuku 阿沐 · 2026-09-17