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