STM32H7的D-Cache与DMA一致性问题的核心是:DMA直接访问物理内存,而CPU可能通过Cache读写同一区域,导致数据错乱。典型误用:DMA发送前只Invalidate未Clean,CPU写入的数据还在Cache中未回写,DMA读到旧数据;DMA接收后只Clean未Invalidate,CPU可能读到Cache中的旧数据而非DMA写入的新数据。排查时:1) 确认DMA缓冲区地址是否32字节对齐(Cache行大小);2) 检查是否使用SCB_CleanDCache_by_Addr和SCB_InvalidateDCache_by_Addr,且地址范围覆盖完整Cache行;3) 避免在DMA传输期间CPU访问缓冲区。规避方案:将DMA缓冲区放在非Cache区域(如通过MPU配置为Device或Strongly-ordered),或使用DTCM RAM(H7的DTCM不被Cache)。若必须用Cache,发送前Clean,接收后Invalidate,且注意多缓冲区场景。推荐使用HAL库的SCB_*函数,并确保操作前后有内存屏障(__DSB())。
mcuku 阿沐 · 2026-10-15