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

STM32中使用DMA读取ADC1与ADC2,如何在回调中区分二者?

在STM32 HAL回调中区分ADC1和ADC2的方法

回调函数里的hadc参数就是区分不同ADC的核心——每个ADC外设(ADC1、ADC2)对应各自的ADC_HandleTypeDef句柄实例,你只需要判断传入的hadc指向的是哪个句柄,就能分别处理对应的转换结果。

以下是具体的实现代码(假设你已经定义了Val_1、Val_2变量,且项目中ADC1和ADC2的句柄分别为hadc1、hadc2):

uint16_t Val_1 = 0;
uint16_t Val_2 = 0;

void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc)
{
    // 匹配ADC1的句柄
    if (hadc == &hadc1)
    {
        // 读取ADC1的转换结果,更新Val_1
        // 若用DMA传输到缓冲区,可直接取缓冲区对应值,比如:Val_1 = adc1_dma_buf[0];
        Val_1 = HAL_ADC_GetValue(hadc);
    }
    // 匹配ADC2的句柄
    else if (hadc == &hadc2)
    {
        // 读取ADC2的转换结果,更新Val_2
        // 若用DMA传输到缓冲区,可直接取缓冲区对应值,比如:Val_2 = adc2_dma_buf[0];
        Val_2 = HAL_ADC_GetValue(hadc);
    }
}

注意事项

  • 要保证代码里的&hadc1、&hadc2和你项目中实际初始化的ADC句柄变量名完全一致,比如CubeMX生成的代码里默认就是hadc1、hadc2这类命名。
  • 如果是DMA循环模式,每次转换完成都会触发这个回调,上述逻辑同样适用。
  • 若配置了多通道扫描,DMA会把多个通道的结果按顺序存入缓冲区数组,这时要根据通道顺序读取对应索引的值。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 09:52:14