零基础学STM32(七)-按键控制LED灯实验
本项目讲解所用工程均使用stm32f103C8T6芯片HAL库版本。
目录
原理讲解
初始化配置
代码书写
原理讲解
本节内容我们讲解按键控制LED灯实验,我们需要通过获取按键按下的状态来控制LED的点亮与熄灭。不断获取按键传入的电平变化,再通过 if 判断按键是否按下,如果按下,输出相应的电平控制LED灯。
初始化配置
接下来我们利用Cubemx进行HAL库的初始化配置,建立工程的部分我们这里就直接快速完成,不了解的同学可以看我之前的新建工程部分零基础学STM32(二)-新建工程-CSDN博客
创建工程后,还是老步骤,我们首先配置时钟,将时钟设置为外部高速时钟
再配置相应时钟树,将总频设置为32MHz。
设置完时钟树,我们初始化对应的IO口(最小板上的LED灯为PC13)用于控制高低电平的输出。
紧接着初始化另一个IO口用于接入按键并获取按键的状态。获取按键我们需要将IO口设置为GPIO_Input(输入捕获模式),设置为pull_up(上拉状态),除此之外还有 pull_down(下拉状态)和 No pull-up and no pull-down(浮空状态)。接下来简单讲解一下:
上拉状态(Pull-up)的按键:上拉是通过将一个电阻连接到电源电压来实现的,这样在没有按键操作时,电路维持在高电平状态。当按键未被按下时,电流通过上拉电阻流向电源,维持输入端为高电平。当按键被按下时,按键将输入端连接到地(GND),使得输入端电平变为低电平。
下拉状态(Pull-down)的按键:与上拉相反,下拉是通过将一个电阻连接到地(GND)来实现的,这样在没有按键操作时,电路维持在低电平状态。当按键未被按下时,电流通过下拉电阻流向地,维持输入端为低电平。当按键被按下时,按键将输入端连接到电源电压,使得输入端电平变为高电平。
浮空状态(Floating)的按键:浮空状态指的是按键既没有上拉也没有下拉,输入端没有明确连接到高电平或低电平。在浮空状态下,输入端的电平不确定,可能会受到外部噪声、电磁干扰等因素的影响,导致电平波动,因此这种状态在数字电路中是不稳定的。为了避免这种不确定性,通常需要对浮空输入进行上拉或下拉处理,以确保输入信号有一个明确的默认状态。
紧接着输出工程,将必要的内容勾选和填写一下即可。注意!!!文件路径中不要出现中文
接下来打开工程。
代码书写
在主函数中书写代码
简单讲解一下代码逻辑,我们这首先通过ReadPin来读取按键的状态,判断按键是否被按下,如果被按下就执行后续代码,紧接着读取LED灯的状态,判断LED灯所处为高电平还是低电平,并将他翻转为相反电平。
中间的延时函数是用于消除按键抖动的。简单介绍一下按键抖动,按键抖动(Switch Bounce)是指物理按键在闭合或断开接触时,由于机械触点的弹性跳动,导致在理想情况下应该是干净利落的开关动作出现了一系列快速的开关动作,即在一瞬间按键的状态在开和关之间快速变化的现象,就相当于你不小心碰到按键后,按键产生的微小反应引起电平变化。
我们常用的按键消抖方法为延时消抖和定时器中断消抖,延时消抖会占用CPU资源,导致效率低下,还会影响响应时间。至于定时器中断消抖,在后续定时器中断讲解中会提到。
if ( HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_9) == 0 )
{
HAL_Delay(200);
if( HAL_GPIO_ReadPin(GPIOC,GPIO_PIN_13) == 0 )
{
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_13,GPIO_PIN_SET);
}
else
{
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_13,GPIO_PIN_RESET);
}
}
同种类型可以写出,检测按键是否按下,如果按下则将LED灯置为高电平,否则置为低电平。
if ( HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_9) == 0 )
{
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_13,GPIO_PIN_RESET);
}
else
{
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_13,GPIO_PIN_SET);
}
按键的接线图:
按键 | STM32F103最小系统板 |
一端 | GND |
另一端 | PA9 |
以上就是STM32按键控制LED灯的全部内容。
作者:彧佑