OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 10252|回复: 12

昨天做原子哥的按键触发外部中断实验,发现问题,新手求解

[复制链接]

1

主题

13

帖子

0

精华

初级会员

Rank: 2

积分
69
金钱
69
注册时间
2014-4-5
在线时间
8 小时
发表于 2014-5-17 10:01:12 | 显示全部楼层 |阅读模式
5金钱
   首先例程的方法是存在BUG的(个人认为,不要拍我),因为轻触按键存在抖动,所以需要消抖。原子哥在按键按下的时候要了一个DELAY的延时是不够的,在按键松开的时候也是有一个抖动的,这里设置的方式是上(下)沿触发的方式,所以如果对按键松开的抖动不做处理的话就会存在多次进入中断的问题。
 可以在按键松开那里加个检测,稍微延时下。

 另外,如果采用定时器延时的方法会更好些,但是进入中断后不清除中断标志中断是要一直触发的,定时器貌似也是解决不好的(求解)。个人感觉,这里就是硬件消抖会比较好些,或者不要用按键去触发外部中断。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

120

主题

7878

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12012
金钱
12012
注册时间
2013-9-10
在线时间
427 小时
发表于 2014-5-17 11:45:18 | 显示全部楼层
从成本考虑,消抖动你是用硬件的还是用软件的?
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复

使用道具 举报

1

主题

13

帖子

0

精华

初级会员

Rank: 2

积分
69
金钱
69
注册时间
2014-4-5
在线时间
8 小时
 楼主| 发表于 2014-5-17 12:11:44 | 显示全部楼层
回复【2楼】Badu_Space:
---------------------------------
当然是软件……其实我主要想问的是:采用软件的方式,有没有更好的延时方式?就比如我上面说的定时器方式,不知可行不可行?对于32我也是刚学,硬件不是很清楚,请大哥不要抽我啊……
回复

使用道具 举报

120

主题

7878

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12012
金钱
12012
注册时间
2013-9-10
在线时间
427 小时
发表于 2014-5-17 12:15:26 | 显示全部楼层
回复【3楼】HARRY007:
---------------------------------
看你定时器方式是怎么做的咯
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复

使用道具 举报

1

主题

13

帖子

0

精华

初级会员

Rank: 2

积分
69
金钱
69
注册时间
2014-4-5
在线时间
8 小时
 楼主| 发表于 2014-5-17 12:27:31 | 显示全部楼层
回复【4楼】Badu_Space:
---------------------------------
在延时期间,外部中断的标志位是不清除的,请问这样的话中断是要一直触发的吗?
EXTI_ClearITPendingBit(EXTI_Line0);  //清除EXTI0线路挂起位
回复

使用道具 举报

0

主题

6

帖子

0

精华

新手上路

积分
27
金钱
27
注册时间
2014-5-17
在线时间
0 小时
发表于 2014-5-17 23:45:16 | 显示全部楼层
1.硬件RC去抖是必要的,按键本身抖动是微秒级的,用RC滤波

2.软件去抖是必要的,可以设置10ms或50ms,按键周期性扫描,比如说1ms扫一次,当检测到按键按下超过去抖时间才认为按下,释放也是同样的。
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-5-18 00:16:28 | 显示全部楼层
够用就好,你用我们的按键扫描程序,很多误动作么?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

11

主题

38

帖子

0

精华

初级会员

Rank: 2

积分
105
金钱
105
注册时间
2013-4-3
在线时间
2 小时
发表于 2014-5-18 10:36:24 | 显示全部楼层
刚开始做这个实验时,我也遇到过着个困惑。我用的mini版库函数,当时按键时会出现动作异常。表现为:按键时,灯的状态能翻转,但是松开按键后灯的状态又会翻转一次。
mini版的外部中断函数
void EXTI0_IRQHandler(void)
{
    delay_ms(10);    
   if(EXTI_GetITStatus(EXTI_Line0) != RESET)  
{   
LED0=!LED0;
LED1=!LED1;
}
EXTI_ClearITPendingBit(EXTI_Line0);  
}

后来参考战舰版的函数,修改了一下,就没有异常了
void EXTI0_IRQHandler(void)
{
    delay_ms(10);    
   if(KEY2==1)  //就是这里修改了
{   
LED0=!LED0;
LED1=!LED1;
}
EXTI_ClearITPendingBit(EXTI_Line0);  
}

我觉得按键时,松开按键后的抖动(出现下降或者上升沿),又会触发一次外部中断,
但是战舰版的if(KEY2==1),可以在按键松开抖动触发中断时,屏蔽不必要的动作
回复

使用道具 举报

1

主题

13

帖子

0

精华

初级会员

Rank: 2

积分
69
金钱
69
注册时间
2014-4-5
在线时间
8 小时
 楼主| 发表于 2014-5-22 16:05:44 | 显示全部楼层
回复【6楼】liujian1989:
---------------------------------
不好意思,这么久才回,这个方法我也想过。只是还有一点没有想明白,定时器去定时这个时间的时候,我中断是响应的,此时主函数中的其他任务不是还不能执行吗?
回复

使用道具 举报

1

主题

13

帖子

0

精华

初级会员

Rank: 2

积分
69
金钱
69
注册时间
2014-4-5
在线时间
8 小时
 楼主| 发表于 2014-5-22 16:10:03 | 显示全部楼层
回复【7楼】正点原子:
---------------------------------
恩恩,是的~翻转存在不稳定性~我用的MINI版本的库函数例程。我做了更改,效果改观了一些,只是采用的是delay代码延时的方法,在按键松开的时候也加了个延时判断(感觉方法不是很好。)
void EXTI15_10_IRQHandler(void)
{
   delay_ms(10);    //消抖  
 
    if(EXTI_GetITStatus(EXTI_Line13) != RESET)
{
  LED0=!LED0;
while( !KEY0 );
delay_ms(10);
}
 
     else if (EXTI_GetITStatus(EXTI_Line15) != RESET)
{
LED1=!LED1;
while( !KEY1 );
delay_ms(10);//方法不好
}
 EXTI_ClearITPendingBit(EXTI_Line13);  //清除EXTI13线路挂起位
 EXTI_ClearITPendingBit(EXTI_Line15);  //清除EXTI15线路挂起位

原子哥,见谅哈,我这个很水的
回复

使用道具 举报

1

主题

13

帖子

0

精华

初级会员

Rank: 2

积分
69
金钱
69
注册时间
2014-4-5
在线时间
8 小时
 楼主| 发表于 2014-5-22 16:12:35 | 显示全部楼层
回复【8楼】蚕陵:
---------------------------------
if(KEY2==1)  //就是这里修改了
采用上述的办法,松开的时候那个抖动可以消除吗?原理是怎么回事?我有些搞不明白了……谢谢了
回复

使用道具 举报

1

主题

13

帖子

0

精华

初级会员

Rank: 2

积分
69
金钱
69
注册时间
2014-4-5
在线时间
8 小时
 楼主| 发表于 2014-5-22 16:29:48 | 显示全部楼层
回复【8楼】蚕陵:
---------------------------------
哦哦,是不是这个意思,就是延时10MS后,直接判断是否松开按键(松开KEY==1,按下KEY==0),这样就跳过那个松手抖动了~
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-5-22 17:28:21 | 显示全部楼层
回复【10楼】HARRY007:
---------------------------------
试试寄存器版本的,我测试没什么问题哦.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-7-8 07:16

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表