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

前面我们分析过GPIO的各个寄存器,探讨了如何使用GPIO点亮LED,这里再验证一下GPIO的输入功能

1.硬件连接

STM32学习笔记(五) —— 按键翻转LED_第1张图片

我们在开发板上将按键连接到了PA0引脚,按键外接了上拉电阻,默认状态下PA0引脚处于高电平,当按键按下,PA0引脚就与GND短接,变为低电平,所以我们可以通过读取PA0引脚的电平状态来判断按键是否被按下

2.软件编程

这里使用STM32CubeMX来配置PA0引脚的初始化:

STM32学习笔记(五) —— 按键翻转LED_第2张图片

STM32学习笔记(五) —— 按键翻转LED_第3张图片

生成代码后,可以看见程序中已经添加了PA0引脚初始化部分

STM32学习笔记(五) —— 按键翻转LED_第4张图片

在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(LED_GPIO_Port, LED_Pin, GPIO_PIN_RESET);
    else
        /* 当ek_key_flag不为1时熄灭LED */
        HAL_GPIO_WritePin(LED_GPIO_Port, LED_Pin, GPIO_PIN_SET);
        
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }

将程序下载后可以打开串口调试助手,每当按键按下会打印“key pressed.”信息,并且LED会在亮灭之间翻转

STM32学习笔记(五) —— 按键翻转LED_第5张图片

本例程代码可以在HAL库工程模板这一章节的最后,百度网盘链接分享处获取

以上是通过开发板进行实际验证的,下面使用软件仿真,

我们首先进入调试界面( 前面章节有提到,所以本篇以及后续章节都不再重复提及 ),
将控制LED的引脚添加进逻辑分析仪( 前面章节有提到如何添加 )

STM32学习笔记(五) —— 按键翻转LED_第6张图片

打开GPIOA窗口

STM32学习笔记(五) —— 按键翻转LED_第7张图片

确定要操作的连接按键的引脚PA0

STM32学习笔记(五) —— 按键翻转LED_第8张图片

运行仿真,点击PA0引脚后可以看到LED引脚变为了低电平

STM32学习笔记(五) —— 按键翻转LED_第9张图片

打开串口调试界面( 前面章节有提到如何添加 ),也可以看到打印的“key pressed.”信息

STM32学习笔记(五) —— 按键翻转LED_第10张图片

你可能感兴趣的:(STM32学习笔记,stm32)