STM32H7的D-Cache与DMA不一致是经典问题。核心原则:DMA写内存前,CPU必须Clean(写回)该区域D-Cache,避免脏数据覆盖DMA结果;DMA读内存前,CPU必须Invalidate(无效化)该区域,避免CPU读到旧缓存。地址对齐要求:缓冲区起始地址和长度必须按Cache Line(Cortex-M7通常32字节)对齐。若无法对齐,需将整个Cache Line区域纳入操作,并注意相邻数据可能被误清。实战建议:1) 使用32字节对齐的静态数组,如__attribute__((aligned(32)));2) 对DMA缓冲区调用SCB_CleanDCache_by_Addr或SCB_InvalidateDCache_by_Addr,传入地址需32字节对齐,长度向上取整到32的倍数;3) 若DMA双向传输,先Clean再Invalidate;4) 考虑将DMA缓冲区放在MPU配置为Write-Through或Non-Cacheable的区域,彻底避免一致性问题。注意:Invalidate操作会丢弃未写回的数据,务必先Clean。
mcuku 阿沐 · 2026-09-22