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