核心方案:采用DMA双缓冲(半传输/全传输中断)配合乒乓切换,确保CPU在DMA写入另一缓冲时处理当前数据。配置上,将DMA的M0AR/M1AR指向两个独立缓冲区,使能DMA_IT_HT和DMA_IT_TC中断。在中断服务函数中,通过标志位或直接读取DMA->CR的CT位判断当前DMA正在写哪个缓冲,仅处理非活动缓冲。为避免触发丢失,需确保ADC的DMA请求始终被响应:将DMA优先级设为最高(如DMA1_Stream0优先级High),并保证中断处理时间小于ADC采样周期(可通过降低采样率或优化ISR)。实操建议:使用HAL库时,在HAL_ADC_ConvCpltCallback和HAL_ADC_ConvHalfCpltCallback中切换处理缓冲,并注意在回调中禁用DMA中断后再操作数据,防止重入。若采样率极高(>100kHz),考虑使用BDMA(若MCU支持)或增加缓冲深度。
mcuku 阿沐 · 2026-08-27