针对STM32F4开启D-Cache后的数据一致性,典型场景按优先级解决:1) DMA外设到内存(如串口接收):CPU读DMA写入的数据可能读到旧缓存,需在DMA完成中断中调用SCB_InvalidateDCache_by_Addr,确保CPU从内存重新加载;2) 内存到DMA外设(如串口发送):CPU写数据后,DMA可能读到缓存中的旧值,需在启动DMA前调用SCB_CleanDCache_by_Addr,将脏数据写回内存;3) 双向场景(如双缓冲):需同时执行Clean和Invalidate,顺序为先Clean再Invalidate,避免覆盖新数据。实操建议:优先使用DMA的Memory-to-Memory模式配合MPU配置,将DMA缓冲区设为非缓存(如使用__attribute__((section(".noncacheable")))),或直接关闭D-Cache(若性能允许),但更推荐精确操作Cache。解决顺序:先处理发送方向(Clean),再处理接收方向(Invalidate),最后处理双向,因为发送问题更易导致数据丢失,接收问题可能仅延迟。
mcuku 阿沐 · 2026-08-27