stm32设置外部中断,按键是否要去抖

转自 https://www.amobbs.com/thread-5627222-1-1.html?_dsign=7e90158f

如题,我的设置是:外部中断为下降沿模式,GPIO的输入为上拉模式的输入,中断响应为输出端反转状态———小灯亮灭。当按下按键后,理应产生一个下降沿,按一下灭灯,再按一下亮灯。  

但是现象是:有时候可以亮,但有时候按下去小灯状态不变。这个是什么原因,是否要进行去抖?
(初学者,用的野火的程序)
 

//中断响应函数
void EXTI9_5_IRQHandler(void)
{
        if(EXTI_GetITStatus(EXTI_Line5) != RESET) //确保是否产生了EXTI Line中断
        {
                // LED1 取反                
                GPIO_WriteBit(GPIOC, GPIO_Pin_3, 
                        (BitAction)((1-GPIO_ReadOutputDataBit(GPIOC, GPIO_Pin_3))));
                EXTI_ClearITPendingBit(EXTI_Line5);     //清除中断标志位
        }  
}
//中断初始化设置
static void NVIC_Configuration(void)
{
          NVIC_InitTypeDef NVIC_InitStructure;
  
          /* Configure one bit for preemption priority -优先级设置为第一级*/
          NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
        
         /***********注各个端口的引脚5 中断向量一样************************/ 
          /* 配置P[A|B|C|D|E]5为中断源 */
          NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQn;
          NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
          NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
          NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
          NVIC_Init(&NVIC_InitStructure);
}
//中断函数设置
void EXTI_PE5_Config(void)
{
        GPIO_InitTypeDef GPIO_InitStructure; 
        EXTI_InitTypeDef EXTI_InitStructure;

        /* config the extiline(PE5) clock and AFIO clock */
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE | RCC_APB2Periph_AFIO,ENABLE);
                                                                                                
        /* config the NVIC(PE5) */
        NVIC_Configuration();

        /* EXTI line gpio config(PE5) */        
          GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;       
          GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;         // 上拉输入
          GPIO_Init(GPIOE, &GPIO_InitStructure);

        /* EXTI line(PE5) mode config */
        GPIO_EXTILineConfig(GPIO_PortSourceGPIOE, GPIO_PinSource5); 
          EXTI_InitStructure.EXTI_Line = EXTI_Line5;                                                        //外部中断线的组合,应该是引脚号
          EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;                                     //一般就用这种中断模式
          EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;                                         //下降沿中断
          EXTI_InitStructure.EXTI_LineCmd = ENABLE;                                                        //中断使能
          EXTI_Init(&EXTI_InitStructure); 
                                
}

猜你喜欢

转载自blog.csdn.net/wofreeo/article/details/89086329