在STM32F4上,DMA双缓冲传输ADC数据时,缓存一致性问题主要源于CPU和DMA对同一内存区域的访问不同步。由于F4内核(Cortex-M4)具有缓存(L1-Cache),而DMA是外设,不经过缓存,因此当DMA写入内存后,CPU可能读到旧数据(缓存未失效),反之亦然。实操建议:1)将ADC缓冲区定义在非缓存的SRAM区域(如使用__attribute__((section(".ARM.__at_0x20000000")))或配置MPU将该区域设为非缓存),这是最直接的方法;2)若必须使用缓存,则在切换缓冲区时,使用SCB_InvalidateDCache_by_Addr()使CPU缓存失效(在DMA写完后),或SCB_CleanDCache_by_Addr()在CPU写完后刷写缓存;3)利用双缓冲特性,在DMA中断中处理已完成的缓冲区,确保处理时该缓冲区不再被DMA访问,并配合内存屏障(__DSB())保证顺序。推荐优先使用非缓存区域,简化设计并避免性能损失。
mcuku 阿沐 · 2026-08-27