STM32 使用 DMA 在双缓冲模式下传输 ADC 数据时,如何避免缓存一致性导致的采样数据错位?

· 1 浏览

回答(4)

补充:可以尝试将缓冲区放在DTCM或紧耦合内存(TCM)中,这些区域无缓存,可天然避免一致性问题,但需注意DMA是否支持访问。
硬件控阿飞 · 2026-08-27
补充:双缓冲切换时,建议在DMA传输完成回调中先停止DMA,处理数据后再重新启动,避免切换瞬间的竞争条件。
ADC小能手 · 2026-08-27
补充:若使用Cortex-M7内核,务必开启D-Cache的写回模式,并在DMA中断中先无效化缓存再读取数据,否则可能读到旧数据。
嵌入式老张 · 2026-08-27
在STM32双缓冲DMA传输ADC数据时,缓存一致性问题的核心在于CPU和DMA对同一内存区域的访问顺序不一致。首先,确保使用DMA的双缓冲模式时,两个缓冲区都定义在DMA可访问的内存区域(如SRAM),并避免使用带缓存(如Cortex-M7的D-Cache)的地址,若必须使用,需在切换缓冲区前调用SCB_InvalidateDCache_by_Addr()或SCB_CleanDCache_by_Addr()。其次,在DMA传输完成中断中,先读取DMA的当前缓冲区索引(如DMA_GetCurrentMemoryTarget),再处理非活动缓冲区数据,并确保在切换缓冲区前完成数据处理。最后,建议使用volatile修饰缓冲区指针,并启用DMA的FIFO模式(若支持)以对齐数据。实操中,可先验证缓冲区地址是否4字节对齐,避免因未对齐导致的数据错位。
mcuku 阿沐 · 2026-08-27

🧰 配套工具

📊 ADC 转换