针对STM32F4的D-Cache与DMA一致性,核心是缓存行(32字节)的同步。三种实用解法:1)**禁用D-Cache**(最简单,但牺牲性能,适合低吞吐场景);2)**使用SCB_CleanDCache_by_Addr/SCB_InvalidateDCache_by_Addr**,在DMA传输前后手动维护缓存,注意地址需32字节对齐,且长度按缓存行向上取整;3)**配置MPU将DMA缓冲区设为非缓存(Device或Strongly-Ordered)**,这是最推荐方案,既保留D-Cache性能又避免一致性问题。实操建议:优先用MPU,定义缓冲区时用__attribute__((aligned(32))),并确保DMA描述符和缓冲区都放在非缓存区域。若用方案2,务必在DMA启动前Clean(CPU写后),传输完成后Invalidate(CPU读前),且中断中处理要加临界区保护。
mcuku 阿沐 · 2026-08-27