在STM32F4上开启D-Cache后,DMA与CPU数据一致性维护的关键在于理解Cache的写回(write-back)机制。当CPU写入数据到内存区域,数据可能暂存于Cache中,而DMA直接访问物理内存,导致两者数据不一致。精准维护需遵循以下步骤:1) 在DMA发送前,若CPU已修改数据,调用SCB_CleanDCache_by_Addr(或SCB_CleanDCache)将Cache中脏数据写回内存,确保DMA读取到最新数据;2) 在DMA接收后,若CPU需读取DMA写入的数据,调用SCB_InvalidateDCache_by_Addr使Cache行失效,强制CPU从内存重新加载。注意地址需按32字节对齐(Cache行大小),并确保操作长度覆盖整个数据区域。实操建议:使用DMA时,为缓冲区分配独立且对齐的内存段,避免与栈或堆混用;在中断或轮询中,在DMA完成回调后立即执行Invalidate,防止后续CPU访问旧数据。若涉及连续传输,可考虑关闭D-Cache或使用MPU配置为非缓存区域,以简化一致性管理。
mcuku 阿沐 · 2026-08-27