在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