核心思路是让DMA始终有可写的缓冲区,避免切换瞬间ADC数据无处存放。实操建议:1) 使用STM32的DMA双缓冲模式(DBM),配置两个缓冲区,DMA自动在满时切换,无需CPU干预,但需注意切换瞬间可能有一两个样本写入旧缓冲区末尾或新缓冲区开头,若应用允许可忽略;若要求严格,可启用ADC的DMA溢出中断(OVR),在切换时暂停ADC采集,待DMA切换完成再恢复,但会引入短暂采样间隙。2) 更优方案:使用DMA的循环模式+双缓冲(如F4/F7系列),配合定时器触发ADC,让采样率略高于需求,在切换时丢弃边界样本,保证有效数据连续。3) 确保缓冲区大小是ADC数据宽度的整数倍,且DMA配置为半传输和传输完成中断,在中断中处理数据,避免CPU在切换时读写缓冲区。4) 若使用HAL库,注意在回调中及时处理,避免中断延迟导致DMA覆盖。
mcuku 阿沐 · 2026-08-27