OpenEdv-开源电子网

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

ucosii中按键中断延时怎么处理

[复制链接]

8

主题

42

帖子

0

精华

初级会员

Rank: 2

积分
113
金钱
113
注册时间
2013-12-21
在线时间
3 小时
发表于 2014-4-29 21:51:30 | 显示全部楼层 |阅读模式
大家好,我现在有一系统,共有八个按键,分别为PA0----PA8,其中PA0为开关机按键(PA4作为DAC输出)。ucosii已经移植运行成功,现在一直没有弄清楚,在ucosii中怎样进行按键的消抖处理。PA0---PA8都与对应的外部中断线连接,怎么在中断中进行按键的消抖,并且判断按键的长按与短按?谢谢!
我现在的思路是,在相应的按键中断中将对应的按键动作设置标志位,然后在程序中采用轮询的方式,再进行延时处理。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
发表于 2014-4-29 23:21:02 | 显示全部楼层
回复【楼主位】biyabc:
---------------------------------
和裸奔一样的处理方式.
延时判断就可以了.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

8

主题

42

帖子

0

精华

初级会员

Rank: 2

积分
113
金钱
113
注册时间
2013-12-21
在线时间
3 小时
 楼主| 发表于 2014-4-30 10:34:29 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
没有太明白,麻烦原子哥详解一下。
直接这样的流程:
void EXTI0_1_IRQHandler (void)
{
    OSIntEnter();
    清中断标志位;
    判断按键按下;
    延时处理;
    判断按键按下;
    发送按键有效标志位;
   OSIntExit();
}

void 按键处理函数(void)
{
    if(按键动作有效)
   执行相应功能;
}
ucos-ii在中断中能否调用OSTimeDly或者信号量类的系统函数?
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
发表于 2014-4-30 15:51:25 | 显示全部楼层
回复【3楼】biyabc:
---------------------------------
在中断里面,不要执行,可以让任务切换的操作,比如你说的OSTimeDly,就可以执行任务切换,所以不要去调用.

你可以单独开个任务,扫描按键就是了,这样多好?不用中断...
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

8

主题

42

帖子

0

精华

初级会员

Rank: 2

积分
113
金钱
113
注册时间
2013-12-21
在线时间
3 小时
 楼主| 发表于 2014-4-30 21:04:11 | 显示全部楼层
回复【4楼】正点原子:
---------------------------------
原子哥的意思是按键不用中断处理,直接专门建立一个按键扫描的任务来进行处理?
那在你的基础上,我可以这样来处理吧
void EXTI0_1_IRQHandler (void) 

    OSIntEnter(); 
    清中断标志位; 
    判断按键按下; 
    发送按键有效标志位; 
   OSIntExit(); 

然后在主程序中
void KEY_Scanf(void)
{
    if(标志1)
        {按键1去抖及处理函数}
    if(标志2)
        {按键2去抖及处理函数}
    ......
    ......
}
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
发表于 2014-4-30 23:30:36 | 显示全部楼层
回复【5楼】biyabc:
---------------------------------
直接在任务里面做,不是在中断里面做.
你这代码还是中断 啊....

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

使用道具 举报

10

主题

47

帖子

0

精华

初级会员

Rank: 2

积分
197
金钱
197
注册时间
2014-10-14
在线时间
23 小时
发表于 2014-11-18 16:10:11 | 显示全部楼层
mark!!
回复 支持 反对

使用道具 举报

0

主题

3

帖子

0

精华

新手入门

积分
23
金钱
23
注册时间
2014-12-25
在线时间
0 小时
发表于 2014-12-25 15:42:51 | 显示全部楼层
回复【4楼】正点原子:
---------------------------

不能执行任务切换的操作  但是像发送信号量,发送邮箱里也有任务调度,也不能在中断里调用?
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
发表于 2014-12-25 22:33:51 | 显示全部楼层
回复【8楼】zfchen819:
---------------------------------
貌似是不行。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

0

主题

3

帖子

0

精华

新手入门

积分
23
金钱
23
注册时间
2014-12-25
在线时间
0 小时
发表于 2015-1-12 15:38:31 | 显示全部楼层
回复【9楼】正点原子:
---------------------------------
发送信号量,发送邮箱是可以的;有任务切换的系统函数就不能在中断中调用,貌似不是这个理。。。。更像是中断中不能将任务挂起(从就绪表中删除);等待消息,延时源代码里好像都有限制。
回复 支持 反对

使用道具 举报

70

主题

6761

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
13108
金钱
13108
注册时间
2012-11-26
在线时间
3812 小时
发表于 2015-1-12 16:30:44 | 显示全部楼层
楼主不如放在一个task里用状态机扫描key
学无止境
回复 支持 反对

使用道具 举报

0

主题

11

帖子

0

精华

新手上路

积分
48
金钱
48
注册时间
2015-8-13
在线时间
4 小时
发表于 2016-8-25 14:48:13 | 显示全部楼层
原子哥的意思是用按键扫面的方式,但是如果还是用EXTI0_1_IRQHandler 这个,NVIC和EXIT的初始化和裸机是不是一样的呢?我现在用中断服务函数,按键IO的NVIC和EXIT都初始化了,结果不行,程序似乎检测不到中断。按键扫面就可以。
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-30 13:48

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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