一. 按键消抖
在之前的 按键中断实验时,我们讲了如何使用中断的方式驱动按键或GPIO。如果通过中断的方式处理按键的话,按键是需要消抖处理的。
而在之前 按键中断实验中,在中断处理函数中对按键进行消抖,调用了 delay 延时函数。
但是,实际开发中,中断函数中不允许使用 delay 延时函数!!!
因为中断服务函数要快进快出!
按键消抖:通常的按键所用开关为机械弹性开关,当机械触点断开、闭合时,由于机械触点的弹性作用,一个按键开关在闭合时不会马上稳定地接通,在断开时也不会一下子断开。因而在闭合及断开的瞬间均伴随有一连串的抖动,为了不产生这种现象而作的措施就是按键消抖。
按键消抖的必要性:
为确保 CPU对键的一次闭合仅作一次处理,必须去除键抖动。在键闭合稳定时读取键的状态,并且必须判别到键释放稳定后再作处理。
二. 定时器按键消抖
本篇讲一下,按键既要用中断的方式驱动,同时,合理的实现一个按键的消抖处理。我们就使用EPIT定时器来实现按键消抖。这种方法也是 Linux内核中对按键的一个处理方式,Linux内核实现按键消抖也是用的这种方法。
上一章我们学习了
EPIT
定时器,定时器设置好定时时间,然后
CPU
就可以做其他事情去了,定时时间到了以后就会触发中断,然后在中断中做相应的处理即可。
因此,我们可以借助定时器来实现消抖,按键采用中断驱动方式。
当按键按下以后触发按键中断,在
按键中断中开启一个定时器,定时周期为
10ms
,当定时时间到了以后就会触发定时器中断,最
后在定时器中断处理函数中读取按键的值,如果按键值还是按下状态,那就表示这是一次有效的
按键。
下面通过实际举例说明:
这里,假如按键按下为下降沿触发。
因
此会在
t1
、
t2
和
t3
这三个时刻会触发按键中断,每次进入中断处理函数都会重新开器定时器中
断,
所以,会在
t1
、t2
和
t3
这三个时刻开器定时器中断。
但是
t1~t2
和
t2~t3
这两个时间段是小于我们设置的定时器中断周期(
也就是消抖时间,比如
10ms)
,所以虽然
t1
开启了定时器,但是定
时器定时时间还没到,
t2
时刻就重置了定时器,最终只有
t3
时刻开启的定时器能完整的完成
整个定时周期并触发中断。
我们就可以在中断处理函数里面做按键处理了,这就是定时器实现
按键防抖的原理。
Linux
里面的按键驱动用的就是这个原理!