坑哥在编写STML152K4的一个简单的按键输入中断时被迷惑了半天,做一个总结帮助后人填坑。
BUG坑现象
void key_init(void) {
GPIO_Init(POWER_KEY, GPIO_Mode_In_FL_IT);
EXTI_DeInit();
EXTI_SetPinSensitivity(EXTI_Pin_4, EXTI_Trigger_Falling);//下降沿触发
}
上面是一个按键外部中断初始化的代码,看似没什么问题。但是调试时候问题出现了,稍微碰一下按键中断在中断函数里不断进行触发,即使请了外部中断标志位 还是不停触发。通过调试发现需要在按键初始化前先关闭总中断 然后在开启总中断。
void key_init(void) {
disableInterrupts();
GPIO_Init(POWER_KEY, GPIO_Mode_In_FL_IT);
EXTI_DeInit();
EXTI_SetPinSensitivity(EXTI_Pin_4, EXTI_Trigger_Falling);
enableInterrupts();
}
通过上面配置,还是发现当IO配置成浮空输入时候因为没有固定的电平会经常误触发,因此建议使用IO配置成GPIO_Mode_In_PU_IT这种模式给予固定的上拉电平。
在看一下硬件上面的BUG问题
下面是客户的一个板子的原理图按键,我在实际使用时IO配置成输入上拉中断模式发现死活不能进入中断函数。后面经过分析问题出在了这个电阻上面,当IO配置成上拉模式时候此处电阻过大(可能客户为了低功耗不得而知)导致得不到低电平了。具体可以看下STM8L手册配置成IO上拉时官方给接电阻是多少,结合此处的电阻进行合理选择达到功耗最低。此处坑哥后来改成了4.7K可以正常使用。
坑哥在编写STML152K4的一个简单的按键输入中断时被迷惑了半天,做一个总结帮助后人填坑。
BUG坑现象
void key_init(void) {
GPIO_Init(POWER_KEY, GPIO_Mode_In_FL_IT);
EXTI_DeInit();
EXTI_SetPinSensitivity(EXTI_Pin_4, EXTI_Trigger_Falling);//下降沿触发
}
上面是一个按键外部中断初始化的代码,看似没什么问题。但是调试时候问题出现了,稍微碰一下按键中断在中断函数里不断进行触发,即使请了外部中断标志位 还是不停触发。通过调试发现需要在按键初始化前先关闭总中断 然后在开启总中断。
void key_init(void) {
disableInterrupts();
GPIO_Init(POWER_KEY, GPIO_Mode_In_FL_IT);
EXTI_DeInit();
EXTI_SetPinSensitivity(EXTI_Pin_4, EXTI_Trigger_Falling);
enableInterrupts();
}
通过上面配置,还是发现当IO配置成浮空输入时候因为没有固定的电平会经常误触发,因此建议使用IO配置成GPIO_Mode_In_PU_IT这种模式给予固定的上拉电平。
在看一下硬件上面的BUG问题
下面是客户的一个板子的原理图按键,我在实际使用时IO配置成输入上拉中断模式发现死活不能进入中断函数。后面经过分析问题出在了这个电阻上面,当IO配置成上拉模式时候此处电阻过大(可能客户为了低功耗不得而知)导致得不到低电平了。具体可以看下STM8L手册配置成IO上拉时官方给接电阻是多少,结合此处的电阻进行合理选择达到功耗最低。此处坑哥后来改成了4.7K可以正常使用。
举报