核心思路是让DMA在双缓冲间自动切换,并利用中断或标志位确保CPU只在当前非活动缓冲区被填充时读取另一块。具体做法:配置DMA的M0AR/M1AR指向两个缓冲区,开启循环模式(Circular)和传输完成中断(TC)。在中断服务函数中,通过读取DMA的NDTR寄存器或检查CR寄存器的CT位(当前目标)判断哪个缓冲区刚被填满,然后只处理另一个缓冲区。为避免覆盖,务必在中断里快速拷贝数据或置标志,且主循环中处理数据前先禁用DMA(或使用半传输中断配合乒乓策略)。实操建议:将缓冲区大小设为ADC采样次数整数倍,并启用DMA的FIFO(若支持)以平滑突发;若采样率极高,可考虑双缓冲+半传输中断(HT)实现四段流水,但需确保ISR执行时间远小于填充周期。
mcuku 阿沐 · 2026-08-27