入门STM32--按键输入

news2024/11/25 12:22:40

        上一篇博客我们介绍了如何使用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.coloradmin.cn/o/2058107.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

我们如何将数据输入到神经网络中?

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。 下面我拿识别美女的例子来给大家介绍如何将美女的图片数据输入到神经网络中。 此例中,待输入的数据是一张图像。为了存储图像…

仿twitter社区源码推特PHP源码

源码介绍 高仿twitter源码,推特是啥我就不多说了,这套源码邮箱有点问题,发不了邮件,所以后台设置账户激活要关闭,有能力的自己修改解决,功到是还挺多的挺完美的手机h5端可以封装成软件也不错的。 安装环境…

anaconda学习笔记:复制anaconda的base环境

在anaconda的图形界面中,新建环境,可以看到,默认的包只有几个(这里是10个),像常用的numpy、pandas等等都没有,在使用过程中还需要再次安装。 而base环境有几百个(325个)这…

Java之HashMap的底层实现

Java之HashMap的底层实现 摘要HashMap的底层原理哈希值转换为数组下标节点初始化put(Object key, Object value)重写toString()get(Object key)增加泛化remove(K key) 摘要 本博客主要讲述了Java的HashMap的底层实现 HashMap的底层原理 底层原理:数组链表 过程…

【MySQL】基础入门(第一篇)

目录 一、MySQL的主要特点 二、MySQL的应用场景 三、MySQL的未来发展 四、MySQL的安装 MySQL是一个关系型数据库管理系统(RDBMS),由瑞典的MySQL AB公司开发,后来被Sun Microsystems收购,最终在2010年被Oracle公司收…

IDEA安装和使用(配图)

功能强大: 1、强大的整合能力,比如Git,Maven,Spring等 2、开箱即用(集成版本控制系统,多语言支持的框架随时可用) 3、符合人体工程学 1、高度智能 2、提示功能的快速,便捷,范围广 3、好用…

K8S的统一访问入口-Service

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:Linux运维老纪的首页…

windows本地kafka和zookeeper单机版

文章目录 一、安装zookeeper1.下载zookeeper:[zookeeper下载](https://www.apache.org/dyn/closer.cgi/zookeeper/)2.添加配置文件3.配置windows系统环境变量(可以百度)4.随便打开一个cmd 二、安装kafka1.下载kafka2.修改config目录下的server.properties 三,开始运…

队列的实现和基本操作

队列的表示和实现 <队列是仅在表尾进行插入操作&#xff0c;在表头进行删除操作的线性表&#xff1b; <表尾即an端&#xff0c;表头即a1端&#xff1b;(也称作队尾队头) <它是一种先进先出的(FIFO)线性表 <例如Q(a1,a2,a3,......,an),a1为队头&#xff0c;an…

【中介者模式】设计模式系列:解锁高效协作的秘密武器(设计实战)

文章目录 中介者模式在Java中的应用与实践1. 引言2. 中介者模式解析2.1 模式的基本概念2.2 中介者模式的角色说明2.3 模式的工作原理2.4 UML类图和时序图展示2.5 模式的优点与缺点2.6 模式的变体和扩展 3. 实现细节3.1 Java代码示例3.2 示例应用分析3.3 代码解释 4. 应用场景5.…

css中使用@property自定义属性,实现闪烁渐变背景【2024新属性】

自 2024 年 7 月起&#xff0c;此功能适用于最新的设备和浏览器版本。此功能可能无法在较旧的设备或浏览器中使用。 property 是 CSS 中一个相对较新的功能&#xff0c;主要用于定义自定义属性&#xff08;即 CSS 变量&#xff09;的类型、继承性以及初始值。它允许开发者更好地…

linux使用nginx部署springboot + vue分离项目

第一步,打包后端项目 maven打包springboot项目为jar文件,上传到服务器,然后运行此jar,具体操作参考: centos部署jar包_centos jar 静态资源文件-CSDN博客 第二步,安装nginx 具体操作自行查找,相关命令: 启动: /usr/local/nginx/sbin/nginx 重新加载配置: /usr…

[数据集][目标检测]木材缺陷检测数据集VOC+YOLO格式2383张10类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;2383 标注数量(xml文件个数)&#xff1a;2383 标注数量(txt文件个数)&#xff1a;2383 标注…

PyQt5基础控件

一、按钮 (一)普通按钮QPushButton 1.创建按钮控件 QPushButton()&#xff1a;创建一个无父控件的按钮控件QPushButton(parent)&#xff1a;创建控件的同时, 设置父控件QPushButton(text, parent)&#xff1a;创建控件的同时, 设置提示文本和父控件QPushButton(icon, text, …

自定义组件上传到maven中央仓库2024实测可用最详细版

自 2024 年 3 月 12 日起&#xff0c;官方调整了发布的方式&#xff0c;所有发布都必须通过中央门户&#xff0c;以往老方式可能不适用&#xff0c;以下记录2024新版上传发布方式 注册sonatype账号 Maven中央仓库并不支持直接发布jar包&#xff0c;sonatype是其指定的第三方仓…

【Python】函数进阶(上)

本篇文章将讲解函数进阶的知识&#xff1a; &#xff08;1&#xff09;函数的补充 &#xff08;2&#xff09;函数名是什么 &#xff08;3&#xff09;返回值和print &#xff08;4&#xff09;函数的作用域 1、函数的补充 &#xff08;1&#xff09;参数内存地址相关 如何查…

【算法专题】滑动窗口类

个人主页&#xff1a;CSDN_小八哥向前冲~ 所属专栏&#xff1a;算法基础入门 目录 长度最小的子数组 无重复字符的最长子串 最大连续1的个数 将x减到0的最小操作数 水果成篮 找到字符串中所有字母异位词 最小覆盖字串 长度最小的子数组 题目&#xff1a;【LeetCode】长度…

Python生成432Hz音频

使用 numpy 来生成信号&#xff0c; 使用 matplotlib 可视化信号&#xff0c; 使用 sounddevice 播放声音。 以下生成和播放 432 Hz 的正弦波信号&#xff1a; import numpy as np import sounddevice as sd import matplotlib.pyplot as plt# 生成单音函数 def generate_to…

订单完工数量超过了最大可完工数量

本次完工将造成订单YWS-24070027产出实际完工数量达到了6093.000000000&#xff0c;超过了最大可完工数量5000.000000000 一个成品入库单被它们玩坏了。生产不知道生产了什么。PMC不知道要入库什么。鸡同鸭天天开会之后结果就是单据重复的开立&#xff0c;删除&#xff0c;开立…

C++ TinyWebServer项目总结(5. Linux网络编程基础API)

还是给我的语雀文档打个广告&#xff1a; 《5. C TinyWebServer项目总结&#xff08;5. Linux网络编程基础API&#xff09;》我的文章都是先在语雀里记录的&#xff0c;然后再同步发送到CSDN上&#xff0c;有些格式问题实在是懒得改了&#xff0c;可能会导致大家看的不舒服&…