核心方案是采用DMA双缓冲的循环模式(Circular Mode)并配合中断标志位进行乒乓切换。首先,确保DMA配置为Memory-to-Memory或Peripheral-to-Memory,数据宽度与ADC输出对齐(如半字),并启用双缓冲(DBUF)功能,设置两个缓冲区地址为4字节对齐。在DMA传输完成中断中,通过读取DMA的NDTR寄存器或使用HAL库的XferCpltCallback和XferHalfCpltCallback来区分当前填充的缓冲区,切换时用标志位(如volatile uint8_t buf_index)记录当前有效缓冲区,并在主循环中仅处理非活动缓冲区。为避免指针错位,建议在中断中禁用DMA传输(或暂停),处理完数据后再恢复,同时确保ADC采样序列与DMA缓冲区大小匹配(如N通道×M次采样)。实操中,可增加一个CRC校验或起始同步字(如0xAAAA)在每帧数据头部,用于检测错位并自动重同步。最后,使用__disable_irq/__enable_irq保护缓冲区切换代码,防止竞争条件。
mcuku 阿沐 · 2026-08-27