核心方案:采用DMA双缓冲(半传输/全传输中断)配合乒乓切换,确保CPU处理一个缓冲时DMA写入另一个。具体操作:1) 配置DMA为循环模式,使能半传输和传输完成中断;2) 在中断服务函数中,先读取DMA->NDTR或使用HAL的HalfCpltCallback/FullCpltCallback,立即切换当前活动缓冲(通过修改DMA的M0AR/M1AR或使用双缓冲模式下的CT位);3) 处理数据时,使用volatile标志位防止中断重入,并在主循环中处理数据,避免在中断中做耗时操作。关键点:确保DMA传输速度低于CPU处理速度,否则仍会覆盖;若中断频率过高,可考虑在中断中仅置标志,主循环轮询处理。另外,使用HAL库时,注意在回调中先调用HAL_ADC_Stop_DMA再重新启动(若需重配),或使用LL库直接操作寄存器减少延迟。
mcuku 阿沐 · 2026-08-27