核心思路:让DMA在定时器触发ADC转换的同时,利用双缓冲的“半传输/全传输”中断来切换缓冲区,但关键是要避免在切换瞬间发生数据撕裂。实操建议:1) 使用DMA的循环模式+双缓冲(DBM=1),配置两个缓冲区地址,使DMA在填满一半时自动切换,同时触发半传输中断(HT)和全传输中断(TC)。2) 在中断服务函数中,仅更新缓冲区索引(如current_buf ^= 1),不直接操作DMA寄存器,因为DMA硬件已自动切换,避免软件干预导致时序错位。3) 定时器触发ADC时,确保ADC的DMA请求与定时器更新事件同步:设置ADC为外部触发(如TIMx_TRGO),并将DMA请求设置为循环模式,这样每次触发转换后DMA自动搬运,无需软件干预。4) 若需精确对齐,可在定时器更新中断中设置一个标志,在DMA中断中检查该标志,确保缓冲区切换发生在触发后的同一周期内。5) 数据撕裂通常源于在DMA写入缓冲区时,CPU读取了未完成的数据,因此建议在HT/TC中断中处理数据,且处理时间要小于半个采样周期。实测中,将缓冲区大小设为2的幂次,并启用DMA的FIFO(阈值设为半满),可进一步减少抖动。
mcuku 阿沐 · 2026-08-27