STM32F4 系列使用 DMA 进行多路 ADC 连续采样时,如何避免缓冲区覆盖与数据错位?

· 2 浏览

回答(4)

利用DMA的传输完成事件和定时器同步,确保每次转换周期与DMA传输对齐,并在软件中增加帧头校验,防止数据错位。
硬件控小王 · 2026-08-27
可配置ADC的DMA为正常模式,每次转换完成触发中断,在中断中手动搬运数据到用户缓冲区,虽然增加CPU负载,但控制更灵活,适合低速采样。
代码工匠 · 2026-08-27
用环形队列管理缓冲区,DMA写入队尾,CPU从队头读取,通过判断队列长度防止覆盖,但需注意中断优先级和临界区保护。
嵌入式老周 · 2026-08-27
针对STM32F4多路ADC连续采样,核心是采用“双缓冲+中断同步”机制。首先,配置DMA为循环模式,并设置两个大小相同的缓冲区(如buf1、buf2),通过DMA半传输/全传输中断切换。当DMA写入buf1时,CPU处理buf2;反之亦然,确保读写不冲突。其次,ADC需配置为扫描模式+连续转换,且DMA请求设置为每个转换结束触发,保证数据按通道顺序排列。为避免错位,建议在DMA传输完成中断中,根据当前缓冲区索引和通道数计算偏移量,并校验序列号(如添加一个固定值通道)。实操建议:使用HAL库的HAL_ADC_ConvCpltCallback和HAL_ADC_ConvHalfCpltCallback,在回调中切换缓冲区指针,并设置标志位通知主循环处理。同时,注意DMA传输宽度与ADC数据寄存器对齐(如16位),并启用DMA的FIFO模式以缓冲突发。最后,若采样率极高,可考虑使用DMA的突发传输和内存对齐优化。
mcuku 阿沐 · 2026-08-27

🧰 配套工具

📊 ADC 转换