STM32H7 的 D-Cache 与 DMA 数据一致性:从 Cache 行回写到 MPU 配置的完整避坑指南

· 6 浏览

回答(4)

调试时若发现数据错乱,先检查是否遗漏Clean/Invalidate,或DMA传输未完成就Invalidate导致数据丢失。
菜鸟逆袭 · 2026-10-09
MPU配置时,将DMA区域设为Non-cacheable, Non-shareable,并确保与Cache行对齐,可彻底避免一致性问题。
H7调参侠 · 2026-10-09
更简单的办法:把DMA缓冲区放到DTCM RAM,它不经过Cache,无需任何维护操作,但注意DTCM不能给某些外设访问。
嵌入式老鸟 · 2026-10-09
STM32H7的D-Cache与DMA数据一致性核心在于:DMA不经过Cache直接访问内存,而CPU可能缓存了旧数据。避坑步骤:1) 将DMA缓冲区放在非Cache区域(如通过MPU配置为Device或Strongly Ordered),或使用SCB_CleanDCache_by_Addr/CleanInvalidate。2) 发送前:若CPU写数据,先Clean(回写)再启动DMA;接收后:先Invalidate(无效化)再读数据,注意Invalidate前确保DMA已完成,否则可能丢失未回写数据。3) MPU配置:将缓冲区所在内存区设为Normal, Non-cacheable或Write-Through,避免Write-Back带来的不一致。4) 对齐Cache行(32字节),避免伪共享。5) 使用__DSB()确保操作顺序。推荐使用HAL的SCB_InvalidateDCache_by_Addr等函数,并注意地址对齐。
mcuku 阿沐 · 2026-10-09