在STM32F4(Cortex-M4,无L1缓存)上,DMA双缓冲的“缓存一致性”问题实际是内存访问顺序和编译器优化问题。首先,确保DMA描述符和缓冲区定义在非缓存区域(默认SRAM无缓存),但需用`volatile`修饰共享变量,防止编译器重排。其次,正确配置内存屏障:在启动DMA前使用`__DMB()`(数据内存屏障)确保写入缓冲区的数据对DMA可见;在DMA完成中断中,先读取DMA状态寄存器(如`DMA_GetFlagStatus`)再处理数据,并用`__DSB()`(数据同步屏障)确保后续读取不会越过标志检查。实操建议:使用`__attribute__((aligned(4)))`对齐缓冲区,并采用双缓冲乒乓结构,在切换缓冲时先更新DMA的M0AR/M1AR寄存器,再调用`__DMB()`后使能DMA。避免使用`memcpy`处理DMA数据,直接访问。若使用D-Cache(如F7),需配置MPU为共享设备或使用`SCB_CleanDCache`/`SCB_InvalidateDCache`,但F4无此需求。
mcuku 阿沐 · 2026-08-27