STM32学习笔记(五) —— 按键翻转LED
STM32学习笔记(五) —— 按键翻转LED
前面我们分析过GPIO的各个寄存器,探讨了如何使用GPIO点亮LED,这里再验证一下GPIO的输入功能。
1.硬件连接
我们这里将按键连接到了PA0引脚,按键外接了上拉电阻,默认状态下PA0引脚处于高电平,当按键按下,PA0引脚就与GND短接,变为低电平,所以我们可以通过读取PA0引脚的电平状态来判断按键是否被按下。
2.软件编程
这里使用STM32CubeMX来配置PA0引脚的初始化:
生成代码后,可以看见程序中已经添加了PA0引脚初始化部分
在while循环中添加如下代码:
注意按键要进行软件消抖(按键按下与断开时都会有干扰产生,可以进行软件延时消抖,一般可以延时10-20ms,具体可以参考代码中的注释)。
while (1)
{
/* 读取PA0引脚电平 */
if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0) == GPIO_PIN_RESET) {
/* 如果是低电平, 表示有按键按下, 进行软件延时消抖 */
HAL_Delay(10);
/* 再次读取PA0引脚电平, 如果还是低电平, 就认为有按键按下 */
if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0) == GPIO_PIN_RESET) {
/* 等待按键释放 */
while(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0) == GPIO_PIN_RESET);
/* 翻转一次按键标志 */
ek_key_flag = !ek_key_flag;
printf("key pressed.\r\n");
}
}
/* 按键每次按下后, ek_key_flag会在0与1之间变换 */
if(ek_key_flag)
/* 当ek_key_flag == 1时点亮LED */
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_5, GPIO_PIN_RESET);
else
/* 当ek_key_flag不为1时熄灭LED */
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_5, GPIO_PIN_SET);
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
将程序下载后可以打开串口调试助手,每当按键按下会打印“key pressed.”信息,并且LED会在亮灭之间翻转。