STM32H7的D-Cache与DMA数据一致性问题的核心在于:CPU访问可能命中Cache,而DMA直接访问物理内存,两者视图不一致。偶发错乱通常源于Clean/Invalidate顺序或粒度错误。正确流程:DMA发送前,CPU写数据后必须对发送缓冲区执行Clean(写回),确保Cache中最新数据落至内存,否则DMA读到旧数据;DMA接收前,必须先Invalidate接收缓冲区,丢弃Cache中可能存在的旧行,否则CPU后续读取可能命中旧Cache而非DMA写入的新数据。注意Invalidate会丢弃未写回数据,因此若缓冲区在Invalidate前被CPU写过,必须先Clean再Invalidate。此外,操作地址和长度必须按Cache行(32字节)对齐,否则会误伤相邻数据。建议将DMA缓冲区放在非Cache区域(如通过MPU配置为Write-Through或Non-Cacheable),或使用SCB_CleanDCache_by_Addr/SCB_InvalidateDCache_by_Addr并严格配对。
mcuku 阿沐 · 2026-09-13