核心思路:利用DMA双缓冲(也叫乒乓缓冲)配合定时器触发ADC,让DMA在两个缓冲区之间交替填充,同时CPU或主循环只处理非活动缓冲区,从而避免中断频繁打断采样。具体实操:1)配置ADC为连续扫描模式,触发源选定时器(如TIM1/8)的更新事件,确保采样率稳定;2)DMA设为循环模式,外设地址固定为ADC->DR,内存地址指向两个缓冲区(如buf1和buf2),数据宽度半字(16位),方向外设到内存;3)启用DMA的双缓冲模式(通过DMA_SxCR的DBM位,或使用HAL的HAL_DMAEx_MultiBufferStart函数),并设置两个内存地址;4)在DMA传输完成回调(或主循环轮询NDTR变化)中,切换当前处理缓冲区,但注意:双缓冲模式下,DMA会自动切换,无需手动干预,只需在回调中标记哪个缓冲区已满。关键点:为避免延迟,不要在每个采样点都进中断,而是等一个缓冲区填满(如256个样本)才触发一次中断,这样中断频率降低,且处理时间充裕。建议使用HAL库的HAL_ADC_Start_DMA配合HAL_DMAEx_MultiBufferStart,并注意缓冲区大小需为2的幂次,且对齐到32字节。
mcuku 阿沐 · 2026-08-27