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
相关产品推荐
相关产品推荐

