STM32F401CB ADC读取电位器控制LED无响应故障排查
故障排查:STM32F401CB ADC读取电位器控制LED无响应
问题描述
基于STM32F401CB开发项目,目标是读取电位器值并控制LED亮灭,但无论何种情况LED均不点亮,推测无法读取电位器值。硬件采用PA0作为模拟输入、PB0作为通用输出;软件配置12位分辨率ADC,转换值存储在16位变量potentiometer_value中,通过read_adc函数读取。即使将判断条件设为potentiometer_value>0,LED仍无反应。
相关代码
#include "stm32f4xx.h" void rcc_config(void) { RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE); RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB,ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE); } void gpio_config(void) { GPIO_InitTypeDef gpio_init_struct; gpio_init_struct.GPIO_Mode=GPIO_Mode_AN; gpio_init_struct.GPIO_OType=GPIO_OType_PP; gpio_init_struct.GPIO_Pin=GPIO_Pin_0; gpio_init_struct.GPIO_PuPd=GPIO_PuPd_NOPULL; gpio_init_struct.GPIO_Speed=GPIO_Speed_2MHz; GPIO_Init(GPIOA,&gpio_init_struct); GPIO_InitTypeDef gpio_init_struct2; gpio_init_struct2.GPIO_Mode=GPIO_Mode_OUT; gpio_init_struct2.GPIO_OType=GPIO_OType_PP; gpio_init_struct2.GPIO_Pin=GPIO_Pin_0; gpio_init_struct2.GPIO_PuPd=GPIO_PuPd_NOPULL; gpio_init_struct2.GPIO_Speed=GPIO_Speed_2MHz; GPIO_Init(GPIOB,&gpio_init_struct2); } void adc_config(void) { ADC_CommonInitTypeDef adc_common_init_struct; adc_common_init_struct.ADC_DMAAccessMode=ADC_DMAAccessMode_Disabled; adc_common_init_struct.ADC_Mode=ADC_Mode_Independent; adc_common_init_struct.ADC_Prescaler=ADC_Prescaler_Div6; adc_common_init_struct.ADC_TwoSamplingDelay=ADC_TwoSamplingDelay_20Cycles; ADC_CommonInit(&adc_common_init_struct); ADC_InitTypeDef adc_init_struct; adc_init_struct.ADC_Resolution=ADC_Resolution_12b; adc_init_struct.ADC_DataAlign=ADC_DataAlign_Right; ADC_Cmd(ADC1,ENABLE); adc_init_struct.ADC_ContinuousConvMode=ENABLE; ADC_ContinuousModeCmd(ADC1,ENABLE); ADC_Init(ADC1,&adc_init_struct); ADC_RegularChannelConfig(ADC1,ADC_Channel_0,1,ADC_SampleTime_15Cycles); } uint16_t potentiometer_value; uint16_t read_adc() { ADC_SoftwareStartConv(ADC1); while(ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC)==RESET); return ADC_GetConversionValue(ADC1); ADC_ClearFlag(ADC1,ADC_FLAG_EOC); } int main(void) { rcc_config(); gpio_config(); adc_config(); ADC_ClearFlag(ADC1,ADC_FLAG_EOC); GPIO_ResetBits(GPIOB,GPIO_Pin_0); while (1) { potentiometer_value=read_adc(); if (potentiometer_value>0) { GPIO_SetBits(GPIOB,GPIO_Pin_0); } else { GPIO_ResetBits(GPIOB,GPIO_Pin_0); } } }
故障可能原因
- ADC初始化顺序错误:
adc_config中先调用ADC_Cmd(ADC1,ENABLE)再执行ADC_Init,正确流程应为先完成所有参数初始化,再使能ADC模块。 - EOC标志无法清除:
read_adc函数中ADC_ClearFlag语句写在return之后,永远不会执行,导致EOC标志持续置位,后续转换判断逻辑失效。 - 硬件连接问题:
- 电位器未正确连接到PA0与电源/地,导致模拟输入无有效电压
- LED回路缺少限流电阻或正负极接反,PB0输出无法驱动LED
- STM32的VREF+参考电压未正确配置(内部参考需确认启用,外部参考需检查接线)
- GPIO配置冗余:PA0配置为模拟输入时,
GPIO_OType和GPIO_Speed参数无效,虽不影响功能,但易造成混淆。 - ADC连续模式配置重复:同时通过
adc_init_struct和ADC_ContinuousModeCmd开启连续模式,建议统一配置方式。
内容的提问来源于stack exchange,提问作者Onur Yağcı
相关产品推荐
相关产品推荐

