STM32学习笔记(五) —— 按键翻转LED

STM32学习笔记(五) —— 按键翻转LED

前面我们分析过GPIO的各个寄存器,探讨了如何使用GPIO点亮LED,这里再验证一下GPIO的输入功能。
1.硬件连接
按键
我们这里将按键连接到了PA0引脚,按键外接了上拉电阻,默认状态下PA0引脚处于高电平,当按键按下,PA0引脚就与GND短接,变为低电平,所以我们可以通过读取PA0引脚的电平状态来判断按键是否被按下。

2.软件编程
这里使用STM32CubeMX来配置PA0引脚的初始化:
PA0配置为输入模式
在这里插入图片描述
生成代码后,可以看见程序中已经添加了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会在亮灭之间翻转。
keypressed