OpenEdv-开源电子网

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

将按下消抖延时注销后出现奇怪的现象!

[复制链接]

86

主题

417

帖子

0

精华

高级会员

Rank: 4

积分
781
金钱
781
注册时间
2013-2-20
在线时间
0 小时
发表于 2013-2-24 16:16:27 | 显示全部楼层 |阅读模式

//外部中断15~10服务程序
void EXTI15_10_IRQHandler(void)
{
// delay_ms(10);//按下消抖
 if(!KEY0)
 {
  LED0 = !LED0;
 } 
 else if(!KEY1)
 {
  LED1 = !LED1;
 }
 EXTI->R = 1<<13;//清除LINE13上的中断标志位
 EXTI->R = 1<<15;//清除LINE13上的中断标志位
}
为什么注销按下消抖延时后,按KEY1,LED1就完全没反应了呢?但按KEY0,LED0还能工作,只是工作不稳定而已(抖动造成属正常)。
那个延时只是起消除按下抖动的作用啊,怎么会使按KEY1,LED1完全没反应了呢?

乐于思考,敢于请教;问人不累,诲人不倦!本人CSDN博客:http://blog.csdn.net/dcx1205 学习嵌入式的同学不要错过啊!
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-2-24 17:32:13 | 显示全部楼层
exit.c修改:
u8 cntx=0;
//外部中断15~10服务程序
void EXTI15_10_IRQHandler(void)
{
//delay_ms(10);    //消抖  
if(KEY0==0)      //按键0
{
  LED0=!LED0;
}else if(KEY1==0)//按键1
{
  LED1=!LED1;
cntx++;
}
EXTI->R=1<<13;     //清除LINE13上的中断标志位  
EXTI->R=1<<15;     //清除LINE15上的中断标志位  
}

main函数:

extern u8 cntx;
//注意,此代码还是无法进行SWD仿真!因为使用了中断,没法用普通的方法来考虑间歇复用SWD口! 
int main(void)
{
  Stm32_Clock_Init(9); //系统时钟设置
delay_init(72);     //延时初始化
uart_init(72,9600);  //串口初始化 
LED_Init();   //初始化与LED连接的硬件接口
EXTIX_Init(); //外部中断初始化
while(1)
{    
printf("OK:%d\n",cntx);
cntx=0;
delay_ms(1000);  
}  
}
得到结果:


结论:不是没进入中断,而是按KEY1的时候,进入中断的次数都是偶数次,所以出现了这种“无反应”的结果。

通过我给你解答的这个过程,希望你学会一些解决问题的基本方法。提高下自己解决问题的能力。

我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

86

主题

417

帖子

0

精华

高级会员

Rank: 4

积分
781
金钱
781
注册时间
2013-2-20
在线时间
0 小时
 楼主| 发表于 2013-2-24 17:50:48 | 显示全部楼层
嗯 这个方法 很好啊!不过还是不懂 进入中断的次数都是偶数次,所以出现了这种“无反应”的结果  这句话啊!
乐于思考,敢于请教;问人不累,诲人不倦!本人CSDN博客:http://blog.csdn.net/dcx1205 学习嵌入式的同学不要错过啊!
回复 支持 反对

使用道具 举报

86

主题

417

帖子

0

精华

高级会员

Rank: 4

积分
781
金钱
781
注册时间
2013-2-20
在线时间
0 小时
 楼主| 发表于 2013-2-24 18:58:35 | 显示全部楼层
我也用这个方法试过了,确实 按KEY1的时候,进入中断的次数都是偶数次 但这是什么原因啊?想不明白!
乐于思考,敢于请教;问人不累,诲人不倦!本人CSDN博客:http://blog.csdn.net/dcx1205 学习嵌入式的同学不要错过啊!
回复 支持 反对

使用道具 举报

86

主题

417

帖子

0

精华

高级会员

Rank: 4

积分
781
金钱
781
注册时间
2013-2-20
在线时间
0 小时
 楼主| 发表于 2013-2-24 19:03:02 | 显示全部楼层
我也用这个方法试过了,确实 按KEY1的时候,进入中断的次数都是偶数次 但这是什么原因啊?想不明白
我又测试了种方法:参红色字体!
 //外部中断15~10服务程序
void EXTI15_10_IRQHandler(void)
{
//delay_ms(10);    //消抖  
if(KEY0==0)      //按键0
{
  LED0=!LED0;
}else if(KEY1==0)//按键1
{
  LED1=!LED1; 
  delay_ms(1); //在这里加个延时后就不会出现原来的按key1没反应的情况了(key0、key1都有反应)
}
EXTI->R=1<<13;     //清除LINE13上的中断标志位  
EXTI->R=1<<15;     //清除LINE15上的中断标志位  
}
注意上面的delay_ms(1); !

什么原因不明白!!!! 

乐于思考,敢于请教;问人不累,诲人不倦!本人CSDN博客:http://blog.csdn.net/dcx1205 学习嵌入式的同学不要错过啊!
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-2-24 19:13:56 | 显示全部楼层
这个我也不明白了。。。呵呵。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

86

主题

417

帖子

0

精华

高级会员

Rank: 4

积分
781
金钱
781
注册时间
2013-2-20
在线时间
0 小时
 楼主| 发表于 2013-2-24 19:16:01 | 显示全部楼层
哎呀 别打击我啊!刘老师啊…………
乐于思考,敢于请教;问人不累,诲人不倦!本人CSDN博客:http://blog.csdn.net/dcx1205 学习嵌入式的同学不要错过啊!
回复 支持 反对

使用道具 举报

86

主题

417

帖子

0

精华

高级会员

Rank: 4

积分
781
金钱
781
注册时间
2013-2-20
在线时间
0 小时
 楼主| 发表于 2013-2-24 19:21:44 | 显示全部楼层
一定要帮我想明白啊!拜托……
乐于思考,敢于请教;问人不累,诲人不倦!本人CSDN博客:http://blog.csdn.net/dcx1205 学习嵌入式的同学不要错过啊!
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-7-22 12:18

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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