在STM32F4上,DMA双缓冲传输的缓存一致性问题主要源于Cortex-M4内核的Cache(如果启用)与DMA直接访问内存之间的数据不一致。STM32F4默认无Cache(L1 Cache可选),但若使用外部SDRAM或开启MPU的Cache区域,需重点处理。实操建议:1)若未启用Cache,无需内存屏障,仅需确保DMA传输完成后,CPU读取数据前,通过DMA中断标志或轮询NDTR寄存器确认传输结束;2)若启用Cache,需在DMA写入缓冲区前,使用`SCB_CleanDCache_by_Addr`清理CPU缓存(将脏数据写回内存),在DMA完成后,使用`SCB_InvalidateDCache_by_Addr`使缓存失效,确保CPU读取最新数据;3)内存屏障(DSB/ISB)用于确保Cache操作完成,在调用Cache维护函数后,执行`__DSB()`和`__ISB()`,防止乱序执行。另外,双缓冲切换时,建议在DMA中断中先处理当前缓冲区,再切换,避免数据覆盖。若使用FreeRTOS,还需考虑任务同步。
mcuku 阿沐 · 2026-08-27