按键定时器消抖

定时器有两个概念:
1,超时时间:
2,时间到了之后的“处理函数”。
      可以在中断处理中,如定时 10ms 后处理确定按键值上报。
     产生中断
             在中断中加定时器,当遇到 A 中断时加一个 10ms 的定时器,过了 10ms 后就去执行“处理
     函数”(确定按键值上报)。因为机械的抖动会非常快,没等到 10ms 后的处理,这时因为                                                                    抖动又来了一个中断 B,这时中断 B 把之前的那个定时器修改了。所以 A 中断的定时器就取                                                                消了。最后又来了一个中断 C,同样会修改掉 B 中断的定时器。上图中是假设抖动时产生了                                                                 3 个中断,所以对于同一个“定时器”,最终中断 C 的定时器没有被修改,所以 10ms 后由中断                                                               C 的处理函数上报了按键值。最后这个 10ms 是从抖动 C 处开始。
             这样 3 个抖动的中断只会导致最后处理一个“上报按键值”(定时器过后的处理函数只会执
   行一次)。以上便是用定时器消除抖动的原理。
            因为是修改同一个定时器,所以前面的定时又取消,相当于把“闹钟”时间往后调整时,最
   终只要响一次闹铃。

 

 

 

使用

一、在入口函数中操作步骤

1、初始化定时器:init_timer(&buttons_timer);

2、设备定时器处理函数:buttons_timer.function = buttons_timer_function;

3、将定时器加到内核:add_timer(&buttons_timer);

当按下按键后--->到中断处理函数“buttons_irq()”中去。

二、在中断函数中操作步骤

  1、保存注册中断传进来的参数:  irq_pd = (struct pin_desc *)dev_id;
  2、修改定时器的超时时间为 10ms:mod_timer(&buttons_timer, jiffies+HZ/100);                                                                                     3、返回:return IRQ_RETVAL(IRQ_HANDLED);

三、在定时器处理函数中识别各类中断

四、在出口函数中进行注销

    del_timer(&buttons_timer);

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值