HAL库学习——输入

HAL库学习——输入

一、GPIO作为输出

1、设置GPIO

任务为通过识别按键状态(输入,引脚为PB1,上拉),控制LED灯(输出,引脚为PA5)

根据硬件电路原理图,将PB1引脚配置为输入功能(GPIO_Input),命名为KEY;PA5引脚配置为输出功能(GPIO_Output),命名为LED。具体配置信息如下图

2、库函数分析

(1)MX_GPIO_Init()函数

MX_GPIO_Init是CubeMX生成的初始化函数,包括了特定的GPIO引脚的初始化设置,可以直接使用,从而简化了初始化的操作。

(2)HAL_GPIO_Init()函数

void HAL_GPIO_Init(GPIO_TypeDef  *GPIOx, GPIO_InitTypeDef *GPIO_Init)

HAL_GPIO_Init()函数有两个参数:一个是GPIOx,另外一个是结构体变量GPIO_Init。

HAL_GPIO_Init也是用于对GPIO引脚进行初始化配置。这个函数提供了更加灵活的配置选项,可以根据具体需求手动设置GPIO的模式、速度、上拉/下拉等参数,可以实现更加细致的控制。

/*Configure GPIO pin : PtPin */
GPIO_InitStruct.Pin = LED_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(LED_GPIO_Port, &GPIO_InitStruct);
​
/*Configure GPIO pin : PtPin */
GPIO_InitStruct.Pin = KEY_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_PULLDOWN;
HAL_GPIO_Init(KEY_GPIO_Port, &GPIO_InitStruct);

(3)HAL_GPIO_ReadPin()函数

GPIO_PinState HAL_GPIO_ReadPin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin)

HAL_GPIO_ReadPin()函数有两个参数:一个是GPIOx,另外一个是GPIO_Pin。

HAL_GPIO_ReadPin()函数的类型是GPIO_PinState,而GPIO_PinState是枚举类型。

由于HAL_GPIO_ReadPin()函数需要返回引脚的输人状态,类型是GPIO_PinState,所以可以先在main.c中定义一个变量KEY,类型为GPIO_PinState。 因为GPIO_PinState的成员是GPIO_PIN_RESET和GPIO_PIN_SET, 也就是0和1,所以也可以将变量KEY的类型定义为uint8_ t。

该函数用于读取输入引脚的状态。

3、代码编写

/* USER CODE BEGIN 1 */
  GPIO_PinState KEY;//  uint8_t KEY;
/* USER CODE END 1 */
​
 while (1)
  {
    /* USER CODE END WHILE */
​
    /* USER CODE BEGIN 3 */
    KEY = HAL_GPIO_ReadPin(KEY_GPIO_Port,KEY_Pin);
    if(KEY == GPIO_PIN_RESET)
    {
      HAL_GPIO_WritePin(LED_GPIO_Port,LED_Pin,GPIO_PIN_SET);
    }
    else
    {
      HAL_GPIO_WritePin(LED_GPIO_Port,LED_Pin,GPIO_PIN_RESET);
    }
  }
  /* USER CODE END 3 */

二、拓展

1、用子程序方式实现上述功能

/* USER CODE BEGIN PM */
#define KEY_B1 HAL_GPIO_ReadPin(KEY_GPIO_Port,KEY_Pin)
/* USER CODE END PM */
​
/* USER CODE BEGIN PV */
uint8_t KEY_scan(void);
/* USER CODE END PV */
​
 while (1)
  {
    /* USER CODE END WHILE */
​
    /* USER CODE BEGIN 3 */
    KEY = KEY_scan();
    if(KEY == GPIO_PIN_RESET)
    {
      HAL_GPIO_WritePin(LED_GPIO_Port,LED_Pin,GPIO_PIN_SET);
    }
    else
    {
      HAL_GPIO_WritePin(LED_GPIO_Port,LED_Pin,GPIO_PIN_RESET);
    }
  }
  /* USER CODE END 3 */
​
/* USER CODE BEGIN 4 */
uint8_t KEY_scan(void)
{
  if(KEY_B1 == 1)
  {
    return 1;
  }
  else
    return 0;
}
  
/* USER CODE END 4 */

2、按键消抖

对于按键的使用有一个消抖问题,该问题通常在读取按键的IO口状态后加上几ms的延时,延时过后再读取IO的状态,并将此事的状态作为最终值。(此为软件消抖)

上述例程中可以在子程序中进行消抖

/* USER CODE BEGIN 4 */
uint8_t KEY_scan(void)
{
  if(KEY_B1 == 1)
  {
    HAL_Delay(10);
    if(KEY_B1 == 1)
      return 1;
  }
  else
    return 0;
}
  
/* USER CODE END 4 */
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值