OpenEdv-开源电子网

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

stm32外部中断出现BUG

[复制链接]

7

主题

15

帖子

0

精华

初级会员

Rank: 2

积分
112
金钱
112
注册时间
2014-9-19
在线时间
4 小时
发表于 2014-10-25 11:25:08 | 显示全部楼层 |阅读模式
5金钱
最近用stm32的外部中断写了做了一个按键程序,中断选择的是下降沿中断触发方式,当程序识别一次下降沿之后,按键值加1,然后清楚中断标志位。
问题是,当程序进入中断后,跳不出中断。现象是,按键按正常按一次,值加1,但是如果按键按的比较慢时,可能加好几个值。
GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_7;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  GPIO_Init(GPIOA, &GPIO_InitStructure);

EXTI_InitStructure.EXTI_Line=EXTI_Line6|EXTI_Line7;
  EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
  EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
  EXTI_InitStructure.EXTI_LineCmd = ENABLE;
  EXTI_Init(&EXTI_InitStructure);

void EXTI9_5_IRQHandler(void)
{
delay_ms(200);    //消抖  
if(tmp==9999)
  tmp=9999;
else   tmp++;           
EXTI_ClearITPendingBit(EXTI_Line7);   
}


最佳答案

查看完整内容[请看2#楼]

不怎么懂。两点看法: 1.消抖时间不用那么长吧 2.进中断处理得先判断中断类型产生没不?然后先清中断,再处理别的。
做自己喜欢做的事
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

81

主题

1002

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1876
金钱
1876
注册时间
2014-9-10
在线时间
208 小时
发表于 2014-10-25 11:25:09 | 显示全部楼层
不怎么懂。两点看法:
1.消抖时间不用那么长吧
2.进中断处理得先判断中断类型产生没不?然后先清中断,再处理别的。
小小蜗牛
回复

使用道具 举报

1

主题

26

帖子

0

精华

初级会员

Rank: 2

积分
62
金钱
62
注册时间
2014-9-29
在线时间
0 小时
发表于 2014-10-25 11:51:38 | 显示全部楼层
去抖时间过长,一般物理按键在15ms比较合适然后配合如下的判断.

void xxx()
{
 if(KeyPress!=0xff)                      //判断是否有按键按下11111111B,按键按下后管脚端口电平会被拉低,8个独立键盘就会呈现非11111111B状态。
   {
    DelayMs(10);                         //跳过抖动
    if(KeyPress!=0xff)                 //此为跳过抖动后判断按键状态
   {
    keyvalue=KeyPress;     //传递值给中间量
    while(KeyPress!=0xff); //判断哪个按键按下
switch(keyvalue)
{
 case 0xfe:return 1;break;
 case 0xfd:return 2;break;
 case 0xfb:return 3;break;
 default:return 0;break;
}
  }
   }
}
回复

使用道具 举报

120

主题

7878

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12012
金钱
12012
注册时间
2013-9-10
在线时间
427 小时
发表于 2014-10-25 13:47:21 | 显示全部楼层
我一般10ms消抖
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复

使用道具 举报

7

主题

15

帖子

0

精华

初级会员

Rank: 2

积分
112
金钱
112
注册时间
2014-9-19
在线时间
4 小时
 楼主| 发表于 2014-10-25 14:24:51 | 显示全部楼层
回复【3楼】oser:
---------------------------------
谢谢您能回复!
1.我之前消抖也用的是15ms,但是这样按一下按键,会加好几个值
2.您回复的那段程序是用扫描的方式写的,这种方式特别占用CPU的时间,我现在主要是想用中断写,问题是,程序进了中断出不来
做自己喜欢做的事
回复

使用道具 举报

1

主题

26

帖子

0

精华

初级会员

Rank: 2

积分
62
金钱
62
注册时间
2014-9-29
在线时间
0 小时
发表于 2014-10-27 09:27:04 | 显示全部楼层
回复【5楼】请叫我小白:
---------------------------------
用中断的话,你把这句放到最前面EXTI_ClearITPendingBit(EXTI_Line7)。因为进入中断后就可以清除中断标志了,终端内的代码一样会被执行一遍。

void EXTI9_5_IRQHandler(void)
{
EXTI_ClearITPendingBit(EXTI_Line7);   //这个放前面调试下试试
delay_ms(200);    
if(tmp==9999)
  tmp=9999;
else   tmp++;         //如果tmp初值为0的话 tmp++; 可能要延时14ms呢

}
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-29 21:37

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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