在嵌入式系统开发中,GPIO(通用输入输出端口)是实现硬件与软件交互的关键组件。本节主要利用的时GPIO的输入采集功能,本节的主要功能为,读取板载按键,当按键按下时,对应led亮起,抬起按键,对应led熄灭。
硬件设计
评估板板载三个机械按键,分别接入MCU的PE10、PB4、PB3,当按键按下时,控制引脚通过按键接地,表现为低电平,当按键抬起时,io通过电阻连接到VCC,此时表现为高电平。

软件设计
代码分析
本节主要验证GPIO的输入功能,所不同的是,在初始化gpio结构体时需要将输出配置为输入。我们在Bsp文件夹中新建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);
- }
在本小结的例程中,我们采用IO中断的形式读取IO状态,PLIC的内容在后边会具体介绍,因此在此处只需要参考这个配置过程即可。
第10~20行为gpio输入模式初始化,由于按键正常情况下接口表现为高电平,所以将接口配置为上拉输入,可以保证接口稳定。
第22~30行为中断模块配置,主要功能就是开启两个IO端口的中断。
第33~37行,在GPIO中需要配置中断触发模式,此处配置为GPIO_ITType_EDGEDOWN下降沿触发,在此之前最好清除一下中断初始状态。
接下来编写中断处理函数:
- 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的中断处理函数划分相对ARM更细,针对不同端口有不同的处理函数,在这个函数中,我们首先调用GPIO_GetITStatus函数确定中断源,之后置位按键状态以便主程序中进行处理。
最后我们编写主逻辑:
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. }
主函数循环中添加上述代码逻辑,主要功能就是当按键按下时,对应led进行一个亮灭翻转。
此处需要说明的是,如果不用中断形式操作,那么我们在案件初始化函数中只需要保留GPIO_Init函数之前的内容即可,然后在主循环逻辑中将判断中的内容可使用库函数中的GPIO_ReadInputDataBit函数实现io电平读取。
审核编辑 黄宇
-
mcu
+关注
关注
147文章
18615浏览量
387242 -
嵌入式系统
+关注
关注
41文章
3716浏览量
133107 -
GPIO
+关注
关注
16文章
1313浏览量
55730 -
按键检测
+关注
关注
0文章
25浏览量
5000
发布评论请先 登录
如何将 GPIO PWM 和 GPIO Capture 驱动程序导入 Linux 内核,实现 PWM 输出并检测引脚的变化状态?
基于 AS32X601 微控制器的定时器模块(TIM)技术研究与应用实践
AS32X601芯片Flash擦写调试技术解析
AS32X601系列MCU硬件最小系统设计与调试方案探析
AS32X601驱动系列教程 PLIC_中断应用详解
AS32X601驱动系列教程 USART_串口通讯详解
AS32X601驱动系列教程 GPIO_点亮LED详解
AS32X601驱动系列教程 SMU_系统时钟详解

AS32X601驱动系列教程 GPIO_按键检测详解
评论