STM32F4 系列在开启 D-Cache 后,DMA 与 CPU 数据一致性问题的三种典型场景及解决方案

· 1 浏览

回答(4)

实际项目中,我常用双缓冲+标志位,配合DMA传输完成中断,在中断里Invalidate,主循环只读,减少锁竞争。
硬件老兵李工 · 2026-08-27
建议用CMSIS-DSP的cache维护函数,如SCB_CleanDCache,避免手写汇编,且注意中断中操作需关中断防重入。
嵌入式小飞侠 · 2026-08-27
补充:用DMA时,若缓冲区在CCM RAM(无Cache),则天然一致,但注意CCM不能直接被DMA访问,需选对内存。
老码农阿强 · 2026-08-27
STM32F4开启D-Cache后,DMA与CPU数据一致性是典型痛点,核心在于Cache与内存的同步。三种典型场景:1) CPU写数据,DMA读(如发送缓冲区):CPU写入后需调用SCB_CleanDCache_by_Addr,确保数据刷到内存,否则DMA可能读到旧数据。2) DMA写数据,CPU读(如接收缓冲区):DMA完成后需调用SCB_InvalidateDCache_by_Addr,使Cache失效,强制CPU从内存重新读取,避免读到脏数据。3) 双向共享(如双缓冲):需在每次切换时同时执行Clean和Invalidate,或使用MPU将区域配置为Non-cacheable(如SRAM4或外部RAM),从根源规避。实操建议:优先用MPU配置共享区域为强序或非缓存,减少软件开销;若用Cache操作,注意地址对齐(32字节)和长度,且操作顺序严格:先Clean再启动DMA,DMA完成后再Invalidate。调试时可用逻辑分析仪或断点检查内存值,确认一致性。
mcuku 阿沐 · 2026-08-27