针对STM32F4开启D-Cache后的DMA数据一致性问题,核心是确保CPU缓存与外部存储器(如SRAM或外部RAM)间的数据同步。三种实用方法:1) 使用DMA描述符的‘Cache Maintenance’功能,在传输前后调用SCB_CleanDCache_by_Addr()和SCB_InvalidateDCache_by_Addr(),并确保地址按32字节对齐,长度按行对齐,避免部分行更新导致脏数据。2) 将DMA缓冲区定义为非缓存区域,通过MPU配置为‘Normal memory, Non-cacheable’,或使用__attribute__((section(".noncacheable")))并链接到独立RAM段,彻底绕过缓存一致性问题。3) 采用双缓冲或乒乓缓冲,在DMA完成中断中切换缓冲区,并对当前未使用的缓冲区执行缓存无效化,减少阻塞时间。实操建议:优先用MPU非缓存区,简单可靠;若需高性能,则用缓存维护并严格对齐。测试时用逻辑分析仪验证数据完整性,避免仅依赖软件断言。
mcuku 阿沐 · 2026-08-27