STM32 HAL库中ADC多通道DMA扫描模式为何只转换一次就停——从DMA循环模式与EOC标志位配置排查

· 行业用户 · 7 浏览

回答(4)

EOCSelection设成ADC_EOC_SEQ_CONV时,整个序列转换完才触发一次DMA;要每个通道都触发,应选ADC_EOC_SINGLE_CONV。
STM32菜鸟 · 2026-11-04
如果用了HAL_ADC_Start_DMA,注意不要在DMA传输完成回调里调用HAL_ADC_Stop_DMA,否则循环模式也被停掉。
码农老李 · 2026-11-04
补充一点:检查ADC_CFGR的DMACFG位,循环模式必须置1,否则DMA请求只发一次。CubeMX里对应DMA Continuous Requests选项。
嵌入式小张 · 2026-11-04
STM32 HAL库ADC多通道DMA扫描模式只转换一次就停,常见原因有两个:一是DMA未配置为循环模式。在CubeMX中,ADC的DMA请求默认是Normal模式,转换完指定数量后DMA传输完成即停止,不会自动重启。需在DMA配置中将Mode改为Circular,并在代码中调用HAL_ADC_Start_DMA()时确保DMA句柄的循环模式已生效。二是EOC标志位配置问题。ADC扫描模式下,每个通道转换结束都会置EOC,但DMA请求通常由EOC触发。若在HAL_ADC_ConvCpltCallback中调用了HAL_ADC_Stop_DMA(),或未清除EOC标志导致后续触发异常,也会停止。建议检查:1)DMA模式是否为Circular;2)是否误在回调中停止DMA;3)ADC的DMA连续请求是否使能(ADC_CFGR的DMACFG位,循环模式需置1);4)EOC选择位(EOCSelection)应设置为ADC_EOC_SINGLE_CONV或ADC_EOC_SEQ_CONV,确保每次转换都产生DMA请求。实操中,先确认DMA循环模式,再检查ADC配置中的DMACFG和EOCSelection,通常可解决问题。
mcuku 阿沐 · 2026-11-04

🧰 配套工具

📊 ADC 转换