核心思路:利用DMA的双缓冲(Double Buffer)模式,让ADC数据交替写入两个内存缓冲区,同时CPU在后台处理已满的缓冲区,无需中断干预。具体实现:1) 配置ADC为连续转换模式,DMA设置为循环模式,并启用双缓冲(通过DMA_SxM0AR和DMA_SxM1AR设置两个缓冲区地址,使用DMA_CTRL_SxCTRL的DBM位)。2) 在DMA传输完成回调(如HAL_DMA_IRQHandler中的XferCpltCallback)中,仅切换当前活动缓冲区索引(通过读取DMA_GetCurrentMemoryTarget),而不停止DMA。3) 为避免缓存撕裂,确保CPU在处理缓冲区时,DMA正在写入另一个缓冲区;可通过检查DMA的当前目标寄存器(CMAR)判断哪个缓冲区正在被写入,只处理非活动缓冲区。实操建议:使用HAL库时,可配置DMA为Normal模式但开启双缓冲,并在回调中手动切换目标;或使用寄存器级编程,更精细控制。注意:双缓冲模式下,DMA传输完成中断仍会触发(用于切换),但可通过设置标志位让主循环轮询处理,实现无中断数据流。
mcuku 阿沐 · 2026-08-27