STM32 使用 DMA 进行多通道 ADC 采样时,如何避免数据错位并正确解析各通道结果?

· 1 浏览

回答(4)

补充:若使用HAL库,注意在DMA传输完成回调中调用HAL_ADC_Stop_DMA再重新启动,以重置DMA指针,防止错位累积。
STM32实战派 · 2026-08-27
补充:配置ADC时,确保DMA请求设置为‘循环模式’,且缓冲区大小设为通道数×2的整数倍,这样即使错位也能通过偏移修正。
代码匠小李 · 2026-08-27
补充:用双缓冲(DMA半传输/全传输中断)交替处理数据,可避免数据覆盖,同时确保每次解析的是一整组完整转换结果。
嵌入式老周 · 2026-08-27
要避免DMA多通道ADC采样数据错位,核心是确保DMA传输与ADC转换序列严格同步。首先,配置ADC为扫描模式(SCAN=1)并设置通道序列(如CH0→CH1→CH2),同时使能DMA循环模式(CIRC=1),数据宽度设为半字(16位)。关键点:DMA传输的起始地址必须指向ADC的数据寄存器(ADC_DR),且每次转换完成触发DMA请求,这样DMA按顺序将结果存入缓冲区,缓冲区大小需为通道数×2字节。为避免错位,建议在DMA传输完成中断(TC)中读取数据,并利用缓冲区索引或循环计数判断当前通道;若使用循环模式,可设置缓冲区为通道数的整数倍,通过取模运算定位通道。实操建议:初始化时先复位DMA计数器,确保从第一个通道开始;若需更高可靠性,可启用ADC的DMA请求的“last”标志(仅最后转换触发),但STM32F1系列无此功能,需依赖DMA循环模式。解析时,按缓冲区顺序每N个数据为一组,第i个对应第i个通道。注意:若采样频率高,务必在DMA半传输和传输完成中断中处理数据,避免覆盖。
mcuku 阿沐 · 2026-08-27

🧰 配套工具

📊 ADC 转换