5 linux定時器消除按鍵抖動

2021-09-07 13:48:09 字數 1750 閱讀 6646

按鍵抖動,在我們按下的時候按鍵可能會發生抖動,如圖

我們的中斷是雙邊沿觸發的,假如我們按鍵發生了抖動,那麼就觸發了五次中斷,這對我們來說實際應用上來看。是非常不穩定的,我們有兩種解決方法,一種是硬體消抖,雖然我懂一些硬體,但我不想拿自己的弱處來改進它。那麼另一種就是是軟體消抖,這一聽就在我的水平範疇內,我們可以使用定時器消抖

1.定時器

1.1 定義乙個定時器結構體

static

struct timer_list buttons_timer;

timer_list結構體如下:

struct timer_list 

;

1.2 初始化定時器

init_timer

(&buttons_timer)

;

->1.2.1) 定義超時函式

buttons_timer. function= buttons_timer_ function;
這個超時函式等一下我們需要編寫

1.3 向核心加入乙個定時器

add_timer

(&buttons_timer)

;

到這一步我們定時器的初始化基本完成了,就差乙個超時函式沒寫,寫之前我們來看一下按鍵的中斷處理函式:
static irqreturn_t  buttons_irq (

int irq,

void

*dev_id)

//中斷服務函式

mod_timer(&buttons_timer, jiffies+hz/100);

當我們按鍵按下發生中斷的時候,會進入這個中斷函式,我們先不著急把電平值傳出去,因為可能按鍵還有抖動。我們在按鍵中斷服務函式裡面啟動定時器。怎麼啟用?

答:使用 mod_timer(&buttons_timer, jiffies+hz/100); 這個函式會更改我們定時器的超時時間。jiffies是啥?可以理解為電腦啟動到目前為止的時間,比如說我開機到現在是10秒,那麼這個jiffies就是10秒。hz是啥?乙個hz就是電腦的一秒。那麼這個函式就是把超時時間就是(當前時間 + 10ms)。

假設我們按下按鍵,這時進入中斷服務函式,把定時器超時時間變成(當前時間(假設是10s) + 10ms),

過了5ms,然後按鍵發生抖動了,我們又進入中斷處理函式,又把定時器超時時間變成(當前時間(10s+5ms) + 10ms)

實現超時函式
static

void

buttons_timer_function

(unsigned

long data)

else

ev_press =1;

/* 表示中斷發生了 */

wake_up_interruptible

(&button_waitq)

;/* 喚醒休眠的程序 */

}

在超時函式裡,很簡單,把key值傳遞出來,並喚醒read()。

這樣我們就實現了軟體消抖

使用定時器實現按鍵防抖動

button.c include include include include include include include include include include include include static struct class sixthdrv class static str...

Linux字元裝置驅動之定時器去抖動按鍵驅動

當按一次按健時,由於按健有反應時間 有抖動,可能按一次機器感應到幾次,防抖就是讓在按鍵正常反應時間內機器只感應一次按鍵效果,防止誤操作。當按鍵發生時產生中斷,在中斷服務程式中修改乙個定時器的定時時間為10ms,並從10ms開始重新計數。定時器時間到後產生定時器中斷,按鍵處理放在定時器中斷裡面。這樣當...

7 使用定時器去掉按鍵輸入中產生抖動

1.電路圖 2.linux核心中使用定時器的步驟static struct timer list timer 定義全域性的定時器 init timer timer 初始化定時器 buttons timer.function function 設定超時呼叫函式 buttons timer.expire...