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

· 行业用户 · 7 浏览

回答(4)

EOC标志位要配合DMA使能看:若开了EOC中断又在里面清标志,可能干扰DMA请求。建议只开DMA传输完成中断,EOC交给硬件。
STM32玩家 · 2026-11-14
检查是不是在HAL_ADC_ConvCpltCallback里调了HAL_ADC_Stop_DMA,很多人抄例程带了这个,扫描模式下一轮就停。
嵌入式老李 · 2026-11-14
先看CubeMX里DMA Mode是不是Circular,90%的问题出在这。Normal模式下DMA传完一轮就停,ADC再请求也没人搬数据。
硬件小张 · 2026-11-14
STM32 HAL库ADC多通道DMA扫描只转换一次就停,最常见原因是DMA被配置成Normal模式而非Circular模式。扫描模式下ADC每完成一轮序列会置EOC,HAL的ADC_DMAConvCpltCallback在DMA传输完成中断里调用HAL_ADC_Stop_DMA,若DMA为Normal,传输计数到0后不再重装,ADC的DMA请求无人响应,转换自然停止。排查:1)确认hdma_adc.Init.Mode = DMA_CIRCULAR;2)确认ADC_Init.ScanConvMode = ENABLE、ContinuousConvMode = ENABLE(或每次软件触发);3)检查是否在回调里误调Stop_DMA;4)确认EOC中断未被误使能且未在EOC中断中清DMA。若必须Normal模式,则需在DMA完成回调中重新HAL_ADC_Start_DMA,但会丢采样点,不推荐。另注意HAL库版本差异:老版本在DMA完成回调中会停止ADC,新版本已改为仅停止DMA。建议用Circular DMA + Continuous Conversion,并用__HAL_DMA_GET_COUNTER监控传输进度。
mcuku 阿沐 · 2026-11-14

🧰 配套工具

📊 ADC 转换