你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

请教专家,STM8L052的GPIO口做输入检测,为什么不能反应管脚实际电压变化?

[复制链接]
Andy-li 提问时间:2025-8-13 18:20 / 未解决

老产品维护遇到问题,向各位专家请教!

老产品使用STM8L052单片机,要增加一点功能,需要用GPIO口做外部开关状态检测,用IAR开发代码做验证,选择PG2做输入,分别设置为浮空输入、上拉输入模式;PG2管脚输入端加上高电压3.3v、低电压0v,但是发现的现象:

1.PG2管脚输入端电压的高低变化,但是读取的PG2输入状态不变化;

2.用IAR做debug时查看PG_DDR寄存器的值,DDR2值为0,确认PG2是输入状态;查看PG_IDR寄存器的值,IDR2值或为0或为1,不随PG2输入端电压的模拟而变化;

3.当PG2输入端电压是3.3v时,启动debug,IDR2值为1;当PG2输入端电压是0v时,启动debug,IDR2值为0。

补充一点:在网上搜索了好长时间,没有收获。DeepSeek说是要加GPIO口的时钟允许,语句如下:CLK_PeripheralClockConfig(CLK_Peripheral_GPIOG, ENABLE);

但是在stm8l15x_clk.h头文件里,这个函数的第一个形参的枚举类型数据,只有如:CLK_Peripheral_TIM1、CLK_Peripheral_USART1、CLK_Peripheral_SPI1等,不包含GPIO比如CLK_Peripheral_GPIOG。


附代码如下:

void LED1_Init()
{
  GPIO_Init(GPIOC , GPIO_Pin_0 , GPIO_Mode_Out_PP_Low_Fast);  //初始化指示LED
}

void KEY_Init()
{
  GPIO_Init(GPIOG , GPIO_Pin_2 , GPIO_Mode_In_PU_No_IT);     //初始化KEY,设置为上拉输入模式

}
void main()
{
  CLK_SYSCLKDivConfig(CLK_SYSCLKDiv_1); //设置内部时钟为1分频 = 16Mhz 作为系统时钟
  LED1_Init();   
  KEY_Init();   
  while(1)
  {                      
    if(GPIO_ReadInputDataBit(GPIOG , GPIO_Pin_2) == SET)
    {
      delay(10);          
      if(GPIO_ReadInputDataBit(GPIOG , GPIO_Pin_2) == SET)
      {
         delay(10);                                        
         GPIO_ResetBits(GPIOC , GPIO_Pin_0);  
      }
    }
    else
    {
       delay(10); 
       if(GPIO_ReadInputDataBit(GPIOG , GPIO_Pin_2) == RESET)
         {
             GPIO_SetBits(GPIOC , GPIO_Pin_0);
          }
    }
  }  
}
收藏 评论10 发布时间:2025-8-13 18:20

举报

10个回答
xmshao 回答时间:前天 09:03

STM8、或说平常的MCU的GPIO只能区分高低电平,不能直接测量模拟电压。要测量电压,需配合ADC功能,相关管脚配置为模拟输入。

Andy-li 回答时间:前天 10:10

xmshao 发表于 2025-8-14 09:03
STM8、或说平常的MCU的GPIO只能区分高低电平,不能直接测量模拟电压。要测量电压,需配合ADC功能,相关 ...

[md]感谢您的回答!是我表达欠清晰,这个不是测量模拟电压。做验证时,通过外部4.7K上拉电阻和接地导线,给PG2口输入的就是直流电压3.3V或者0V,高和低两种电压状态,但是单片机无法跟随识别高、低状态。

老牛洋车 回答时间:前天 14:05

Andy-li 发表于 2025-8-14 10:10
感谢您的回答!是我表达欠清晰,这个不是测量模拟电压。做验证时,通过外部4.7K上拉电阻和接地导线, ...

[md]引脚配置正确、引脚外部接了上拉电阻,按理不应该出现无法获得引脚电平的情况。会不会是此芯片的这个引脚已经损坏?

xmshao 回答时间:前天 14:41

Andy-li 发表于 2025-8-14 10:10
感谢您的回答!是我表达欠清晰,这个不是测量模拟电压。做验证时,通过外部4.7K上拉电阻和接地导线, ...

[md]检查下管脚配置,是否配置为输入了。有无其它误会,比方管脚搞错了?

butterflyspring 回答时间:前天 14:47
Andy-li 发表于 2025-8-14 10:10
[md]感谢您的回答!是我表达欠清晰,这个不是测量模拟电压。做验证时,通过外部4.7K上拉电阻和接地导线, ...

从最初问题描述的第三点发现上看,结论是正确的哦。

Debug 下看到了IO 高低的状态~~
Andy-li 回答时间:前天 15:20

butterflyspring 发表于 2025-8-14 14:47
从最初问题描述的第三点发现上看,结论是正确的哦。</p>
<p>Debug 下看到了IO 高低的状态~~

是的,您说的没错!PC0驱动的led灯辅助了判断,PG2只能在启动debug的时候读取判断输入口电压状态,后面就不行了。

换了新的备板测试,问题依旧,说明MCU没坏。这个看起来很入门级的问题,还真难住了

butterflyspring 回答时间:前天 17:29
Andy-li 发表于 2025-8-14 15:20
[md]是的,您说的没错!PC0驱动的led灯辅助了判断,PG2只能在启动debug的时候读取判断输入口电压状态,后 ...

您是说在调试下,观测结果正常。 运行时结果就不对了么?


Andy-li 回答时间:昨天 11:53

butterflyspring 发表于 2025-8-14 17:29
您是说在调试下,观测结果正常。 运行时结果就不对了么?

我是说,STM8L052刚启动能读取到PG2状态时,PC0驱动LED灯亮或灭,也是符合代码逻辑的。

butterflyspring 回答时间:昨天 16:10

Andy-li 发表于 2025-8-15 11:53
我是说,STM8L052刚启动能读取到PG2状态时,PC0驱动LED灯亮或灭,也是符合代码逻辑的。
...

那你后面是收到切换高低,然后看到LED的结果不对么?

如果是手动切换,要考虑软件去抖动。

对于按键信息指读取一次的话,是不太可靠的。

另外注意这个引脚要始终保持输入引脚模式,不要代码中间误动作修改了模式。

Andy-li 回答时间:2 小时前

butterflyspring 发表于 2025-8-15 16:10
那你后面是收到切换高低,然后看到LED的结果不对么?</p>
<p>

是的,就是因为看到led灯状态不对,所以才去查看IDR寄存器,发现寄存器数据不会跟随PG2的电压变化而变化。这个还不是抖动的问题,就算有抖动,稳定了也应该有变化。

从附录的代码可以看到功能非常简单。

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版