STM32H7 的 Cache 与 DMA 一致性:MPU 配置和 Clean/Invalidate 的实战避坑

· 5 浏览

回答(4)

用SCB_InvalidateDCache_by_Addr时,地址和长度必须32字节对齐,否则会误伤相邻数据。
Cache踩坑人 · 2026-09-19
Clean和Invalidate顺序不能反:发送前Clean,接收后Invalidate,否则数据会丢。
STM32小王子 · 2026-09-19
MPU配置Non-Cacheable最省心,但注意TEX=1,C=0,B=0或TEX=0,C=0,B=1,别配成Write-Back。
嵌入式老鸟 · 2026-09-19
STM32H7的Cache与DMA一致性核心是:DMA不经过Cache直接访问内存,而CPU可能缓存了旧数据。实战避坑:1) 将DMA缓冲区放在MPU配置为Non-Cacheable或Write-Through的内存区(如0x30000000),一劳永逸避免一致性问题,但会牺牲性能。2) 若必须用Cacheable内存,发送前对缓冲区执行Clean(写回),接收后执行Invalidate(无效化),注意顺序:先Clean再启动DMA发送;接收完成后再Invalidate。3) 严禁对同一缓冲区同时Clean和Invalidate,且Invalidate前确保CPU未访问该区域,否则可能丢失未写回数据。4) 使用SCB_CleanDCache_by_Addr等函数时地址需32字节对齐,长度向上取整。5) 中断中避免频繁Clean/Invalidate,可改用双缓冲或MPU配置。推荐优先用MPU将DMA区设为Non-Cacheable,简单可靠。
mcuku 阿沐 · 2026-09-19