前言
在嵌入式系统开发中,按键检测是一个基础而重要的任务,特别是在使用STM32系列微控制器的项目中。按键通常被用于与用户进行交互、控制设备的各种功能,或者触发特定事件。本文将介绍有关STM32基础按键检测的关键概念和方法。
通过按键检测,您可以实现多种功能,例如控制LED灯、切换设备模式、输入密码、启动/停止操作等。了解如何正确地检测按键状态是确保系统稳定性和用户友好性的关键一步。
在本文中,我们将探讨以下关键方面:
1.硬件连接:了解如何将外部按钮或开关连接到STM32微控制器的GPIO引脚,以便能够读取它们的状态。
2.GPIO配置:如何通过STM32的HAL库或LL库来配置GPIO引脚,使其适用于按键检测。
3.按键状态检测:如何读取GPIO引脚的状态以检测按键的按下和释放。
4.去抖动处理:解决机械按键可能引发的抖动问题,以确保准确的按键检测。
5.检测方法:使用轮询法或中断法来实现按键检测,根据项目的需求选择合适的方法。
通过深入了解这些关键概念和技术,您将能够成功地集成按键检测功能到您的STM32嵌入式项目中,并实现所需的用户交互和控制功能。在下一步中,我们将详细讨论每个方面,以帮助您更好地理解和应用STM32基础按键检测。
一、按键原理图分析
这个端口可以说是这样的:他一直给高电平(这样理解更好一些),当按键按下就短路了,然后跑到GND下面,此时这个读取到的东西就会改变,通过这个改变我们就可以判断是否按下了按键
二、cubeMX配置key GPIO
1、对应原理图找到key所在gpio
2、找到对应的GPIO,选择Input
3、配置gpio,设置上下拉
上下拉是什么呢?怎么理解:
当涉及到按键(按钮)时,“pull-up” 和 “pull-down” 是两种电气连接方式,它们用于确定按键的默认状态(按下或未按下)以及如何在电路中连接按键。
Pull-Up(上拉电阻):
通俗解释:上拉电阻就像是给按钮一根绳子,将按钮默认拽向高电平的状态。这意味着按钮未按下时,它的引脚连接到了正电压(例如3.3V或5V),从而保持在高电平状态。当您按下按钮时,它会将引脚拉向地(低电平状态)。
应用:常见于需要默认状态是高电平的情况,当按下按钮时,引脚变为低电平,例如在电子开关或触摸屏中。
Pull-Down(下拉电阻):
通俗解释:下拉电阻就像是给按钮一根绳子,将按钮默认拽向低电平的状态。这意味着按钮未按下时,它的引脚连接到地,从而保持在低电平状态。当您按下按钮时,它会将引脚拉向正电压(高电平状态)。
应用:常见于需要默认状态是低电平的情况,当按下按钮时,引脚变为高电平,例如在数字逻辑电路或数字输入设备中。
总之,上拉电阻和下拉电阻是一种电气设计方式,用于确定按钮的默认电平状态并防止电平漂移。选择哪种方式取决于您的应用需求,以确保按键在不同情况下的稳定工作。如果您希望按下按钮时引脚变成高电平,使用上拉电阻;如果希望按下按钮时引脚变成低电平,使用下拉电阻。
那么在这边我就设置了一个上拉。
三、代码分析
3.1 cubemx生成的代码
GPIO_InitStruct.Pin = GPIO_PIN_4; GPIO_InitStruct.Mode = GPIO_MODE_INPUT; GPIO_InitStruct.Pull = GPIO_PULLUP; HAL_GPIO_Init(GPIOE, &GPIO_InitStruct);
代码详解:
GPIO_InitStruct.Pin = GPIO_PIN_4;
这行代码设置了一个名为GPIO_InitStruct的结构体中的成员Pin。GPIO_PIN_4是一个宏定义,表示要初始化的GPIO引脚的编号。在这里,它表示要初始化的是GPIOE端口的第4个引脚。
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
这行代码设置了结构体中的成员Mode。GPIO_MODE_INPUT是一个宏定义,表示将该GPIO引脚配置为输入模式,即该引脚用于接收外部信号,而不是输出信号。
GPIO_InitStruct.Pull = GPIO_PULLUP;
这行代码设置了结构体中的成员Pull。GPIO_PULLUP是一个宏定义,表示启用了上拉电阻。这意味着当没有外部信号输入时,引脚将被默认拉向高电平(3.3V或5V,具体取决于芯片工作电压)。这有助于防止引脚漂移到未定义的电平。
HAL_GPIO_Init(GPIOE, &GPIO_InitStruct);
最后,这行代码调用HAL库函数HAL_GPIO_Init来应用之前设置的配置信息。它告诉STM32芯片初始化GPIOE端口的第4个引脚,将其配置为输入模式,并启用上拉电阻。这样,该引脚就准备好接收外部信号,并且在没有信号输入时保持高电平状态。
这段代码常用于初始化一个GPIO引脚,以便将其用作输入引脚,并确保引脚的默认状态是高电平,以防止信号漂移。这在连接外部按钮或开关等输入设备时非常有用。
3.2 1个库函数
HAL_GPIO_ReadPin 函数的函数原型如下:
GPIO_PinState HAL_GPIO_ReadPin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
作用:
HAL_GPIO_ReadPin 用于读取指定GPIO引脚的电平状态,即判断该引脚当前是高电平还是低电平。这对于检测外部信号(例如按钮按下或释放)非常有用,以便根据引脚状态执行相应的操作。
参数:
GPIOx:这是一个指向GPIO端口(例如GPIOA、GPIOB、GPIOC等)的指针,指定要读取引脚状态的GPIO端口。
Pin:这是一个宏定义或者按位或操作组成的数值,表示要读取的GPIO引脚的编号。例如,要读取GPIOA端口的第5个引脚,可以使用GPIO_PIN_5。
返回值:
HAL_GPIO_ReadPin 函数的返回值是一个整数,表示指定GPIO引脚的电平状态。通常情况下:
如果引脚是高电平,返回值为非零(例如1)。
如果引脚是低电平,返回值为零。
这样,您可以根据返回值来判断引脚的状态,进而执行相应的逻辑。例如,您可以使用该函数检测按钮是否按下,如果返回值为非零,表示按钮被按下,如果返回值为零,表示按钮未被按下。
示例用法:
if (HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_5) != 0) { // 按钮被按下,执行相应操作 } else { // 按钮未被按下,执行其他操作 }
这样,HAL_GPIO_ReadPin 函数帮助您轻松读取GPIO引脚的状态,以便在嵌入式应用中做出决策。
四、按键点灯示例代码
我这里设置的是上拉电阻,按下后为低电平
示例代码如下:
while (1) { /* USER CODE END WHILE */ if(HAL_GPIO_ReadPin(GPIOE,GPIO_PIN_4) == 0) { HAL_Delay(10); if(HAL_GPIO_ReadPin(GPIOE,GPIO_PIN_4) == 0) { state = ! state; HAL_GPIO_WritePin(GPIOB,GPIO_PIN_5,state); } } /* USER CODE BEGIN 3 */ }
代码解释如下:
这段代码看起来是一个在嵌入式系统中的主循环,主要是在不断地检测一个GPIO引脚的状态,并且根据该状态执行一些操作。下面逐行解释这些代码:
1.while (1)
这是一个无限循环,表示程序会一直在这个循环中运行,直到外部因素导致程序退出或者重启。
2.if(HAL_GPIO_ReadPin(GPIOE, GPIO_PIN_4) == 0)
这行代码通过调用HAL_GPIO_ReadPin函数来检测GPIOE端口的第4个引脚(即GPIOPIN4)的状态是否为低电平(0)。如果条件成立,说明检测到了某种外部信号,通常是按钮按下的信号。
3.HAL_Delay(10);
在进一步检测按钮状态之前,这行代码引入了一个延时。延时的时间是10毫秒,即程序会等待10毫秒。这个延时的目的是为了稳定信号的检测。按钮在按下或释放的瞬间可能会产生电压噪声或者抖动,延时有助于消除这种抖动,确保稳定地检测按钮的状态。
4.if(HAL_GPIO_ReadPin(GPIOE, GPIO_PIN_4) == 0)
在上面的延时之后,再次检测GPIOE端口的第4个引脚的状态是否为低电平。这是为了确认按钮状态稳定地为低电平,而不是短时的电压抖动。
5.state = !state;
如果按钮状态确认为低电平,那么会执行这行代码。它将一个变量state的值取反,即如果state是1,则变成0,如果state是0,则变成1。
6.HAL_GPIO_WritePin(GPIOB, GPIO_PIN_5, state);
这行代码根据前面的操作,将state的值写入GPIOB端口的第5个引脚。这实际上是在控制一个输出引脚,根据按钮的按下来切换输出状态(通常是驱动一个LED或执行其他操作)。
为什么需要延时再检测按钮状态?这是因为在按钮按下或释放的瞬间,按钮的引脚可能会发生电压抖动,导致信号从低电平切换到高电平或反之。通过引入延时,可以等待这种抖动稳定下来,以便在稳定的状态下进行检测,从而避免不必要的误触发或多次触发。这是一种常见的做法,特别是在处理物理输入设备(如按钮)时,以确保稳定的信号检测。这个就叫做按键去抖动
总结
在STM32嵌入式系统中,按键检测是常见的基础任务之一,通常用于检测外部按钮或开关的状态变化。