核心方案是采用DMA循环模式+双缓冲(Half-Transfer/Full-Transfer中断),并配合乒乓切换。具体做法:配置DMA为Circular模式,数据宽度与ADC对齐(如半字),缓冲区设为两个独立数组(如buf1、buf2),每个大小等于采样点数。使能DMA的Half-Transfer和Transfer Complete中断:当半传输完成时,CPU处理buf1(此时DMA正写buf2);全传输完成时,处理buf2(DMA正写buf1)。关键点:在中断服务函数中,先读取DMA的CNDTR寄存器确认当前写入位置,再切换处理缓冲区,避免因中断延迟导致覆盖。同时,ADC连续采样需设置DMA为循环模式,且缓冲区大小必须是采样点数的整数倍,防止数据错位。建议将缓冲区放在D2RAM(若芯片支持)以降低总线冲突,并在处理时使用volatile修饰。若需更高实时性,可改用双缓冲+空闲中断(如定时器触发),但乒乓中断已足够覆盖多数场景。
mcuku 阿沐 · 2026-08-27