基于STM32CubeMX的GPIO输入【Hal库】
这次学习GPIO输入的相关知识(阅读前请先参考),使用正点原子的精英开发板,同时结合上次的GPIO输出我们可以做一个按键控制LED灯亮灭的实例
首先我们先到原理图图中找到KEY和LED的位置,和上次一样crtl+f查找,这次我们使用KEY0和LED1来实现案例
接着我们在stm32cubemx中先配置一下PE4和PE5,将PE4配置为输入模式,PE5配置为输出模式
接着我们来配置一下GPIO,PE5以默认状态即可,PE4我们需要将其设置为上拉模式,将其在初始状态设置为高电平,通过读取按键的高低电平来判断按键是否按下
在设置完之后我们生成代码后进行编译确保原始程序没有问题,而不是在后面自己写代码时出现问题 ,接下来我们来看一下输入相关代码,在GPIO输入中之有一个函数 HAL_GPIO_ReadPin,通过读取GPIO电平高低来做出相应的反馈
、
接下来我们来看下他的源码
/**
* @brief Reads the specified input port pin.
* @param GPIOx: where x can be (A..G depending on device used) to select the GPIO peripheral
* @param GPIO_Pin: specifies the port bit to read.
* This parameter can be GPIO_PIN_x where x can be (0..15).
* @retval The input port pin value.
*/
GPIO_PinState HAL_GPIO_ReadPin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin)
{
GPIO_PinState bitstatus;
/* Check the parameters */
assert_param(IS_GPIO_PIN(GPIO_Pin));
if ((GPIOx->IDR & GPIO_Pin) != (uint32_t)GPIO_PIN_RESET)
{
bitstatus = GPIO_PIN_SET;
}
else
{
bitstatus = GPIO_PIN_RESET;
}
return bitstatus;
}
可以看到这个函数定义两个变量,也就是GPIO的类型和引脚,那么我们接下来来写一下按键控制LED灯的亮灭
/* USER CODE BEGIN WHILE */
while (1)
{
if(HAL_GPIO_ReadPin(GPIOE,GPIO_PIN_4) == GPIO_PIN_RESET)
{
HAL_Delay(500);
if(HAL_GPIO_ReadPin(GPIOE,GPIO_PIN_4) == GPIO_PIN_RESET)
{
HAL_GPIO_TogglePin(GPIOE,GPIO_PIN_5);
}
}
/* USER CODE END WHILE */
使用两次读取GPIO是否为低电平是因为第一次读取到低电平可能并不是按键真正按下,我们都知道按键闭合及断开的瞬间均伴随有一连串的抖动,抖动一般为5ms~10ms,为了不产生这种现象,我们在之后加个延迟函数可以消抖,接下来和GPIO输出的步骤一样,将PB5电平进行翻转可实现按键按下亮灭,以上为按键按下松开后LED灯亮起,那么要实现按键按下就使LED亮起要如何编写程序呢,代码如下
/* USER CODE BEGIN WHILE */
while (1)
{
if(HAL_GPIO_ReadPin(GPIOE,GPIO_PIN_4) == GPIO_PIN_RESET)
{
if(HAL_GPIO_ReadPin(GPIOE,GPIO_PIN_4) == GPIO_PIN_RESET)
{
HAL_GPIO_TogglePin(GPIOE,GPIO_PIN_5);
}
HAL_Delay(500);
}
/* USER CODE END WHILE */
只要将延迟函数和翻转函数对调一下就可以实现,也就是按下之后PB5电平立刻翻转
以上是GPIO输入的内容,如果有错请指出我会及时改正的
