??1.STM32中GPIO口模式
每個(gè)GPI/O端口有兩個(gè)32位配置寄存器(GPIOx_CRL, GPIOx_CRH),兩個(gè)32位數(shù)據(jù)寄存器(GPIOx_IDR和GPIOx_ODR),一個(gè)32位置位/復(fù)位寄存器(GPIOx_BSRR),一個(gè)16位復(fù)位寄存器(GPIOx_BRR)和一個(gè)32位鎖定寄存器(GPIOx_LCKR)。根據(jù)數(shù)據(jù)手冊中列出的每個(gè)I/O端口的特定硬件特征, GPIO端口的每個(gè)位可以由軟件分別配置成多種模式。
─ 輸入浮空
─ 輸入上拉
─ 輸入下拉
─ 模擬輸入
─ 開漏輸出
─ 推挽式輸出
─ 推挽式復(fù)用功能
─ 開漏復(fù)用功能
每個(gè)I/O端口位可以自由編程,然而I/0端口寄存器必須按32位字被訪問 (不允許半字或字節(jié)訪問 )。 GPIOx_BSRR和 GPIOx_BRR寄存器允許對任何GPIO寄存器的讀/更改的獨(dú)立訪問;這樣,在讀和更改訪問之間產(chǎn)生IRQ時(shí)不會(huì)發(fā)生危險(xiǎn)。
本示例主要講解IO口輸入模式的應(yīng)用,以按鍵驅(qū)動(dòng)為例來實(shí)現(xiàn)輸入模式配置方法。本次實(shí)驗(yàn)所用開發(fā)板有3個(gè)按鍵,其中一個(gè)為復(fù)位按鍵,另外兩個(gè)則可用戶自行驅(qū)動(dòng)。我們采用板載的2個(gè)按鍵來實(shí)現(xiàn)對LED燈開關(guān)控制。
2.硬件接口
??SW2為復(fù)位按鍵,已直接接到芯片復(fù)位引腳上,SW3接在PB0上、SW4接在PB1上。按鍵按下均為低電平。
3.軟件設(shè)計(jì)
1.打開STM32CubmMX代碼生成軟件,將PB0、PB1配置為輸入模式。
2.在選定為輸入模式后,STM32輸入模式分為兩種:浮空輸入、上拉/下拉輸入。
─浮空輸入:配置為浮空輸入模式,初始化成功后引腳電平狀態(tài)處于中間態(tài),既不為高也不為低。
─上拉/下拉輸入:配置為浮空輸入模式,初始化成功后引腳電平狀態(tài)可以選擇是高電平或者低電平。
? 因?yàn)榘存I按下為低電平,因此要想檢測到按鍵狀態(tài)變化,初始化時(shí)就得設(shè)置為與按下相反的電平,所用我們這里選擇帶上拉的輸入模式(選擇浮空輸入也可,一般建議使用上拉輸入模式)。
4.生成配置代碼
??使用STM32Cubemx生成代碼時(shí),所有的GPIO初始化均會(huì)放gpio.c中。
-
在當(dāng)前工程的Core目錄下新建SYSTEM文件夾保存用戶自定義驅(qū)動(dòng)文件。
2.創(chuàng)建一個(gè)key.c和key.h文件,在SYSTEM目錄中創(chuàng)建一個(gè)KEY文件夾保存該文件
3.添加頭文件路徑,編寫key.h文件
4.編寫key.c文件,編寫按鍵檢測函數(shù)
u8 KEY_GetVal(void)
{
u8 static stat=0;
if((!KEY1 || !KEY2) && !stat)
{
stat=1;
HAL_Delay(30);
if(!KEY1)return 1;
else if(!KEY2)return 2;
else return 0;
}
else
{
if(KEY1 && KEY2)stat=0;
}
return 0;
}
5.實(shí)現(xiàn)按鍵控制LED開關(guān)
-
STM32
+關(guān)注
關(guān)注
2270文章
10900瀏覽量
356008 -
GPIO
+關(guān)注
關(guān)注
16文章
1204瀏覽量
52098 -
按鍵驅(qū)動(dòng)
+關(guān)注
關(guān)注
0文章
11瀏覽量
7133
發(fā)布評論請先 登錄
相關(guān)推薦
評論