STM32按键控制小灯—HAL库

2024-08-21 15:12
文章标签 stm32 控制 按键 hal 小灯

本文主要是介绍STM32按键控制小灯—HAL库,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

原理讲解:

以上是按键的原理图:(忽略GPIO口,因为可以自行设置)

需要注意的点有两个:

①100nF的电容:有效缓冲抖动的电平信号,有按键消抖的作用

什么是按键抖动呢?(简单来说就是按键中的接触点在接触或者断开的瞬间在很小的时间片段上处于一种似连非连、似断非断的状态)

        按键抖动是当你按下或松开按键时,接触点之间可能会发生多个微小的接触和分离,而不仅仅是一次单一的接触。

        这种快速的、多次的接触和断开会导致电路产生多个开关信号,从而引发误操作或错误信号输入。

        为了避免这种情况,通常会使用软件或硬件上的去抖动技术,将这些多个信号处理为一个有效信号。

        去抖动可以通过添加时间延迟、信号过滤等方法来实现,以确保系统只识别出按键的第一次触发,过滤掉后续的抖动信号。

(在没有外部硬件的条件下,我们就先使用添加时间延迟的办法来过滤抖动信号)

②上下拉电阻:

上拉操作:上拉操作需要使用一个电阻来配合,所以我们一般称这个电阻为上拉电阻

上拉电阻的作用是在当GPIO口设置为浮空输入模式的时候,为防止输入引脚处于不确定的状态(即浮空状态),我们加一个上拉电阻从而确保逻辑电平稳定。它通常被连接在输入引脚与电源电压之间

具体作用:

1. 稳定逻辑电平:在一些数字电路中,输入引脚可能会因为未连接到高电平或低电平而处于浮空状态,导致电平不明确。这时,上拉电阻会将该引脚拉到高电平,避免逻辑电平不稳定的情况。

2. 防止输入悬空:当输入引脚没有被驱动(如开关未闭合时),上拉电阻提供了一个稳定的高电平,这样即使输入设备未提供信号,电路也不会出现随机噪声或不确定状态。

        当GPIO口设置为浮空输入模式的时候输入引脚处于不确定的状态,GPIO口接入的单片机内部相当于有一个巨大的电阻,根据分压原理,R11电阻几乎不分压,此时GPIO口读到的就是高电平。当按键或开关未按下时,上拉电阻将输入引脚维持在高电平,按下时则将引脚拉到低电平,从而实现明确的信号状态。

下拉操作同理可得。

具体操作:

首先新建文档

输入芯片型号:STM32F103C8T6

新建文件名:KEY_LED--->点击Finish

来到配置界面,我们先将PB13和PA7引脚打开。

将PB13引脚设置为GPIO_input(因为我们想要将这个已经配置为上拉输入---以供按键控制)

将PA7设置为GPIO_Output

然后来到GPIO设置部分:将PB13设置为Pull-up(上拉输入模式),并命名为KEY

PA7如图。 

配置好后点击保存生成代码。

代码部分:

  /* Infinite loop *//* USER CODE BEGIN WHILE */while (1){if(HAL_GPIO_ReadPin(KEY_GPIO_Port,KEY_Pin)==GPIO_PIN_RESET){HAL_Delay(10);if(HAL_GPIO_ReadPin(KEY_GPIO_Port,KEY_Pin)== GPIO_PIN_RESET){HAL_GPIO_TogglePin(LED_RED_GPIO_Port,LED_RED_Pin);while(HAL_GPIO_ReadPin(KEY_GPIO_Port,KEY_Pin)==GPIO_PIN_RESET){}}}/* USER CODE END WHILE *//* USER CODE BEGIN 3 */}

代码详解:

1. while (1)

这是一个无限循环,代码将在其中不断执行。通常用于嵌入式系统中,表示程序会一直运行,直到设备重启或关闭。

2. if(HAL_GPIO_ReadPin(KEY_GPIO_Port,KEY_Pin) == GPIO_PIN_RESET)

HAL_GPIO_ReadPin是 STM32 HAL 库中的一个函数,用于读取指定引脚的电平状态KEY_GPIO_Port和 KEY_Pin是定义好的宏,分别表示按键所在的GPIO端口和引脚

(例如:#define KEY_GPIO_Port GPIOB  // 按键连接在GPIOB端口上)
GPIO_PIN_RESET通常表示低电平(即按键被按下的状态)。
这行代码的意思是:如果检测到按键被按下,则进入 `if` 语句块。

3. HAL_Delay(10);

HAL_Delay函数用于产生一个10毫秒的延时。
这是一个简单的去抖动处理。按键抖动现象可能会导致检测到的按键状态不稳定,延时10毫秒可以过滤掉短时间的抖动信号,确保按键状态稳定后再继续检测。

4. if(HAL_GPIO_ReadPin(KEY_GPIO_Port,KEY_Pin) == GPIO_PIN_RESET)

在延时之后,再次读取按键的状态。如果按键仍然处于按下状态(低电平),则进入这个 if语句块。
这进一步确认按键确实被按下,而不是由于抖动导致的误判。

5. HAL_GPIO_TogglePin(LED_RED_GPIO_Port,LED_RED_Pin);

HAL_GPIO_TogglePin是一个用于切换引脚状态的函数。
这行代码的作用是切换红色LED灯的状态:如果LED当前是亮的,则熄灭;如果是熄灭的,则点亮。

6. while(HAL_GPIO_ReadPin(KEY_GPIO_Port,KEY_Pin) == GPIO_PIN_RESET){}

这个 while`循环用于等待按键被释放。只要按键处于按下状态(低电平),循环就会一直执行,不会退出。
这样可以避免在按键未释放时重复触发LED的切换动作。换句话说,按键每按下一次,LED只会切换一次状态。

这篇关于STM32按键控制小灯—HAL库的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


原文地址:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.chinasem.cn/article/1093516

相关文章

MySQL精准控制Binlog日志数量的三种方案

《MySQL精准控制Binlog日志数量的三种方案》作为数据库管理员,你是否经常为服务器磁盘爆满而抓狂?Binlog就像数据库的“黑匣子”,默默记录着每一次数据变动,但若放任不管,几天内这些日志文件就... 目录 一招修改配置文件:永久生效的控制术1.定位my.cnf文件2.添加核心参数不重启热更新:高手应

SpringBoot请求参数接收控制指南分享

《SpringBoot请求参数接收控制指南分享》:本文主要介绍SpringBoot请求参数接收控制指南,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Spring Boot 请求参数接收控制指南1. 概述2. 有注解时参数接收方式对比3. 无注解时接收参数默认位置

Spring Security+JWT如何实现前后端分离权限控制

《SpringSecurity+JWT如何实现前后端分离权限控制》本篇将手把手教你用SpringSecurity+JWT搭建一套完整的登录认证与权限控制体系,具有很好的参考价值,希望对大家... 目录Spring Security+JWT实现前后端分离权限控制实战一、为什么要用 JWT?二、JWT 基本结构

Android实现两台手机屏幕共享和远程控制功能

《Android实现两台手机屏幕共享和远程控制功能》在远程协助、在线教学、技术支持等多种场景下,实时获得另一部移动设备的屏幕画面,并对其进行操作,具有极高的应用价值,本项目旨在实现两台Android手... 目录一、项目概述二、相关知识2.1 MediaProjection API2.2 Socket 网络

用js控制视频播放进度基本示例代码

《用js控制视频播放进度基本示例代码》写前端的时候,很多的时候是需要支持要网页视频播放的功能,下面这篇文章主要给大家介绍了关于用js控制视频播放进度的相关资料,文中通过代码介绍的非常详细,需要的朋友可... 目录前言html部分:JavaScript部分:注意:总结前言在javascript中控制视频播放

Python异步编程中asyncio.gather的并发控制详解

《Python异步编程中asyncio.gather的并发控制详解》在Python异步编程生态中,asyncio.gather是并发任务调度的核心工具,本文将通过实际场景和代码示例,展示如何结合信号量... 目录一、asyncio.gather的原始行为解析二、信号量控制法:给并发装上"节流阀"三、进阶控制

使用DrissionPage控制360浏览器的完美解决方案

《使用DrissionPage控制360浏览器的完美解决方案》在网页自动化领域,经常遇到需要保持登录状态、保留Cookie等场景,今天要分享的方案可以完美解决这个问题:使用DrissionPage直接... 目录完整代码引言为什么要使用已有用户数据?核心代码实现1. 导入必要模块2. 关键配置(重点!)3.

SpringSecurity 认证、注销、权限控制功能(注销、记住密码、自定义登入页)

《SpringSecurity认证、注销、权限控制功能(注销、记住密码、自定义登入页)》SpringSecurity是一个强大的Java框架,用于保护应用程序的安全性,它提供了一套全面的安全解决方案... 目录简介认识Spring Security“认证”(Authentication)“授权” (Auth

python之流程控制语句match-case详解

《python之流程控制语句match-case详解》:本文主要介绍python之流程控制语句match-case使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录match-case 语法详解与实战一、基础值匹配(类似 switch-case)二、数据结构解构匹

Spring Security注解方式权限控制过程

《SpringSecurity注解方式权限控制过程》:本文主要介绍SpringSecurity注解方式权限控制过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、摘要二、实现步骤2.1 在配置类中添加权限注解的支持2.2 创建Controller类2.3 Us