STM32F4 开启 D-Cache 后,DMA 与 CPU 的数据一致性是常见痛点。核心问题在于:DMA 直接访问物理内存(SRAM),而 CPU 通过 Cache 读写,两者可能看到不同数据。实用配置方法:1) 对 DMA 缓冲区,使用 `SCB_CleanDCache_by_Addr` 在 DMA 写入前(CPU→DMA)清 Cache,确保数据落回 SRAM;DMA 读取后(DMA→CPU)使用 `SCB_InvalidateDCache_by_Addr` 使 Cache 失效,强制 CPU 从 SRAM 重新加载。2) 更稳妥的方案是使用 MPU 将 DMA 缓冲区配置为 non-cacheable(如 `MPU_Region_Init` 设置 TEX=1, C=0, B=0),彻底避免一致性维护,但会牺牲性能。3) 内存屏障(如 `__DSB()` 和 `__DMB()`)用于保证操作顺序,尤其在 DMA 启动前和中断处理中,防止编译器或硬件乱序。实操建议:优先采用 MPU 配置关键缓冲区,对性能敏感区域用 Cache 维护函数,并确保缓冲区地址按 32 字节对齐(Cache line 大小)。
mcuku 阿沐 · 2026-08-27