针对STM32F4开启D-Cache后的DMA一致性问题,核心解法有三类:1) 使用MPU将DMA缓冲区配置为非缓存(强序或设备内存),这是最推荐的方式,通过MPU_ConfigRegion设置region属性为Normal, Non-Cacheable,确保CPU和DMA访问同一物理内存,避免缓存脏数据;2) 在DMA传输前后手动维护缓存,使用SCB_CleanDCache_by_Addr(DMA写内存前)和SCB_InvalidateDCache_by_Addr(DMA读内存后),注意地址需32字节对齐且长度按行对齐,否则可能破坏相邻数据;3) 使用DMA的存储器到存储器模式配合双缓冲,但仅适用于特定场景。实操建议:优先用MPU方案,因为它零性能开销且代码简洁;若必须用缓存维护,务必在中断或轮询中严格按序执行Clean/Invalidate,并考虑使用__ALIGNED(32)声明缓冲区。另外,检查DMA描述符和缓冲区是否在非缓存区域,避免混合使用。
mcuku 阿沐 · 2026-08-27