大家有什么好的外部中断按键去抖的方法吗??都快崩溃了。。。

2019-03-23 15:38发布

大家有什么好的外部中断按键去抖的方法吗??因为比赛的需要,要让输出步进可调,所以打算在外部中断里面改输出值,但是按键抖个不停啊,已经软件延时消抖了,还是抖啊。用的是stm32f407。
代码如下,有什么需要改的吗??
  1. void EXTI2_IRQHandler(void)
  2. {
  3.   EXTI->IMR&=~(1<<2);
  4.   if(GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_2)==0)         
  5.   {
  6.     delay_ms(30);
  7.     if(GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_2)==0)
  8.     {
  9.       vtg-=200;
  10.       DAC_SetVol(vtg);
  11.     }
  12.   }
  13.   EXTI_ClearITPendingBit(EXTI_Line2);  
  14.   EXTI->IMR|=1<<2;
  15. }
复制代码
此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
19条回答
zhaojun_xf
1楼-- · 2019-03-23 19:16
 精彩回答 2  元偷偷看……
Study_Stellaris
2楼-- · 2019-03-23 19:23
中断IO口设置有问题吧?
zqjqq88
3楼-- · 2019-03-23 20:14
一个按键给一个中断好浪费是说,在其他任务里面定时(比如100ms)查询一次多好
dontium
4楼-- · 2019-03-24 01:17
 精彩回答 2  元偷偷看……
jianping-sun
5楼-- · 2019-03-24 01:33
Study_Stellaris 发表于 2015-4-29 17:34
中断IO口设置有问题吧?

不是吧,帮忙看看呢。
  1. void Key_Init()
  2. {
  3.   GPIO_InitTypeDef GPIOC_InitStruct;
  4.   GPIOC_InitStruct.GPIO_Mode=GPIO_Mode_IN;
  5.   GPIOC_InitStruct.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3;
  6.   GPIOC_InitStruct.GPIO_PuPd=GPIO_PuPd_UP;
  7.   GPIOC_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
  8.   GPIO_Init(GPIOC,&GPIOC_InitStruct);
  9. }
复制代码
  1. void Exti_Init()
  2. {
  3.   NVIC_InitTypeDef NVIC_InitStruct;
  4.   EXTI_InitTypeDef EXTI_InitStruct;
  5.   RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);//使能SYSCFG时钟
  6.   SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOC, EXTI_PinSource0);
  7.   SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOC, EXTI_PinSource1);
  8.   SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOC, EXTI_PinSource2);
  9.   SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOC, EXTI_PinSource3);
  10.   
  11.   EXTI_InitStruct.EXTI_Line=EXTI_Line0|EXTI_Line1|EXTI_Line2|EXTI_Line3;
  12.   EXTI_InitStruct.EXTI_Mode=EXTI_Mode_Interrupt;
  13.   EXTI_InitStruct.EXTI_Trigger=EXTI_Trigger_Falling;
  14.   EXTI_InitStruct.EXTI_LineCmd=ENABLE;
  15.   EXTI_Init(&EXTI_InitStruct);
  16.   
  17.   NVIC_InitStruct.NVIC_IRQChannel = EXTI0_IRQn;//外部中断0
  18.   NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0x03;//抢占优先级3
  19.   NVIC_InitStruct.NVIC_IRQChannelSubPriority = 0x02;//子优先级2
  20.   NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;//使能外部中断通道
  21.   NVIC_Init(&NVIC_InitStruct);//配置
  22.        
  23.        
  24.   NVIC_InitStruct.NVIC_IRQChannel = EXTI1_IRQn;//外部中断1
  25.   NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0x03;//抢占优先级3
  26.   NVIC_InitStruct.NVIC_IRQChannelSubPriority = 0x02;//子优先级2
  27.   NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;//使能外部中断通道
  28.   NVIC_Init(&NVIC_InitStruct);//配置
  29.        
  30.        
  31.   NVIC_InitStruct.NVIC_IRQChannel = EXTI2_IRQn;//外部中断2
  32.   NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0x01;//抢占优先级1
  33.   NVIC_InitStruct.NVIC_IRQChannelSubPriority = 0x02;//子优先级2
  34.   NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;//使能外部中断通道
  35.   NVIC_Init(&NVIC_InitStruct);//配置
  36.   
  37.   NVIC_InitStruct.NVIC_IRQChannel = EXTI3_IRQn;//外部中断3
  38.   NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0x01;//抢占优先级1
  39.   NVIC_InitStruct.NVIC_IRQChannelSubPriority = 0x02;//子优先级2
  40.   NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;//使能外部中断通道
  41.   NVIC_Init(&NVIC_InitStruct);//配置
  42.   
  43. }
复制代码

jianping-sun
6楼-- · 2019-03-24 06:17
dontium 发表于 2015-4-29 17:51
楼主的 " 软件延时消抖 " 的延迟时间再调长一些。

估计要多长呢。。。

一周热门 更多>