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

STM32编译报错:make Error 1,ADC HAL函数未定义如何解决?

解决STM32 ADC函数未定义的链接错误

错误原因

你遇到的是链接错误,而非编译错误。头文件stm32f1xx_hal_adc.h仅声明了HAL_ADC_Init等函数的接口,但链接器需要找到这些函数的实现代码(编译后的.o目标文件)才能生成可执行文件。当前工程的编译脚本未包含ADC相关的HAL库源文件,导致链接失败。

修复步骤

1. 确认CubeMX中已启用ADC外设

如果工程由STM32CubeMX生成:

  • 打开CubeMX加载工程配置,在「Pinout & Configuration」界面启用ADC1,并将PB0(ADC_IN8)配置为ADC输入模式。
  • 重新生成代码,CubeMX会自动将ADC相关源文件添加到编译脚本中。

2. 手动修改Makefile添加ADC源文件

若手动维护Makefile,找到SRC变量,添加以下两个源文件(路径根据工程结构调整):

SRC +=  \
Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_adc.c \
Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_adc_ex.c

添加后执行make clean && make重新编译工程。

3. 添加ADC的MSP初始化代码

在stm32f1xx_hal_msp.c中补充HAL_ADC_MspInit函数(CubeMX生成代码时会自动添加,手动维护需自行编写):

void HAL_ADC_MspInit(ADC_HandleTypeDef* hadc)
{
  GPIO_InitTypeDef GPIO_InitStruct = {0};
  if(hadc->Instance==ADC1)
  {
    /* ADC1时钟使能 */
    __HAL_RCC_ADC1_CLK_ENABLE();

    __HAL_RCC_GPIOB_CLK_ENABLE();
    /**ADC1 GPIO配置
    PB0     ------> ADC1_IN8
    */
    GPIO_InitStruct.Pin = GPIO_PIN_0;
    GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
    HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
  }
}

void HAL_ADC_MspDeInit(ADC_HandleTypeDef* hadc)
{
  if(hadc->Instance==ADC1)
  {
    /* 外设时钟禁用 */
    __HAL_RCC_ADC1_CLK_DISABLE();

    /**ADC1 GPIO配置
    PB0     ------> ADC1_IN8
    */
    HAL_GPIO_DeInit(GPIOB, GPIO_PIN_0);
  }
}

额外注意事项

  • 代码中telemetryData是字符串常量指针,直接用sprintf修改会触发未定义行为,建议改为数组:
    char telemetryData[32] = "0;300;20;30;40\n";
    
  • 当前ADC配置中ContinuousConvMode = DISABLE,意味着ADC仅执行一次转换。若需持续读取数据,要么在每次读取前调用HAL_ADC_Start(&hadc1),要么将ContinuousConvMode改为ENABLE。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 23:42:00