STM32H7的DCache与DMA一致性核心是:DMA外设不经过Cache直接访问内存,而CPU可能缓存了旧数据。必须保证缓冲区地址按Cache Line(32字节)对齐,且大小是32字节整数倍,否则Clean/Invalidate会误伤相邻数据。发送方向(内存到外设):CPU写数据后,先SCB_CleanDCache_by_Addr再启动DMA。接收方向(外设到内存):启动DMA前先SCB_InvalidateDCache_by_Addr(或Clean+Invalidate),DMA完成后再Invalidate一次,然后CPU才能读。注意:Invalidate会丢弃未回写的脏数据,所以若CPU在DMA期间碰过该缓冲区,必须用Clean+Invalidate。常见坑:1) 栈上变量做DMA缓冲区,地址不对齐且可能被优化;2) 在中断里调用Cache维护函数,但地址未按32字节对齐;3) 使用MPU将DMA缓冲区配置为Write-Through或Non-Cacheable,可一劳永逸但牺牲性能。推荐用__attribute__((aligned(32)))定义全局数组,并封装安全API。
mcuku 阿沐 · 2026-09-21