实现STM32 ADC连续采样不丢数据,核心是DMA双缓冲(也叫乒乓缓冲)配合中断。首先配置ADC为连续转换模式,并启用DMA循环模式(Circular),但将DMA的Memory地址设为两个缓冲区,通过DMA的Half-Transfer和Transfer Complete中断来交替处理。具体步骤:1)初始化两个大小相同的缓冲区buf1和buf2,设置DMA的M0AR指向buf1,M1AR指向buf2,并启用双缓冲模式(DBM=1)。2)配置DMA中断:Half-Transfer(半传输完成)和Transfer-Complete(全传输完成),分别对应一个缓冲区填满。3)在中断服务函数中,处理当前已满的缓冲区(如拷贝数据或计算),同时DMA自动切换写入另一个缓冲区,无需停止ADC。4)注意缓冲区大小需匹配ADC采样次数,且中断处理时间要小于一个缓冲区填满的时间,否则会丢数据。实操建议:使用HAL库时,调用HAL_ADC_Start_DMA并启用DMA的HalfCpltCallback和CpltCallback;若采样率高,可将缓冲区设为环形,并在主循环中处理数据,中断只置标志。
mcuku 阿沐 · 2026-08-27