You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

NUCLEO-G431KB开发板ADC+DMA配置后缓冲区全零、回调未触发问题求助

问题根因

  1. 外设初始化顺序错误:你当前代码中外设初始化顺序为MX_GPIO_Init() -> MX_ADC1_Init() -> MX_DMA_Init(),ADC初始化时需要绑定已完成配置的DMA句柄,此时DMA尚未初始化,导致ADC与DMA的关联逻辑失效,DMA无法接收ADC的传输请求,自然不会往缓冲区写数据,也不会触发传输完成中断。
  2. 缺少ADC校准步骤:STM32G4系列ADC启动前需要执行校准操作,否则可能出现采样值偏差,不过你轮询采样正常,该问题为次要影响因素。
  3. 关于回调函数的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 */

验证

修改完成后重新编译下载程序:

  1. 板载LD2灯会不停闪烁,说明DMA传输完成/半完成回调已正常触发
  2. 断点查看adc_buf数组,12位ADC参考电压为3.3V时,0.61V输入对应的采样值约为757,缓冲区数值会在该值附近正常波动。

内容的提问来源于stack exchange,提问作者klausDerRiese

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 03:27:03