訓(xùn)練題——按鍵部分
Author:Cherry_Ywj
1. 按鍵讀取
CubeMx 配置:
-
設(shè)置任意一 GPIO 口為
GPIO_Input -
上拉和下拉
這一步非常重要!如果你期望按鍵按下時(shí)是低電平,那么就需要上拉。如果沒(méi)有上拉,此時(shí)輸入引腳呈高阻態(tài),時(shí)而會(huì)檢測(cè)到高電平,時(shí)而會(huì)檢測(cè)到低電平。
HAL 庫(kù)相關(guān)函數(shù)
//讀取引腳狀態(tài),這里讀取的是PA0,高電平返回1,低電平返回0
int statue = HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0);
按鍵消抖
按鍵在按下的那一刻是不穩(wěn)定的,稱為抖動(dòng)

由于程序跑的很快,抖動(dòng)的過(guò)程中很有可能識(shí)別成了多次按鍵按下,就不是我們想要的效果。相應(yīng)的辦法就是消抖
-
軟件消抖
軟件消抖的方法很簡(jiǎn)單,就是檢測(cè)到按鍵按下時(shí),加個(gè)延時(shí)函數(shù),然后再檢測(cè)一次,延時(shí)函數(shù)往往不用太長(zhǎng),因?yàn)槎秳?dòng)的時(shí)間也很短
if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0)==0) { HAL_Delay(10); //延時(shí)10ms //再次檢測(cè)按鍵是否按下 if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0)==0) { ... } } -
硬件消抖
在按鍵兩端并聯(lián)一個(gè)電容即可,由于電容兩端的電壓不能突變,會(huì)消除按鍵按下帶來(lái)的抖動(dòng)

2. 外部中斷
外部中斷的最常見(jiàn)形式是硬件監(jiān)聽(tīng)一個(gè)引腳的信號(hào)狀態(tài),當(dāng)該引腳的電平發(fā)生翻轉(zhuǎn)時(shí),即出現(xiàn)上升沿或下降沿,觸發(fā)外部中斷并進(jìn)入中斷處理函數(shù)。用戶則可以在相應(yīng)的回調(diào)函數(shù)中進(jìn)行處理。
CubeMx 配置:
-
設(shè)置某一 GPIO 口為
GPIO_EXTIx模式 -
選擇電平觸發(fā)模式
如下圖所示,最常用的是紅色方框內(nèi)的三個(gè)模式:上升沿觸發(fā)、下降沿觸發(fā)以及上升沿下降沿都觸發(fā)。

注:這里和按鍵檢測(cè)一樣,也需要加上拉或者下拉。如果希望是下降沿觸發(fā),即由高電平變?yōu)榈碗娖接|發(fā)中斷,應(yīng)該選擇上拉電阻。
-
NVIC(嵌套向量中斷控制器)
在這里設(shè)置的是中斷優(yōu)先級(jí),一般說(shuō)來(lái),對(duì)于實(shí)時(shí)性要求越高的中斷,優(yōu)先級(jí)越高。
由于這里只有一個(gè)中斷,可以不管。
HAL 庫(kù)配置:
中斷觸發(fā)后,程序會(huì)進(jìn)入void EXTIx_IRQHandler(void),這里的 x 根據(jù)實(shí)際引腳有不同的數(shù)值。內(nèi)部有個(gè)HAL_GPIO_EXTI_IRQHandler(),該函數(shù)主要幫助我們清楚中斷標(biāo)志位等其他內(nèi)容,這樣我們就不需要考慮這些東西,只需考慮用戶需要做的事情。

現(xiàn)在,找到HAL_GPIO_EXTI_Callback(GPIO_Pin)的定義,發(fā)現(xiàn)前面有個(gè)__weak,我們需要對(duì)該函數(shù)重新定義一遍,就會(huì)覆蓋原本內(nèi)容。
/**
* 函數(shù)功能: 外部中斷回調(diào)函數(shù)
* 輸入?yún)?shù): GPIO_Pin:中斷引腳
*/
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
if(GPIO_Pin==KEY1_GPIO_PIN)
{
...
}
else if(GPIO_Pin==KEY2_GPIO_PIN)
{
...
}
}

浙公網(wǎng)安備 33010602011771號(hào)