打印
[STM32F0]

按键去抖问题

[复制链接]
1021|18
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
viseng|  楼主 | 2017-5-20 13:59 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
pi, IO, gp, GPIO, TI
按键去抖程序如下: (实验时计划直接放进中断程序中
uint8_t KEY_Debounce(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
{
                assert_param(IS_KEY_GPIO_PORT(GPIOx));
                assert_param(IS_KEY_GPIO_PIN(GPIO_Pin));
                Delay_ms(20);
                if(GPIO_ReadInputDataBit(GPIOx,GPIO_Pin)        ==        0)
                {
                                while(GPIO_ReadInputDataBit(GPIOx,GPIO_Pin)        ==        0);
                                return 0;
                }
                else
                                return 1;
       
}
it.c文件的中断服务程序如下:
void EXTI4_15_IRQHandler(void)
{
//                if(EXTI_GetITStatus(EXTI_Line6) != RESET)
//                {
//                                if(KEY_Debounce(KEY_PORT,KEY1_PIN))
//                                                GPIO_WriteBit(GPIOA, LED1_PIN,
//                             (BitAction)((1-GPIO_ReadOutputDataBit(LED_PORT, LED1_PIN))));
//                                EXTI_ClearITPendingBit(EXTI_Line6);
//                }
       
                if(EXTI_GetITStatus(EXTI_Line7) != RESET)
  {
    GPIO_WriteBit(GPIOA, LED2_PIN,
                             (BitAction)((1-GPIO_ReadOutputDataBit(LED_PORT, LED2_PIN))));
    EXTI_ClearITPendingBit(EXTI_Line7);
  }
}
下半段未加去抖,按键亮灯没问题,上半段加了之后,两个按键都不行了。刚开始学,单步运行搞不清,请大侠帮忙先看看,谢谢
沙发
viseng|  楼主 | 2017-5-20 14:01 | 只看该作者
IO初始化如下:应该不是这里的问题,都去掉去抖程序,两个按键关联两个灯都能亮,加进去后,都不行,应该是去抖内的死循环出不来了。
void EXIT_KEY_Init(void)
{
                GPIO_InitTypeDef GPIO_InitStruct;
          EXTI_InitTypeDef EXTI_InitStruct;
          NVIC_InitTypeDef NVIC_InitStruct;
          /* config the extiline(PB0) clock and AFIO clock */
          RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);
          RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOF, ENABLE);
          
    /* Configyre P[A|B|C|D|E]0  NIVC  */
                NVIC_InitStruct.NVIC_IRQChannel = EXTI4_15_IRQn;
                NVIC_InitStruct.NVIC_IRQChannelPriority = 0x01;
                NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
                NVIC_Init(&NVIC_InitStruct);
       
                  /* EXTI line gpio config(PF6) */       
                GPIO_InitStruct.GPIO_Pin = KEY1_PIN;
          GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN;
                GPIO_InitStruct.GPIO_Speed = GPIO_Speed_2MHz;
    GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_UP; // 上拉输入
                GPIO_Init(GPIOF, &GPIO_InitStruct);
       
                /* EXTI line gpio config(PF6) */       
                GPIO_InitStruct.GPIO_Pin = KEY2_PIN;
          GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN;
                GPIO_InitStruct.GPIO_Speed = GPIO_Speed_2MHz;
    GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_UP; // 上拉输入
                GPIO_Init(GPIOF, &GPIO_InitStruct);

                /* EXTI line(PF6) mode config */
                SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOF, EXTI_PinSource6);
                EXTI_InitStruct.EXTI_Line = EXTI_Line6;
                EXTI_InitStruct.EXTI_Mode = EXTI_Mode_Interrupt;
                EXTI_InitStruct.EXTI_Trigger = EXTI_Trigger_Falling; //下降沿中断
                EXTI_InitStruct.EXTI_LineCmd = ENABLE;
                EXTI_Init(&EXTI_InitStruct);
               
                /* EXTI line(PF7) mode config */
                SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOF, EXTI_PinSource7);
                EXTI_InitStruct.EXTI_Line = EXTI_Line7;
                EXTI_InitStruct.EXTI_Mode = EXTI_Mode_Interrupt;
                EXTI_InitStruct.EXTI_Trigger = EXTI_Trigger_Falling; //下降沿中断
                EXTI_InitStruct.EXTI_LineCmd = ENABLE;
                EXTI_Init(&EXTI_InitStruct);
}

使用特权

评论回复
板凳
viseng|  楼主 | 2017-5-20 14:02 | 只看该作者
有高手帮忙看看吗,谢谢!!!

使用特权

评论回复
地板
yklstudent| | 2017-5-20 21:55 | 只看该作者
间隔20ms周期读取按键状态,第一次有效,间隔20ms后再读有效就表示按键有效,否则认为是抖动

使用特权

评论回复
5
51xlf| | 2017-5-20 22:55 | 只看该作者
             if(GPIO_ReadInputDataBit(GPIOx,GPIO_Pin)        ==        0)
                {
                                while(GPIO_ReadInputDataBit(GPIOx,GPIO_Pin)        ==        0);

这个if和while状态一样的。

使用特权

评论回复
6
i1mcu| | 2017-5-20 22:56 | 只看该作者
while(GPIO_ReadInputDataBit(GPIOx,GPIO_Pin)        ==        0);

你测量这个IO了吗

使用特权

评论回复
7
pmp| | 2017-5-20 22:57 | 只看该作者
中断不要添加延时

使用特权

评论回复
8
mmbs| | 2017-5-20 22:58 | 只看该作者
这个配置的IO不知道对不对。

使用特权

评论回复
9
51xlf| | 2017-5-20 22:58 | 只看该作者
             if(GPIO_ReadInputDataBit(GPIOx,GPIO_Pin)        ==        0)
                {
                                while(GPIO_ReadInputDataBit(GPIOx,GPIO_Pin)        ==        0);

不是应该检测松开按键吗?

使用特权

评论回复
10
i1mcu| | 2017-5-20 22:58 | 只看该作者
可能按键读取的数据电压不对。

使用特权

评论回复
11
pmp| | 2017-5-20 22:58 | 只看该作者
按键中断添加延时会造成程序混乱。

使用特权

评论回复
12
mmbs| | 2017-5-20 22:58 | 只看该作者
外部中断直接触发就可以

使用特权

评论回复
13
Lbsonggz| | 2017-5-21 11:23 | 只看该作者
被教材上严重误导的按键去抖,真的没有必要

使用特权

评论回复
14
viseng|  楼主 | 2017-5-22 09:04 | 只看该作者
Lbsonggz 发表于 2017-5-21 11:23
被教材上严重误导的按键去抖,真的没有必要

程序去抖,主要是看开发板上的按键没有加电容,没做硬件去抖。通常加了硬件去抖电路好些,但有些板特别是模块小板,硬件能省地方的尽量省地方,所以软件去抖还是挺常用的。

使用特权

评论回复
15
viseng|  楼主 | 2017-5-22 09:06 | 只看该作者
i1mcu 发表于 2017-5-20 22:58
可能按键读取的数据电压不对。

电压肯定是没问题的,用扫描的方式是正常的,就是一个去抖问题,开发板没有硬件去抖电路。

使用特权

评论回复
16
viseng|  楼主 | 2017-5-22 09:07 | 只看该作者
pmp 发表于 2017-5-20 22:58
按键中断添加延时会造成程序混乱。

有这个情况吗? 不过之前也没这么用,一般是在中断中置标志位,在主函数中去扫描...

使用特权

评论回复
17
viseng|  楼主 | 2017-5-22 09:09 | 只看该作者
问题解决了,在中断中置标志变量,然后在main的while中去扫描标志变量,只是想搞懂延时放在中断中引起的问题是什么原因?

使用特权

评论回复
18
viseng|  楼主 | 2017-5-25 00:01 | 只看该作者
看来这块人所有限,剩下只能先绕弯走,以后再看了

使用特权

评论回复
19
Brand2| | 2017-5-25 19:58 | 只看该作者
多次读取按键状态,状态一致,就是按键有效

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

44

主题

410

帖子

1

粉丝