核心思路:用DMA双缓冲(也叫乒乓缓冲)配合ADC的连续转换模式,让DMA在两个缓冲区之间交替填充,同时CPU只处理已满的缓冲区,避免数据覆盖。具体操作:1) 配置ADC为连续扫描模式,触发源选定时器或软件连续触发;2) 初始化两个大小相同的数组,用DMA的循环模式(Circular)并设置M0AR和M1AR指向两个缓冲,使能DMA的传输完成中断(TC)和半传输中断(HT);3) 在中断服务函数中,根据当前DMA传输位置(通过读取NDTR或标志位)判断哪个缓冲已满,处理该缓冲,另一个继续接收。关键点:确保DMA传输宽度与ADC数据宽度一致(如16位),且缓冲区大小是采样点数的整数倍;处理缓冲时避免占用过长中断时间,建议用标志位+主循环处理。若用HAL库,可用HAL_ADC_Start_DMA并重写回调函数。不丢码的保障是DMA速度远快于ADC采样率,且双缓冲避免了单缓冲的覆盖风险。
mcuku 阿沐 · 2026-08-27