在嵌入式系統(tǒng)開(kāi)發(fā)中,GPIO(通用輸入輸出端口)是實(shí)現(xiàn)硬件與軟件交互的關(guān)鍵組件。本節(jié)主要利用的時(shí)GPIO的輸入采集功能,本節(jié)的主要功能為,讀取板載按鍵,當(dāng)按鍵按下時(shí),對(duì)應(yīng)led亮起,抬起按鍵,對(duì)應(yīng)led熄滅。
硬件設(shè)計(jì)
評(píng)估板板載三個(gè)機(jī)械按鍵,分別接入MCU的PE10、PB4、PB3,當(dāng)按鍵按下時(shí),控制引腳通過(guò)按鍵接地,表現(xiàn)為低電平,當(dāng)按鍵抬起時(shí),io通過(guò)電阻連接到VCC,此時(shí)表現(xiàn)為高電平。
軟件設(shè)計(jì)
代碼分析
本節(jié)主要驗(yàn)證GPIO的輸入功能,所不同的是,在初始化gpio結(jié)構(gòu)體時(shí)需要將輸出配置為輸入。我們?cè)贐sp文件夾中新建key.c和key.h,在c文件中添加如下代碼:
- void User_KEY_Init()
- {
GPIO_InitTypeDef GPIO_InitStructure;
PLIC_InitTypeDef PLIC_InitStructure;
GPIOB_CLK_ENABLE();
GPIOE_CLK_ENABLE();
PLIC_CLK_ENABLE();
/ GPIOE Configure /
11. ```
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
13. ```
GPIO_InitStructure.GPIO_IType = GPIO_IPU;
GPIO_InitStructure.GPIO_OType = GPIO_Out_PP;
15. ```
GPIO_InitStructure.GPIO_OStrength = GPIO_OStrength_9mA;
GPIO_Init(GPIOE, &GPIO_InitStructure);
17.
18. ```
*/* GPIOB Configure */*
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4|GPIO_Pin_3;
20. ```
GPIO_Init(GPIOB, &GPIO_InitStructure);
PLIC_InitStructure.PLIC_IRQChannel = GPIOE_IRQn;
23. ```
PLIC_InitStructure.PLIC_IRQPriority = 1;
PLIC_InitStructure.PLIC_IRQChannelCmd = ENABLE;
25. ```
PLIC_Init(&PLIC_InitStructure);
PLIC_InitStructure.PLIC_IRQChannel = GPIOB_IRQn;
28. ```
PLIC_InitStructure.PLIC_IRQPriority = 2;
PLIC_InitStructure.PLIC_IRQChannelCmd = ENABLE;
30. ```
PLIC_Init(&PLIC_InitStructure);
/Clear Interrupt start state/
33. ```
GPIO_ClearITPendingBit(GPIOE, GPIO_Pin_10);
GPIO_ClearITPendingBit(GPIOB, GPIO_Pin_4|GPIO_Pin_3);
35. ```
*/*Config Interrupt trigger type*/*
GPIO_ITConfig(GPIOE, GPIO_Pin_10, GPIO_ITType_EDGEDOWN, ENABLE);
37. ```
GPIO_ITConfig(GPIOB, GPIO_Pin_4|GPIO_Pin_3, GPIO_ITType_EDGEDOWN, ENABLE);
- }
在本小結(jié)的例程中,我們采用IO中斷的形式讀取IO狀態(tài),PLIC的內(nèi)容在后邊會(huì)具體介紹,因此在此處只需要參考這個(gè)配置過(guò)程即可。
第10~20行為gpio輸入模式初始化,由于按鍵正常情況下接口表現(xiàn)為高電平,所以將接口配置為上拉輸入,可以保證接口穩(wěn)定。
第22~30行為中斷模塊配置,主要功能就是開(kāi)啟兩個(gè)IO端口的中斷。
第33~37行,在GPIO中需要配置中斷觸發(fā)模式,此處配置為GPIO_ITType_EDGEDOWN下降沿觸發(fā),在此之前最好清除一下中斷初始狀態(tài)。
接下來(lái)編寫(xiě)中斷處理函數(shù):
- void GPIOE_IRQ_Handler()
- {
- if(GPIO_GetITStatus(GPIOE, GPIO_Pin_10) == SET)
- {
key1_flag = 1;
*/*Clear Interrupt start state*/*
GPIO_ClearITPendingBit(GPIOE, GPIO_Pin_10);
- }
- }
- void GPIOB_IRQ_Handler()
- {
- if(GPIO_GetITStatus(GPIOB, GPIO_Pin_4) == SET)
- {
key2_flag = 1;
15. ```
*/*Clear Interrupt start state*/*
GPIO_ClearITPendingBit(GPIOB, GPIO_Pin_4);
17. }
18. if(GPIO_GetITStatus(GPIOB, GPIO_Pin_3) == SET)
19. {
20. ```
key3_flag = 1;
/Clear Interrupt start state/
22. ```
GPIO_ClearITPendingBit(GPIOB, GPIO_Pin_3);
- }
- }
AS32的中斷處理函數(shù)劃分相對(duì)ARM更細(xì),針對(duì)不同端口有不同的處理函數(shù),在這個(gè)函數(shù)中,我們首先調(diào)用GPIO_GetITStatus函數(shù)確定中斷源,之后置位按鍵狀態(tài)以便主程序中進(jìn)行處理。
最后我們編寫(xiě)主邏輯:
if(key1_flag)
{
key1_flag = 0;
printf("The key1 pressed!rn");
LED1_TOGGLE();
}
if(key2_flag)
{
key2_flag = 0;
printf("The key2 pressed!rn");
11. ```
LED2_TOGGLE();
- }
- if(key3_flag)
- {
key3_flag = 0;
16. ```
printf("The key3 pressed!rn");
LED3_TOGGLE();
18. }
主函數(shù)循環(huán)中添加上述代碼邏輯,主要功能就是當(dāng)按鍵按下時(shí),對(duì)應(yīng)led進(jìn)行一個(gè)亮滅翻轉(zhuǎn)。
此處需要說(shuō)明的是,如果不用中斷形式操作,那么我們?cè)诎讣跏蓟瘮?shù)中只需要保留GPIO_Init函數(shù)之前的內(nèi)容即可,然后在主循環(huán)邏輯中將判斷中的內(nèi)容可使用庫(kù)函數(shù)中的GPIO_ReadInputDataBit函數(shù)實(shí)現(xiàn)io電平讀取。
審核編輯 黃宇
-
mcu
+關(guān)注
關(guān)注
146文章
17955瀏覽量
365763 -
嵌入式系統(tǒng)
+關(guān)注
關(guān)注
41文章
3678瀏覽量
131276 -
GPIO
+關(guān)注
關(guān)注
16文章
1280瀏覽量
53970 -
按鍵檢測(cè)
+關(guān)注
關(guān)注
0文章
25瀏覽量
4931
發(fā)布評(píng)論請(qǐng)先 登錄
RK3568驅(qū)動(dòng)指南|第十二篇 GPIO子系統(tǒng)-第130章 GPIO的調(diào)試方法

迅為RK3568開(kāi)發(fā)板驅(qū)動(dòng)指南GPIO子系統(tǒng)GPIO子系統(tǒng)API函數(shù)的引入

迅為RK3568驅(qū)動(dòng)指南GPIO子系統(tǒng) GPIO操作函數(shù)實(shí)驗(yàn)

AS32X601驅(qū)動(dòng)系列教程 PLIC_中斷應(yīng)用詳解

AS32X601驅(qū)動(dòng)系列教程 USART_串口通訊詳解

AS32X601驅(qū)動(dòng)系列教程 GPIO_點(diǎn)亮LED詳解

AS32X601驅(qū)動(dòng)系列教程 SMU_系統(tǒng)時(shí)鐘詳解

第六章 GPIO輸入——按鍵檢測(cè)

面向工業(yè)與汽車(chē)領(lǐng)域的高安全可靠MCU——AS32X601系列芯片解析
AS32X601芯片技術(shù)剖析
AS32X601雙核鎖步MCU技術(shù)優(yōu)勢(shì)分析
遠(yuǎn)心鏡頭應(yīng)用手機(jī)按鍵檢測(cè)

SOC GPIO操作
STM32 GPIO八種模式及工作原理詳解

評(píng)論