STM32 proteus + STM32Cubemx仿真教程(第二课按键教程)

文章目录

  • 前言
  • 一、STM32按键的原理
  • 二、STM32Cubemx创建工程
  • 三、proteus仿真电路图
  • 四、程序代码编写
    • 4.1函数介绍
    • 4.2使用按键点亮LED灯
  • 总结


前言

本篇文章开始带大家学习如何使用proteus和STM32Cubemx来完成STM32的学习,第二节课我们先来学习按键的用法。

proteus使用8.9版本。

STM32Cubemx使用6.3版本。

一、STM32按键的原理

GPIO引脚配置为输入模式

首先,需要将STM32的某个GPIO引脚配置为输入模式,以便读取按键的状态。通常情况下,按键有两种连接方式:

上拉电阻连接方式:按键一端接地,另一端接GPIO引脚,同时GPIO引脚内部启用上拉电阻。当按键未按下时,GPIO引脚为高电平;按键按下时,GPIO引脚为低电平。

下拉电阻连接方式:按键一端接电源(如3.3V),另一端接GPIO引脚,同时GPIO引脚内部启用下拉电阻。当按键未按下时,GPIO引脚为低电平;按键按下时,GPIO引脚为高电平。

二、STM32Cubemx创建工程

在这里的话我们可以把之前的工程复制过来就行了,在原来的基础上我们对他进行修改即可。

在这里插入图片描述
选择一个引脚作为输入引脚

在这里插入图片描述

三、proteus仿真电路图

找到按键:
在这里插入图片描述
放置按键:

这里需要注意按键的使用的时候需要加上上拉或者是下拉电阻,防止按键处于悬空状态。

在这个电路图中当按下按键时PC6接地表现出低电平,当松开按键时PC6通过上拉电阻连接到了电源,所以此时按键表现为高电平。
在这里插入图片描述

四、程序代码编写

4.1函数介绍

HAL_GPIO_ReadPin函数
HAL_GPIO_ReadPin函数用于读取指定GPIO引脚的电平状态。

函数原型

GPIO_PinState HAL_GPIO_ReadPin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);

参数说明

GPIOx: 指定GPIO端口基地址,具体可以是GPIOA, GPIOB, GPIOC等。
GPIO_Pin: 指定GPIO引脚,使用宏定义,如GPIO_PIN_0, GPIO_PIN_1等。

返回值

GPIO_PIN_RESET(低电平)
GPIO_PIN_SET(高电平)

4.2使用按键点亮LED灯

在这里插入图片描述

这里需要注意在使用按键的时候需要进行消抖处理:

按键在机械结构上的设计导致了其在按下和释放时可能会产生抖动现象。抖动是指在按键触点闭合或断开时,触点会在短时间内快速地多次接触和断开,导致检测到的按键信号在短时间内出现多次高低电平的变化。消抖处理的主要原因包括以下几个方面:

  1. 抖动的原因
    机械结构的自然特性:按键的触点在按下和释放的过程中并不是立即稳定在某个位置,而是会发生短时间的颤动。
    弹簧或金属片回弹:按键内部的弹簧或金属片在按压和松开过程中会回弹,这会导致触点短时间内多次接触和断开。
  2. 抖动的影响
    多次检测按键按下:如果不进行消抖处理,当按键按下一次时,系统可能会检测到多次按下信号,导致按键事件被误认为是多次按下。
    误触发:抖动可能会导致不正确的按键事件触发,比如在抖动期间误认为按键已经松开。
    系统稳定性:频繁的抖动信号会增加系统的处理负担,影响系统的稳定性和可靠性。
  3. 消抖处理的方法
    消抖处理的方法主要有硬件消抖和软件消抖。

3.1 硬件消抖
硬件消抖是通过硬件电路来过滤掉按键抖动信号,常用的方法包括:

电容消抖:在按键电路中并联一个电容,利用电容的充放电特性来平滑按键信号。
施密特触发器:使用施密特触发器电路将抖动信号转换为稳定的高低电平信号。

3.2 软件消抖
软件消抖是通过编程手段在软件层面过滤掉按键抖动信号,常用的方法包括:

延时法:检测到按键状态变化后,延时一段时间(如10ms),再次检测按键状态,如果状态没有变化,则认为按键状态有效。
计数法:连续多次读取按键状态,只有在连续多次读取到相同状态时,才认为按键状态有效。
状态机法:使用状态机来管理按键状态的变化,只有在状态稳定时才进行按键处理。

总结

本篇文章就讲解到这里,大家有什么疑问都可以留言。

本篇文章代码和工程将放在微信公众号中。

回复 STM32仿真按键即可领取源码和工程。

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

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

相关文章

[docker] docker-compose-mysql.yml

引言:作为一名专业的资深开发,本地一定拥有了不少开源项目以供学习,每次都要去启动 mysql 数据库跟 redis 服务器,这种操作1.挺烦的,挺费时间,每次都要启动命令来一次;2.占用自己电脑的资源&…

五款软件推荐:U盘数据不小心删除了?帮你快速找回!

U盘数据不小心删除了怎么恢复?U盘是一种便携式存储设备,因其小巧轻便而广受欢迎。但是,U盘也常常会遇到数据丢失的问题。当U盘数据丢失时,需要找到一款可靠的数据恢复软件来恢复数据。 接下来为大家推荐5款好用的免费U盘数据恢复软…

Python 使用scrapy框架

1、安装scrapy 2、使用scrapy创建项目,在终端命令行 执行如下命令,会创建一个myproject项目 scrapy startproject myproject 3、创建完成后,目录结构如下 4、cd myproject进入项目 ,执行scrapy genspider weather ******,会在spiders下创建…

Incredibuild for Mac 来了!

Mac 开发者在寻找适合自己需求的工具时可能会遇到一些困难,因为 Mac 操作系统相对封闭,不像其他系统那样开放和灵活。尽管如此,Mac 开发者在开发应用程序时的需求(比如功能、效率等)和使用其他操作系统的开发者是类似的…

Linux中安装Docker,并使用Docker安装MySQL和Redis

1、安装docker 1卸载系统之前的docker yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-latest-logrotate \docker-logrotate \docker-engine2、安装Docker-CE #安装必须的依赖 sudo yum install -y yum-utils \device-map…

LINUX----进程替换,exec族函数

execl族函数的作用 exel族函数用于调用一个已经存在的可执行程序,将该程序的运行需要的代码区和数据区的数据覆盖原进程,这样就可以实现在一个进程中调度另一个进程. 简单实现一个小功能来看一看 mytest.c #include <stdio.h> #include <unistd.h>int main(){print…

开源VS闭源

当我们谈论大模型时&#xff0c;往往会涉及到开源和闭源两种不同的模型类型&#xff0c;开源和闭源的主要区别在于源代码的访问权限和修改能力。开源意味着软件的源代码对公众开放&#xff0c;任何人都可以查看、修改和分发源代码&#xff0c;这促进了技术的透明性、合作和创新…

抽象的java入门1.3.0

前言&#xff1a; 在1.2.0版本中我们介绍了public class hello {}并从中提取出两个新概 修饰符和作用域 public class hello {public static void main(String[] args) {System.out.println("Hello World");} } 正片&#xff1a; 这一期把剩余的内容刨析出来 pub…

【Redis学习笔记04】Jedis客户端(上)

Java客户端操作Redis Java生态丰富&#xff0c;自定义的客户端非常多&#xff0c;常见的有Jedis、Lettuce、以及Spring整合后的RedisTemplate&#xff0c;但是对于初学者而言&#xff0c;从Jedis开始入门学习是非常容易上手的&#xff0c;因为Jedis中的API与原生Redis命令高度…

Android Bugreport分析工具:ChkBugReport教程

安装&#xff1a; 如果下载地址过期请看原仓库地址的wiki&#xff0c;或许会有更新&#xff1a;https://github.com/sonyxperiadev/ChkBugReport/wiki 提前下载好如下文件&#xff1a; ​​​​​​http://sonyxperiadev.github.io/ChkBugReport/download/chkbugreport (Lau…

Python中的上下文管理器(contextlib)模块

Python中的contextlib模块提供了一些用于创建和管理上下文管理器&#xff08;context managers&#xff09;的工具。上下文管理器是实现了__enter__()和__exit__()方法的对象&#xff0c;它们通常用于确保在代码块执行前后执行某些操作&#xff0c;比如资源获取与释放、设置和重…

一分钟有60秒,这个有趣的原因你知道吗?

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

string类的模拟实现的一些改进

上回我们完成了string类的模拟实现&#xff0c;不过之前写的传统写法本篇&#xff0c;我们将要对其进行一些改进&#xff0c;写成参考的是现代写法&#xff0c;这样写可以提高可读性。 上回我们写好的string类 //string.h #pragma once#define _CRT_SECURE_NO_WARNINGS 1 #p…

常见汇编指令

下面是一些包含汇编指令 MOV、PUSH、POP、LEA、LDS、ADD、ADC、INC、SUB、SBB、DEC、CMP、MUL、DIV、AND、OR、XOR、NOT、TEST、SHL、SAL、SHR、SAR、ROL、ROR、RCL、RCR、LODS、MOVS 的例题。这些例题展示了每条指令的用法及其作用。 1. MOV 指令 MOV AX, BX ; 将寄存器 B…

github stylesmile fastboot介绍

**Fastboot是一个极速的Java Web框架&#xff0c;旨在提供高效的启动速度和低内存占用**。 Fastboot的设计理念是为了让Java应用能够以极短的时间启动&#xff0c;并且占用非常少的内存资源。项目的定位是成为Java领域内最佳的云原生解决方案&#xff0c;为开发者提供一个高效…

像素坐标系与图像坐标系

前言 在数字图像处理中&#xff0c;经常会看到使用 (x, y) 表示图像中的某个像素点。 在一些图像处理库&#xff0c;例如 Pillow 、OpenCV 、Numpy 中也会使用到坐标系处理图像的像素点。 介绍 无论是像素坐标系还是图像坐标系&#xff0c;其原理都是一样的&#xff1a; 以…

[AIGC] BFS算法详解以及实例应用

BFS&#xff08;Breadth-First Search&#xff0c;广度优先搜索&#xff09;是一种用于图的查找算法&#xff0c;可以用来解决许多问题&#xff0c;比如寻找最短路径&#xff0c;检查图是否连通&#xff0c;检查图中是否存在环等。 文章目录 BFS算法的概念BFS算法的步骤BFS示例…

UI学习(二)

UI学习&#xff08;二&#xff09; 文章目录 UI学习&#xff08;二&#xff09;布局子视图手动布局自动布局 导航控制器导航控制器基础导航控制器的切换导航栏工具栏 分栏控制器分栏控制器协议部分的内容UITableView基础部分相关的协议函数高级协议与单元格 多界面传值 布局子视…

C++迈向精通:STL的Deque复现

C迈向精通&#xff1a;STL的Deque复现 最近忙着写一个其他的小玩意&#xff0c;好久没更新博客了&#xff0c;手痒更新一下&#xff1a; 本期来讲一讲C中的STL中的deque的底层实现原理。 deque的地位 STL中的deque的地位很高 主要原因是由于泛型思想和对于其他容器的影响&am…

2024年6月9日 (周日) 叶子游戏新闻

万能嗅探: 实测 网页打开 某视频号、某音、某红薯、某站&#xff0c;可以做到无水印的视频和封面下载功能哦&#xff0c;具体玩法大家自行发挥吧。 《Funko Fusion》发布新预告 20款影视作品齐聚一堂第三人称动作游戏新作《Funko Fusion》今日发布最新实机演示。该游戏融合了整…