之前我們的按鍵程序沒有考慮抖動的情況。
按鍵按下的會有尖峰脈沖,常見的兩種消抖方式:
第一:硬件消抖
並聯一個電容,利用電容的充放電過程消抖。
第二:軟件消抖
一般的用法就是一個延時,在不是us、ns必爭的的場合,延時個幾毫秒(一般5-10ms)再讀取按鍵值就可以消除抖動了。
韋老師的方法是在按鍵中斷鍵值讀取之前加了一個10ms的定時器延時。
在按鍵中斷的服務函數中,開啟一個10ms的定時器,然后10ms定時器時間到了之后,再去讀取按鍵值。
這里主要學習幾個內核函數和幾個timer的概念。
上面的HZ是一個宏,HZ定義成多少我們不用關心,只用知道用HZ代表的單位是秒。所以HZ/100就是10ms的時間了。
jiffies是一個全局變量,它代表了內核的時基。
時間結構體是一個鏈表,暫時我只用關心怎么初始化里面的元素,怎么調用可以實現定時器,進階的待閱讀源碼。
定時器使用步驟:
1.先定義一個定時器的鏈表,然后初始化鏈表init_timer函數,給定時器回調函數賦值buttons_timer.function =XXX,添加定時器add_timer函數
2.需要更改定時器的值調用mod_timer函數
3.定時器時間到了之后,在定時器回調函數中執行想要的操作。