问题描述
之前一直有想写博客的想法,因没有契机而迟迟没有行动起来,但这次本人在给自己做的F4小板子做测试时遇到一个奇葩的bug耽误了我好几个小时,我之所以称之为“奇葩的bug”,是因为一次按键事件竟然触发了单片机两次中断。
一、bug的提出
别急!问题一出来我知道你肯定很多想法,比方按键事件没有做好消抖处理,或者中断请求标志位没有被及时清零等。顺便说下,对于STM32芯片而言,如果中断请求标志没有被清零程序会卡死在中断服务程序里。诸如以上的疑点,我拿出以下几点实际情况来做解释。
- 按键有硬件消抖,并联了一个0.1uf的电容 ,实际用示波器测得波形比较好,并没有抖动产生误操作;
(图1)示波器时间单位为50ms/格,按下后松开时间大概是170ms
(图2)按键按下3次,产生3次下降沿触发条件实例
2. 相应代码展示:
下面展示按键配置代码 按键GPIO和NVIC配置
。
void EXTI_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
EXTI_InitTypeDef EXTI_InitStructure;
NVIC_Configuration();/* 配置 NVIC */
RCC_AHB1PeriphClockCmd(KEY1_INT_GPIO_CLK|KEY2_INT_GPIO_CLK,ENABLE);/*开启按键GPIO口的时钟*/
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE); /* 使能 SYSCFG 时钟 ,使用GPIO外部中断时必须使能SYSCFG时钟*/
/*******************KEY1 - PD3***********************/
GPIO_InitStructure.GPIO_Pin = KEY1_INT_GPIO_PIN;/* 选择按键1的引脚 */
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;/* 设置引脚为输入模式 */
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;/* 设置引脚上拉 */
GPIO_Init(KEY1_INT_GPIO_PORT , &GPIO_InitStructure); /* 使用上面的结构体初始化按键 */
SYSCFG_EXTILineConfig(KEY1_INT_EXTI_PORTSOURCE,KEY1_INT_EXTI_PINSOURCE);/* 连接 EXTI 中断源 到KEY1引脚 */
EXTI_InitStructure.EXTI_Line = KEY1_INT_EXTI_LINE;/* 选择 EXTI 中断源 */
EXTI_InitStructure.