2.按键控制小灯

253 阅读3分钟

1.课前知识

我们这节课的目的是按下学习板上的按钮,绿色小灯就可以亮起来,松下就可以熄灭,keysing的按键原理图:

image.png

image.png

1.1按键抖动

image.png

按键抖动的意思大概是按键在按下的瞬间有一种似断非断的状态,这个时间段很短,人是无法感知的,但是对于芯片来说是可以接收到的,在这段时间内,与按键相连的GPIO口就会收到起伏的信号,电容的作用就是消除按键抖动

image.png

1.2原理

1.2.1按键松开

按键松开PB12直接连接到3.3V电源,因此我们需要将其引脚模式设置为浮空输入,浮空输入模式下的GPIO口内部处于高阻态,即内部是有一个很大的电阻:

image.png

image.png

image.png

image.png

1.2.2按键按下

PB12这里读取到的是GND低电平0V

image.png

1.2.3上拉电路与下拉电路

image.png

1.2.4简单理解

可以发现keysing的原理图是上拉电路,因此按键松开引脚读取到高电平,按键按下按下读取到的是低电平

image.png

2.开整项目

2.1创建一个名为key的STM32项目

略,具体可以查看本专栏第一篇文章部分,包括后面步骤会省略挺多,因为在第一篇文章中已经介绍过后面就不再详细介绍

2.2设置引脚为GPIO_OUTPUT

image.png 设置用户标签:

image.png

将PB12设置为GPIO_INPUT并且设置用户标签KEY1

image.png

保存生成代码

2.3书写代码

tisp:在CubeMX中使用Ctrl+鼠标左键单击函数的时候我们可以直接跳转到这个函数的定义

// 第一个参数是引脚分组,我们使用用户标签来写,这句代码的意思是读取KEY1所代表的GPIO口的当前电平状态

// 通过递归查看函数的返回值可以看出返回高电平是GPIO_PIN_SET,低电平是GPIO_PIN_RESET,和上一集我们学习到的是一样的

HAL_GPIO_ReadPin(KEY1_GPIO_Port,KEY1_Pin);

if(HAL_GPIO_ReadPin(KEY1_GPIO_Port,KEY1_Pin)==GPIO_PIN_RESET){

HAL_GPIO_WritePin(LED_GREEN_GPIO_Port,LED_GREEN_Pin,GPIO_PIN_SET);

}else{

HAL_GPIO_WritePin(LED_GREEN_GPIO_Port,LED_GREEN_Pin,GPIO_PIN_RESET);

}

注意书写位置:

image.png

2.4编译运行

配置生成bin文件,具体步骤在第一篇中说过,这里不再赘述

image.png

2.5仿真

如果这里还有看不懂得还是需要回到第一篇文章理解基础

1.找到Push Buttons

image.png

配置按钮:

image.png

image.png

image.png

最终成果(按下就是熄灭,松开就是亮起,好像和一开始说的结果反了,但是已经理解了步骤就自行修改吧,提示:把RESET改成SET):

image.png

3.STM32的上拉电阻

STM32内部也是有上拉与下拉电阻的,我们接下来看看如何设置内部的上拉与下拉电阻

采用内部的上拉电阻,就可以在电路上省略掉我们自己的上拉电阻

image.png

下面我们实操一下如何使用STM32内部的上拉电阻

3.1修改PB13为GPIO_Input

image.png

设置用户标签

image.png

默认情况下PB13是浮空输入就是不上拉也不下拉,我们现在将其修改为上拉状态

image.png

保存并且生成代码

3.2书写代码

// 当读取到低电平的时候

if(HAL_GPIO_ReadPin(KEY2_GPIO_Port,KEY2_Pin)==GPIO_PIN_RESET){

// 软件消除按键抖动

HAL_Delay(10);

if(HAL_GPIO_ReadPin(KEY2_GPIO_Port,KEY2_Pin)==GPIO_PIN_RESET){

//翻转引脚电平

HAL_GPIO_TogglePin(LED_RED_GPIO_Port,LED_RED_Pin);

// 循环等待

while(HAL_GPIO_ReadPin(KEY2_GPIO_Port,KEY2_Pin)==GPIO_PIN_RESET){}

}
}

注意书写位置:

image.png

3.3仿真

Push Button设置

image.png

红色RGB LED设置

image.png

好了,目前就实现了轮询(while循环)进行读取按键然后反转红色小灯亮灭状态的程序了