在之前章节,我们已经了解了如何通过GPIO去判断按键的状态,接下来我们将配置GPIO为输入功能,使其能够正常判断按键状态。
配置流程
一般使用GPIO的端口输入功能,都需要有以下几个步骤:
- 开启GPIO的端口时钟
- 配置GPIO的模式
开发板的按键使用的是KEY_UP,接到了单片机的PA0引脚上,因此需要配置PA0引脚的状态。
开启GPIO的端口时钟
按键接到了单片机的PA0引脚上,首先要使能GPIOA端口的时钟。还是用rcu_periph_clock_enable
函数,只需要将GPIOA
时钟当做参数传入。为了移植方便,可以将按键的时钟和引脚进行宏定义。
/* 定义key的引脚 */
#define BSP_KEY_RCU RCU_GPIOA
#define BSP_KEY_PORT GPIOA
#define BSP_KEY_PIN GPIO_PIN_0
2
3
4
使能GPIOA的端口可以写为:
/* 开启时钟 */
rcu_periph_clock_enable(BSP_KEY_RCU);
2
配置GPIO模式
通过前面章节的按键检测原理知道需要检测按键引脚的电平状态来判断按键是否按下,要检测电平引脚的状态,就需要将按键配置为输入模式。开发板上的按键虽然在手册中说明了默认是低电平,也就按键松开的状态是低电平。但是我们还是需要通过软件的方式,设置引脚为下拉电阻模式。
使能按键的引脚为输入模式和下拉模式,转换为代码为:
/* 配置为输入模式 下拉模式 */
gpio_mode_set(BSP_KEY_PORT, GPIO_MODE_INPUT, GPIO_PUPD_PULLDOWN, BSP_KEY_PIN);
// 配置为下拉,则按键默认状态是低电平
2
3
完整的按键配置
void KeyGpioConfig(void)
{
/* 使能按键引脚时钟 */
rcu_periph_clock_enable(BSP_KEY_RCU);
/* 配置为输入模式 下拉模式 */
gpio_mode_set(BSP_KEY_PORT, GPIO_MODE_INPUT, GPIO_PUPD_PULLDOWN, BSP_KEY_PIN);
// 配置为下拉,则按键默认状态是低电平
}
2
3
4
5
6
7
8
9
获取按键的状态
配置好GPIO之后,就可以检测按键引脚的状态了。
首先还是到gd32vw55x_gpio.h
中去查找对应的获取引脚状态的库函数。
FlagStatus gpio_input_bit_get(uint32_t gpio_periph, uint32_t pin)
这个函数可以获取引脚电平状态,有两个参数,第一个参数gpio_periph
就是要获取引脚的端口,第二个参数pin
就是要获取的引脚,还有一个返回值,返回值FlagStatus
是获取到的引脚的状态,如果为高电平就为1,如果为低电平就为0。
获取PA0引脚的电平状态转换为代码就是:
gpio_input_bit_get(BSP_KEY_PORT,BSP_KEY_PIN)
判断按键是否按下只需要判断检测的引脚电平是高电平即可。
转化为代码为:
/* 先读取按键引脚的电平 如果是高电平,说明按键按下 */
if(gpio_input_bit_get(BSP_KEY_PORT,BSP_KEY_PIN) == SET) // 按键按下
{
}
2
3
4
5
前面说过,机械按键按下之后会发生抖动,有硬件消抖和软件消抖两种,开发板上没有做硬件消抖处理,这里用软件来实现。
可以在第一次检测到按键按下之后延迟一定的时间,等按键稳定之后再次检测按键按下,即可判断按键是按下状态。在按键按下之后就可以执行功能,比如点灯。在按键按下之后可以通过检测按键的引脚的状态变为低电平判断按键是否松开,这里用串口打印按键按下和松开的状态,最终编写代码为:
void keyScan(void)
{
/* 先读取按键引脚的电平 如果高电平,按键按下 */
if(gpio_input_bit_get(BSP_KEY_PORT,BSP_KEY_PIN) == SET) // 按键按下
{
/* 延迟消抖 */
delay_1ms(50);
if(gpio_input_bit_get(BSP_KEY_PORT,BSP_KEY_PIN) == SET) // 再次检测按键是否按下
{
/* 执行功能 */
gpio_bit_toggle(BSP_LED1_PORT,BSP_LED1_PIN); // led电平状态翻转
while(gpio_input_bit_get(BSP_KEY_PORT,BSP_KEY_PIN) == SET); // 等待按键松开
}
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
上面实现的效果就是按一次按键,led开启,再按一次按键,led关闭。
这里led的实现用了一个新的库函数。
void gpio_bit_toggle(uint32_t gpio_periph, uint32_t pin);
这个函数可以使引脚电平状态翻转,有两个参数,第一个参数是要翻转的引脚的端口,第二个参数是要翻转的引脚。
实验现象
关于这一章节的代码,可以在开发板资料/03 - 软件资料/代码例程/里面的006按键点灯
。
下载中心跳转📦
资料下载中心:点击跳转🚀
烧写我们的代码之后,按下一次按键,开启中间的led,再按下一次按键,关闭中间的led,以此类推。