入门STM32--按键输入

news/2024/9/17 15:59:26/ 标签: stm32, 嵌入式硬件, 单片机

        上一篇博客我们介绍了如何使用GPIO配置跑马灯,根据GPIO的基本结构图,我们能够发现,他肯定不单单有输出的功能,肯定可以检测IO上的电平变化,实际上就是输入的功能。

 1.按键

        在大多数情况下,按键是一种简单的开关,当按下时会改变电路连接,从而改变电平状态。按键通常与一个上拉电阻或下拉电阻连接,以确保在未按下时,输入引脚处于已知的高电平或低电平。

        值得一提的是,这种按键并不是理想的开关,在按下和松开的过程中,电平的变化往往不是理想的,而是伴随着尖峰、抖动。 

2. 硬件连接

        假设我们使用一个带上拉电阻的按键,连接方式为,一个引脚连接到STM32的GPIO输入引脚,另一个引脚连接到地(GND),同时,在输入引脚与VCC之间连接一个上拉电阻。

        当按下按键时,GPIO引脚的电平从高变为低;当松开按键时,引脚电平保持高电平。下图并没有画出上拉电阻,实际上在单片机内部就有。

3. 去抖动 

         机械按键在按下和释放时,电平可能会在高低之间快速波动,产生“抖动”现象。为了解决这个问题,我们需要在软件中进行去抖动处理,可以通过计时器或延时来实现。

        此外,我们还可以通过硬件的方式,来消除“抖动”的影响,可以在按键电路的上拉电阻或者下拉电阻两侧并联电容,消除电压尖峰。

4. STM32上的按键输入配置

        接下来,我们将以STM32的标准库为例详细介绍如何在STM32上配置按键输入,假设按键连接在PE3引脚上。

4.1GPIO初始化

        我们通常会使用一个函数来配置GPIO引脚的模式、速度、上下拉电阻等属性。下面我们详细解释一下GPIO_Config函数。

void GPIO_Config(void)
{// 启动GPIOC的时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE, ENABLE);// 配置PC13为输入模式,带上拉电阻GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;  // 输入模式,带上拉GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;GPIO_Init(GPIOE, &GPIO_InitStructure);
}

4.2启动GPIO端口时钟

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE, ENABLE);

        在STM32中,每个外设(包括GPIO端口)都需要通过时钟来驱动。在使用某个GPIO端口之前,必须先启用对应的时钟,否则后续对该端口的配置和操作将无效。

RCC_APB2PeriphClockCmd:这是一个用于管理APB2总线上的外设时钟的函数。

RCC_APB2Periph_GPIOC:这个宏定义代表GPIOC端口对应的时钟。

4.3结构体参数

GPIO_Pin_3:表示要配置的引脚号。STM32的每个GPIO端口有多个引脚(通常编号为0到15),GPIO_Pin_3表示PE3引脚。

GPIO_Mode_IPU:表示输入模式,带上拉电阻。

GPIO_Speed_2MHz:用于设置GPIO引脚的速度,实际上是引脚的切换速率。对于输入引脚,速度设置一般没有影响,更多的是在输出模式下有意义。

4.4初始化

GPIO_Init(GPIOE, &GPIO_InitStructure); 

GPIO_Init:这个函数将前面配置好的GPIO_InitTypeDef结构体中的参数应用到指定的GPIO端口。

5. 读取按键状态

在主循环中,我们可以通过读取GPIO引脚的状态来判断按键是否被按下:

while (1)
{if (GPIO_ReadInputDataBit(GPIOE, GPIO_Pin_3) == 0){// 按键按下时执行的操作}else{// 按键未按下时的操作}
}

        注意,有些程序并不是简简单单的向上面那样,还会使用宏定义,简化程序。但对初学者不友好。

6. 去抖动处理

        按键抖动可能导致误触发,因此我们可以在软件中添加去抖动处理。以下是一个简单的去抖动处理示例:

#define DEBOUNCE_DELAY 50 // 50毫秒去抖动延时
while (1)
{if (GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_13) == Bit_RESET){Delay(DEBOUNCE_DELAY);  // 延时去抖动if (GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_13) == Bit_RESET){// 按键按下且去抖动后执行的操作}}
}

拓展

        为了提高响应速度并减少CPU占用,我们可以将按键引脚配置为外部中断(EXTI),当按键状态变化时,触发中断处理函数。

通过计时器,我们可以实现对按键的长按和短按识别,从而执行不同的操作。


http://www.ppmy.cn/news/1517088.html

相关文章

今日算法:蓝桥杯基础题之“切面条”

你好同学,我是沐爸,欢迎点赞、收藏、评论和关注!个人知乎 从今天开始,一起了解算法,每日一题,从 JavScript 的技术角度进行解答,如果你对算法也感兴趣,请多多关注哦。 问题描述 一…

15 - FFmpeg 音频混音(过滤器)

过滤器链接流程 -------- auto_aresample_0:default--[48000Hz flt:stereo]--input0| amix |default--[48000Hz flt:stereo]--auto_aresample_2:default auto_aresample_1:default--[48000Hz flt:stereo]--input1| (amix) | …

Linux 数据结构 顺序表 链表

数据结构: 1.衡量一个程序是否优秀: 1.时间复杂度: 数据量增长与程序运行时间的比例关系以函数描述称为时间渐进复杂度函数,简称时间复杂度 O(c) > O(logn) > O(n) > O(nlogn) > O(n^2) > O(n^3) > O…

一个prolog最简单推理示例

假设现在知道一些年轻人,谁喜欢谁,定义为love(x, y); 定义了一些这样的关系; 如果x喜欢y,y也喜欢x,则定义他们是一对情侣; 规则表示为: lovers(X,Y) :- love(X,Y), love(Y,X). 输入…

UniApp中的Flex布局技巧

随着移动互联网的迅速发展,越来越多的开发者开始使用跨平台技术来开发应用程序。而在跨平台开发里,uniapp是一种非常受欢迎的框架,由于使用uniapp可以快速地开发出同时支持多个平台的应用程序。在uniapp开发中,flex布局是一种非常…

【C++】异常 详解

目录 异常的引出与简介 异常的使用 异常逻辑图解 异常继承体系 异常的重新抛出 异常安全 异常规范 结语 异常的引出与简介 我们可以回忆一下,在C语言时期,我们返回错误的方式只有两个 一个是assert强制返回错误,还有一个就是返回错误…

第三十一章:docker如何部署Nexus

docker如何部署Nexus 目标 掌握 Nexus docker compose安装安装Docker和Docker Compose:确保您的系统已安装Docker和Docker Compose。如果尚未安装,可以参考Docker官方文档进行安装12。 创建Docker Compose文件:在您选择的目录下创建一个名为docker-compose.yml的新文件,并…

GraphRAG论文解读

欢迎一起讨论 论文地址综述介绍部分核心翻译翻译解释重要的信息元素和实体的关系(包含和被包含,而非相等)Graph Index(图索引)Community Detection(社区检测)Query-Focused Summarization&#…

Android studio 升级问题记录-个性化配置迁移

前言 在本次折腾Android studio更新的过程中,遇到了很多问题,包括: 选择直接覆盖更新的话,会发现样式还是老样式旧项目运行不通过,并且会生成一些异常的build无法再支持代码自动补全功能本地没commit的代码丢失&…

【经验】linux下cuda的更换

linux下cuda的更换 查看当前cuda和cudnn的版本 nvcc -Vcudnn版本 cat /usr/local/cuda/include/cudnn.h | grep CUDNN_MAJOR -A 2下载对应版本的cuda 查看驱动版本535.54.03 下载对应的cuda版本 版本查看https://docs.nvidia.com/cuda/cuda-toolkit-release-notes/index.htm…

pytest参数化多种用法总结

pytest.mark.parametrize 是 pytest 的一个核心功能,它允许你参数化测试函数,这样你就可以使用不同的参数运行同一个测试函数多次。以下是 pytest.mark.parametrize 的详细用法总结: 基本用法 parametrize 装饰器可以接受一个或多个参数名&…

驱动:mknod-misc 杂项自动

一、杂项设备驱动 #include <linux/init.h> #include <linux/kernel.h> #include <linux/fs.h> #include <linux/module.h> #include <linux/device.h> #include <asm/io.h> #include <asm/string.h> #include <asm/uaccess.h>…

TinaSDKV2.0 自定义系统开发

TinaSDKV2.0 自定义系统开发 什么是自定义系统&#xff1f; TinaSDK Kconfig界面配置 Tina Linux采用 Kconfig 机制对 SDK 和内核进行配置。 Kconfig 是一种固定格式的配置文件。Linux 编译环境中的 menuconfig 程序可以识别这种格式的配置文件&#xff0c;并提取出有效信息…

电脑丢失dll文件一键修复之dll确实损坏影响电脑运行

在使用电脑过程中&#xff0c;DLL文件丢失或损坏是一个常见的问题&#xff0c;它可能导致程序无法正常运行&#xff0c;甚至影响整个系统的稳定性。本文将详细介绍如何一键修复丢失的DLL文件&#xff0c;探讨常见的DLL丢失报错原因&#xff0c;并提供详细的修复步骤和预防措施。…

【mysql】mysql之数据操作语言(insert、delete、update)

本站以分享各种运维经验和运维所需要的技能为主 《python零基础入门》&#xff1a;python零基础入门学习 《python运维脚本》&#xff1a; python运维脚本实践 《shell》&#xff1a;shell学习 《terraform》持续更新中&#xff1a;terraform_Aws学习零基础入门到最佳实战 《k8…

《机器学习》—— OpenCV 对图片的各种操作(均值、方框、高斯、中值滤波处理)

文章目录 1、对有椒盐噪声的图片进行均值、方框、高斯、中值滤波处理2、给图像边缘增加边框3、对图片进行阈值化操作 1、对有椒盐噪声的图片进行均值、方框、高斯、中值滤波处理 均值滤波 cv2.blur是 OpenCV 库中的一个函数&#xff0c;用于对图像进行均值模糊处理。这个函数通…

幂等性简介

幂等性&#xff08;Idempotence&#xff09;是计算机科学中的一个重要概念&#xff0c;特别是在分布式系统和网络服务中。幂等性操作的特点是&#xff0c;无论执行多少次&#xff0c;结果都是相同的。换句话说&#xff0c;幂等性操作在多次执行后&#xff0c;对系统的状态不会产…

pycharm中opencv-python和opencv-contrib安装

1.去到https://pypi.org/中查找opencv-python 和opencv-contrib-python 2.分别下载。 3.下载完后&#xff0c;打开pycharm&#xff0c;然后新建一个项目&#xff0c;设置项目配置环境为当前python环境&#xff0c; 4.打开pycharm提供的控制台&#xff0c;使用pip install 安装文…

Datawhale第五期夏令营-CV竞赛

CV竞赛 0.赛事报名租用4090 1.开始运行下载文件提交结果 2.内容解释赛题背景赛题目标社会价值评分规则baseline精读代码什么是YOLO 主要代码内容精读使用Ultraalytics运行代码 0.赛事报名 赛事官网:https://www.marsbigdata.com/competition/details?id3839107548872 租用40…

密码强度验证——js基础积累

//密码强度等级 getPwdLevel:function (pwd,minLength8) {var level 0;if (pwd.length < minLength) return level;if (/\d/.test(pwd)) level; //数字if (/[a-z]/.test(pwd)) level; //小写if (/[A-Z]/.test(pwd)) level; //大写if (/\W/.test(pwd)) level; //特殊字符ret…