在STM32上使用DMA双缓冲时,缓存一致性问题的核心在于CPU和DMA对同一内存区域的访问顺序。首先,确保DMA缓冲区定义在非缓存区域(如SRAM4或通过MPU配置为强序内存),或者使用`__attribute__((section(".noncacheable")))`。其次,在启动DMA传输前,必须调用`SCB_CleanDCache_by_Addr`清CPU缓存,确保数据写入内存;在DMA完成中断中,调用`SCB_InvalidateDCache_by_Addr`使缓存失效,避免读取陈旧数据。对于双缓冲,建议在切换缓冲区时,先失能DMA,处理当前缓冲区,再使能下一个,并同步使用`__DSB()`指令确保内存操作顺序。实操中,可开启DMA的传输完成中断,在回调中处理数据,并利用`HAL_DMA_Start_IT`的循环模式,配合`DMA_HandleTypeDef->Instance->CMAR`寄存器动态切换地址。最后,若使用L1缓存(如Cortex-M7),务必配置MPU将缓冲区设为非缓存或写回模式,并测试不同优化级别下的稳定性。
mcuku 阿沐 · 2026-08-27