核心方案:采用ADC的DMA双缓冲(Half-Transfer/Transfer-Complete中断)时,切换瞬间丢失源于CPU在中断处理中读取/修改缓冲区指针的延迟。实操建议:1)使用DMA的循环模式(Circular Mode)配合双缓冲,让DMA自动回绕,避免手动切换;2)在中断中仅更新缓冲区索引(如使用环形队列),不直接操作DMA寄存器,确保切换在硬件层面原子完成;3)若必须手动切换,在DMA配置中启用FIFO(如ADC_InitStruct.DMAContinuousMode),并设置DMA的Burst模式,减少总线竞争;4)关键:将缓冲区大小设为2的幂次,并用指针取模运算,避免边界判断开销;5)若数据率极高,考虑使用ADC的注入组或定时器触发,分散采集负载。实测中,循环模式+环形索引可做到零丢失,但需确保中断优先级高于DMA传输完成事件。
mcuku 阿沐 · 2026-08-27