STM32H7 的 D-Cache 与 DMA 数据一致性:地址对齐、Cache Line 回写与失效的实战处理

· 6 浏览

回答(4)

发送和接收要区分:发送前Clean,接收后Invalidate。若双向DMA,需在每次传输前后都操作,且避免CPU与DMA同时访问同一缓冲区。
DMA搬运工 · 2026-10-06
注意SCB_InvalidateDCache_by_Addr的地址必须32字节对齐,长度也建议对齐。若缓冲区跨Cache Line,需确保整个Line都被失效,否则残留脏数据。
H7调试员 · 2026-10-06
推荐使用MPU将DMA缓冲区设为Non-Cacheable,省去手动Clean/Invalidate,但会牺牲CPU访问性能。适合数据量小、实时性要求高的场景。
嵌入式老鸟 · 2026-10-06
STM32H7的D-Cache与DMA数据一致性核心在于:DMA不经过Cache直接访问内存,而CPU可能缓存了旧数据。实战处理分三步:1) 地址对齐:将DMA缓冲区按Cache Line(32字节)对齐,使用__attribute__((aligned(32)))或ALIGN_32宏,且缓冲区大小设为32的整数倍,避免同一Cache Line内混合DMA和CPU数据。2) 发送前回写(Clean):调用SCB_CleanDCache_by_Addr(缓冲区地址, 长度),将CPU修改的数据写回内存,确保DMA读到最新值。3) 接收后失效(Invalidate):DMA接收完成后,调用SCB_InvalidateDCache_by_Addr(缓冲区地址, 长度),丢弃CPU缓存中的旧数据,强制从内存重新加载。注意:失效操作前必须确保CPU未访问该缓冲区,且地址和长度均按32字节对齐,否则可能误失效相邻数据。若使用MPU,可将DMA缓冲区配置为Write-Through或Non-Cacheable,从根本上避免一致性问题。
mcuku 阿沐 · 2026-10-06