针对STM32F4开启D-Cache后的DMA一致性问题,核心是确保CPU和DMA访问同一物理内存时,缓存数据与内存同步。三种实用方案:1) 使用DMA描述符的‘Clean/Invalidate’操作,在DMA传输前后手动调用SCB_CleanDCache_by_Addr()和SCB_InvalidateDCache_by_Addr(),并确保地址按32字节对齐,长度按行对齐,这是最直接的方法,适合小数据块。2) 配置MPU将DMA缓冲区所在内存区域设为‘Non-cacheable’或‘Write-through’,避免缓存介入,适合高频DMA流(如ADC采样),但需注意性能损失。3) 使用双缓冲或Ping-Pong机制,交替使用两个缓冲区,一个用于DMA写入(CPU不访问),另一个用于CPU处理(DMA不访问),在切换时执行缓存维护,适合大数据量或实时性要求高的场景。实操建议:优先用方案1,因为改动小;若DMA速率高,用方案2;若内存充足,用方案3。务必在初始化时配置MPU和缓存策略,并测试边界条件。
mcuku 阿沐 · 2026-08-27