通過定時器完成防抖動的總結

2021-07-26 14:31:15 字數 991 閱讀 1409

由於按鍵是機械按鍵,裡面的金屬彈片在按下或鬆開的時候會發生抖動,在這樣的條件下按下一次就有可能發生多次中斷,為了解決這個問題,我們應該新增防抖動。

我們可以用定時器實現防抖動。假如按下一次產生了多次中斷,那麼在第一次中斷產生之後,呼叫中斷處理函式,在這裡面設定10ms之後執行某乙個操作,下次中斷再來,由於是同乙個定時器,定時器的值會清空然後再設定10ms之後執行那個操作,以此類推,直到最後乙個中斷到來之後才能滿足10ms之後執行操作。這樣,就可以完成防抖動。具體實現如下。

先定義乙個定時器

static struct timer_list buttons_timer;

並在驅動的入口函式裡完成對定時器的初始化:

init_timer(&buttons_timer);

buttons_timer.function = buttons_timer_function;

add_timer(&buttons_timer);

然後把所有應該在按鍵中斷裡做的事情轉移到定時器中斷裡,並在按鍵中斷裡新增一句

//把dev_id記錄下來

irq_pd = (struct pin_desc *)dev_id;

//設定10ms之後發生定時器中斷

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

在這裡面的jiffies是乙個系統定義的東西,每過乙個系統時鐘(10ms)之後jiffies 就會加1。hz的值是100 。以當前狀態jiffies為參照,當jiffies+100/100=jiffies+1,也就是jiffies變化一次(10ms)之後發生定時器中斷。當定時器中斷發生的時候,就進入到定時器中斷的處理函式static void buttons_timer_function(unsigned long data)。在這個函式裡所做事情就是按鍵中斷之前做的,唯一不同的是使用了儲存在irq_pd裡的dev_id,這裡的irq_pd是乙個全域性變數。

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

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

字元裝置驅動筆記 定時器防抖動(十)

1.定時器 1 超時時間 2 處理函式 include include include include include include include include include include include include static struct class sixthdrv class...

(3 5)乙個按鍵所能涉及的 定時器防抖動

author pinus creat on 2018 10 25 kernel linux 4.4.145 board jz2440 arm9 s3c2440 通過定時器完成防抖動的總結 除顫嗎。能看的應該都懂為什麼,微控制器上不也是常用什麼delay 或者也是定時器進行除顫嗎,避免誤觸唄。當按鍵發...