基于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输入的内容,如果有错请指出我会及时改正的

经验分享 程序员 微信小程序 职场和发展