NUCLEO-G431KB开发板ADC+DMA配置后缓冲区全零、回调未触发问题求助
问题根因
- 外设初始化顺序错误:你当前代码中外设初始化顺序为
MX_GPIO_Init() -> MX_ADC1_Init() -> MX_DMA_Init(),ADC初始化时需要绑定已完成配置的DMA句柄,此时DMA尚未初始化,导致ADC与DMA的关联逻辑失效,DMA无法接收ADC的传输请求,自然不会往缓冲区写数据,也不会触发传输完成中断。 - 缺少ADC校准步骤:STM32G4系列ADC启动前需要执行校准操作,否则可能出现采样值偏差,不过你轮询采样正常,该问题为次要影响因素。
- 关于回调函数的legacy提示无需担心:默认配置下
USE_HAL_ADC_REGISTER_CALLBACKS宏未开启,重写HAL_ADC_ConvHalfCpltCallback和HAL_ADC_ConvCpltCallback的弱函数替换方式完全兼容可用,不会影响回调触发。
修复步骤
- 调整main函数中外设初始化顺序,将DMA初始化放到ADC初始化之前:
/* 初始化所有已配置的外设 */ MX_GPIO_Init(); MX_DMA_Init(); // 先初始化DMA MX_ADC1_Init(); // 再初始化ADC
- 在启动ADC DMA传输前添加ADC校准代码:
/* USER CODE BEGIN 2 */ // 执行ADC单端模式校准 if (HAL_ADCEx_Calibration_Start(&hadc1, ADC_SINGLE_ENDED) != HAL_OK) { Error_Handler(); } // 校准完成后启动ADC DMA传输 HAL_ADC_Start_DMA(&hadc1, (uint32_t*)adc_buf, ADC_BUF_LEN); /* USER CODE END 2 */
验证
修改完成后重新编译下载程序:
- 板载LD2灯会不停闪烁,说明DMA传输完成/半完成回调已正常触发
- 断点查看
adc_buf数组,12位ADC参考电压为3.3V时,0.61V输入对应的采样值约为757,缓冲区数值会在该值附近正常波动。
内容的提问来源于stack exchange,提问作者klausDerRiese
相关产品推荐
相关产品推荐

