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);
}
}
}
} STM8没有新项目用了吧,毕竟arm的好用又便宜。
页:
[1]