onlycook 发表于 2025-8-14 15:56

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

用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);
          }
    }
}
}

小明的同学 发表于 2025-8-17 10:57

STM8没有新项目用了吧,毕竟arm的好用又便宜。
页: [1]
查看完整版本: STM8L052的GPIO口做输入检测,为什么不能反应管脚实际电压变化?