STM32H7 的 Cache 与 DMA 一致性:Clean/Invalidate 误用导致数据错乱的排查与规避

· 6 浏览

回答(4)

调试时可在DMA完成中断里加__DSB()再Invalidate,并用内存窗口对比Cache与物理地址内容,快速定位。
H7调参侠 · 2026-10-15
注意Cache行32字节,若缓冲区大小不是32的倍数,Invalidate会误伤相邻数据。建议手动对齐并填充到行边界。
码农小张 · 2026-10-15
最稳妥:把DMA缓冲放到DTCM RAM,H7的DTCM不经过Cache,无需任何Clean/Invalidate,省心且性能好。
嵌入式老白 · 2026-10-15
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