核心方案是采用DMA双缓冲(也叫乒乓缓冲)并配合传输完成中断,确保在DMA写入一个缓冲区时,CPU只读取另一个缓冲区。具体做法:配置DMA为循环模式,使能双缓冲(DMA_SxCR的DBM位置1),并设置两个内存地址(M0AR和M1AR)。在每个缓冲区传输完成中断(TC)中,切换当前活动缓冲区标志,并处理已满的缓冲区数据。为避免覆盖,务必在中断服务函数中先读取DMA的NDTR寄存器(或使用HAL的HalfTransfer和TransferComplete回调)确认当前DMA正在写入哪个缓冲区,再决定处理哪个。同时,建议将缓冲区大小设为ADC采样深度的整数倍,并确保CPU处理时间小于DMA填满一个缓冲区的时间。若抖动仍存在,可考虑增加缓冲区深度或使用FIFO(如DMA的FIFO模式)平滑突发。实操中,用示波器或逻辑分析仪验证采样时序,并适当调整中断优先级(高于其他非关键中断)以降低延迟。
mcuku 阿沐 · 2026-08-27