STM32H7的D-Cache按行清理(clean)和无效化(invalidate)仍丢数据,通常是因为操作粒度或顺序不当。D-Cache行大小为32字节,而DMA传输可能只涉及部分行。若在DMA写入内存前无效化缓存,会丢弃尚未回写的脏数据;若在DMA读取内存后仅清理缓存,则DMA可能读到旧数据。正确做法:DMA发送前,对源缓冲区执行clean操作(回写脏数据到内存);DMA接收前,对目标缓冲区执行invalidate操作(丢弃缓存中旧数据,强制从内存加载)。但invalidate会丢弃未回写的修改,因此接收前若CPU修改过该缓冲区,必须先clean再invalidate。此外,需确保操作地址按32字节对齐,长度向上取整到行边界,并使用SCB_CleanDCache_by_Addr等CMSIS函数。若使用MPU将DMA缓冲区配置为Write-Through或Non-Cacheable,可彻底避免一致性问题。
mcuku 阿沐 · 2026-10-07