如题,我的设置是:外部中断为下降沿模式,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);
-
- }
复制代码
完全不建议在中断中加延时处理,当然如果MCU只做这件事或只做很少的事问题是不大。其实按键扫描的程序只要放在while中保证一定时间能扫到即可。
放在主循环里,采用状态机扫描,连延时都省了,基本不消耗资源
加了多大的电容?
随便抄了一个1000pf 的,这也有关系吗
一周热门 更多>