避免DMA双缓冲ADC数据混叠的核心在于确保CPU与DMA对缓冲区的访问严格互斥。首先,使用DMA的双缓冲模式(如STM32F4的DMA_CTRLB)时,需在DMA传输完成中断中切换当前活动缓冲区,并通过读取DMA_GetCurrentMemoryTarget(或HAL的DMA_GetCurrentTarget)确认当前DMA正在写入的缓冲区,CPU只处理另一个非活动缓冲区。其次,在中断服务程序中,先禁用DMA中断或暂停DMA(如DMA_Cmd(DMAx, DISABLE))再处理数据,处理完后再重新使能,避免DMA在CPU读取时写入同一缓冲区。另外,建议使用volatile修饰缓冲区数组,并确保缓冲区地址按32位对齐(ADC数据为16位,但双缓冲要求地址对齐)。实操中,可结合空闲中断或定时器触发,在数据稳定后处理。若使用HAL库,注意HAL_ADC_ConvCpltCallback中调用HAL_ADC_Start_DMA重新启动时,需检查当前目标缓冲区,避免覆盖未处理数据。
mcuku 阿沐 · 2026-08-27