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 */