使用STM32CubeMX实现按下按键,电平反转

news2025/7/25 21:08:53

需提前学习:使用STM32CubeMX实现LED闪烁

目录

原理图分析

按键部分原理图分析

LED部分原理图分析

STM32CubeMX配置

关于STM32CubeMXSYS的Debug忘记配置Serial Wire处理办法

GPIO配置

LED的GPIO配置

 KEY1配置

关于PA0后面这个WKUP是什么?

那么啥又是低功耗呢?

生成keil文件

关于宏定义失败问题

Keil程序编写

HAL_GPIO_ReadPin()

函数声明

GPIOx和GPIO_Pin

返回值

while(1)内容

软件消抖

按键抖动相关知识

软件消抖


我们有了上一章博客的基础之后,大概了解了STM32CubeMX的使用。现在我们先分析按键的电路图,再进行实战。

原理图分析

按键部分原理图分析

首先我们看原理图得知

按键分析

(1)如果K1没有被按下,PA0引脚是连接的GND的(这个是外部下拉,后面会介绍)。

(2)如果按键被按下,那么PA0是R4并联,此时3.3V输出的电流将会流入GND和PA0,那么此时PA0为是显示的高电平。

其他器件分析

(3)R4和R7作用,用于限流。STM32F103系列单片机,IO总输入电流不得超过25mA

(4)C6是一个电容0.1uf的电容,用于硬件消抖。玩过51单片机的人都知道,我们进行按键行为的时候,都需要一个软件消抖。但是假如我们在按键上并联一个电容,能够做到硬件消抖,这样就不在需要麻烦软件进行软件消抖了。

LED部分原理图分析

我们看到这里的LED是外接的高电平,所以引脚需要置为低电平,LED才会亮。 我们这里配置PB0

 注意,我上一个博客,LED是外接的GND(低电平),所以才是高电平LED亮。

STM32CubeMX配置

我们这里需要让按下按键K1,电平反转。不会新建工程的建议看完STM32CubeMX新建工程并点亮一个LED;

关于STM32CubeMXSYS的Debug忘记配置Serial Wire处理办法

再次强调,需要在SYS的Debug中,将其配置为Serial Wire!!!不然你的板子变成一块砖头就不关我的事情了

如果你真的忘记选择了,怎么办呢?

(1)先将BOOT0和BOOT1引脚都直接连接3.3V(使用跳线帽或者杜邦线连接均可)

(2)烧录配置好Serial Wire的程序

(3)重新将BOOT0和BOOT1连接到GND。现在就是正常了。

GPIO配置

LED的GPIO配置

首先先是配置LED,因为我们需要点灯,所以还是设置为输出。按照下图配置即可

 KEY1配置

(1)上面看原理图我们直到KEY1对应的是PA0,所以我们需要初始化PA0为输出

(2)我们直到,当按键按下。PA0为高电平,所以我们这里PA0需要配置为下拉输入

拉输入的意思是,如果GPIO默认电平为什么。如果无上下拉,那么GPIO为悬空的。GPIO悬空状态我遇到的情况只有三种,第一是GPIO为输出,第二种是GPIO复用为ADC引脚,第三种就是GPIO为输入,但是有外接上下拉。

(3)我们现在PA0是有一个外接的下拉电阻的,所以可以配置为悬空输入,但是我还是建议配置为下拉输入

 STM32CubeMX配置如下:

关于PA0后面这个WKUP是什么?

我们发现,PA0后面接了一个WKUP。但是其他的GPIO,像是PB0后面都没有接东西。这个WKUP是什么呢?

唤醒MCU,比如当MCU在低功耗状态下或者休眠之类的状态下,通过引脚的Wakeup功能可以将MCU唤醒,让MCU进入正常的工作状态。 

那么啥又是低功耗呢?

(1)低功耗你可以理解为你收集熄屏状态,他在运行,但是耗电更少。当我们按下开机键(也就是现在的PA0-WKUP),手机亮屏。

(2)很不幸的是,我们玩stm32一般不管低功耗这东西。你可以理解为,你的手机永远不会熄屏,除非电池没有电了,他的屏幕永远是亮着的。

生成keil文件

详情看:STM32CubeMX新建工程并点亮一个LED的文件生成部分

关于宏定义失败问题

我们发现我们明明设置了宏定义,但是生成的文件依旧是 GPIOB和GPIO_PIN_0。而不是LED_G_GPIO_Port和LED_G_Pin。

原因可能是因为我们设置的是PA0引脚,这个跟低功耗有关,我们设置了这个之后,会发现SYS有一个感叹号。这个感叹号可以不用管,唯一造成的影响是宏定义失败了。

Keil程序编写

HAL_GPIO_ReadPin()

这个函数作用是读取GPIO电平。

函数声明

GPIO_PinState HAL_GPIO_ReadPin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin)

GPIOx和GPIO_Pin

这个我在上一个博客已经说过了。不再重复

返回值

GPIO_PIN_SET     //如果引脚是高电平返回这个
GPIO_PIN_RESET   //如果引脚是低电平返回这个

while(1)内容

因为初始化部分,STM32CubeMX以及帮我们做好了,所以我们只需要再死循环里面操作。

需要注意的一点是,按键需要一个循环等待松手。

  while (1)
  {
        //写这个函数是因为一开始,我按下按键LED无变化,测试LED是否正常
		//HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_RESET);
    /* USER CODE END WHILE */
		if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0) == GPIO_PIN_SET)  //如果按键按下为高电平
		{
			HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_0);  //反转电平
			while(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0) == GPIO_PIN_SET); //这里需要等待松手,不然会出现LED快速反转,可能导致我们看不到LED亮灭的情况
		}
		
    /* USER CODE BEGIN 3 */
  }

软件消抖

按键抖动相关知识

虽然我们野火的指南者开发板具备硬件消抖,但是正点原子的开发板好像是没有硬件消抖的。所以我还是讲解一下。

这里先推荐一篇文章:独立按键的工作原理

一般机械按键按下都会有一个5~20ms的机械抖动。

(1)对于单片机而言就是如下。因为程序运行时间很短,一个while循环很大可能1ms都不需要

(2)当我们按下按键的时候,正常人都是需要零点几秒,也就是几百ms,这已经进行了几次while循环了。那么就会出现一个问题,我们明明只按下了一次,但是单片机会认为我们按下了很多次。

软件消抖

(1)既然存在5~20ms的按键抖动,那么我们当我们检测到高电平的时候,等待20ms,重新判断是否为高电平。如果依旧是高电平,那么此时按键被按下了。

(2)需要注意一点,按键抖动不仅按下的时候有抖动,松手的时候也有抖动啊。为什么while(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0) == GPIO_PIN_SET);之后不在进行一次20ms 的延时呢?

(3)原因很简单,如果这次死循环结束了,重新开始死循环,第一次if判断在松手的按键抖动里面检测到是高电平。那么进入第一个if语句,延时20ms,此时松手的按键抖动已经过去了,那么电平必然是低电平。所以第二个if语句无法通过。

  while (1)
  {
    /* USER CODE END WHILE */
		if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0) == GPIO_PIN_SET)
		{
			HAL_Delay(20);  //等待按键抖动过去
			if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0) == GPIO_PIN_SET) //重新判断电平
					HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_0);  //如果按键真的被按下了,反转电平
			while(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0) == GPIO_PIN_SET);
		}
		
    /* USER CODE BEGIN 3 */
  }

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

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

相关文章

Linux开发工具(4)——Makefile

文章目录Makefilemakefile语法makefile原理Linux小程序倒计时小程序进度条程序Makefile Makefile是Linux下的项目自动化构建工具。 Makefile包含两部分,make是一个指令,makefile是一个文件。 在makefile这个文件里面需要写两部分内容: 依赖…

【LeetCode】891.子序列宽度之和

**> ## 题目描述 一个序列的 宽度 定义为该序列中最大元素和最小元素的差值。 给你一个整数数组 nums ,返回 nums 的所有非空 子序列 的 宽度之和 。由于答案可能非常大,请返回对 109 7 取余 后的结果。 子序列 定义为从一个数组里删除一些&#xff…

Scala009--Scala中的数据结构【映射】

目录 一,概述 二,map的声明 1,不可变map 三,HashMap的声明 1,可变hashmap 四,map常用函数 1,查看map中的元素个数 size 2,获取map集合中key对应的value值 1)使…

react源码中的hooks

今天,让我们一起深入探究 React Hook 的实现方法,以便更好的理解它。但是,它的各种神奇特性的不足是,一旦出现问题,调试非常困难,这是由于它的背后是由复杂的堆栈追踪(stack trace)支…

更新后的python seaborn用于科研图绘

python seaborn 0.12 数据科学和科研绘图的人离不开R的ggplot2,尽管python已经有了诸如matplotlib、seaborn等强大绘图包,兼有basemap、cartopy等空间数据可视化能力,但相较于R的ggplot,总感觉欠缺了点东西。 前不久seaborn更新…

Ubuntu系统安装

一、制作启动盘 首先格式化U盘,格式选NTFS 制作启动盘,这里使用的是ultraISO,也是使用最多的方式。 打开文件,选中下载好的镜像iso文件。 启动 -> 写入硬盘映像 选择自己的U盘,写入方式选择 USB-HDD,隐…

进程地址空间详解

文章目录空间布局图首先有一个问题,我们曾经学过的程序地址空间是内存吗???为什么fork()会返回两个值先来看一下一个代码的现象在这里插入图片描述在C/C中我们看到的地址是物理地址吗?为什么操作系统不让我直接看到物理…

SpringBoot整合RabbitMQ

RabbitMQ安装部署详情可见&#xff1a;RabbitMQ简介及在Linux中安装部署&#xff08;yum&#xff09; 一、导入pom.xml依赖 <dependency><groupId>com.rabbitmq</groupId><artifactId>amqp-client</artifactId><version>5.8.0</versio…

简单的抓包

验证TCP/IP协议栈结构、帧结构 准备&#xff1a; 用到的软件&#xff1a;科来网络分析系统、putty 1&#xff09;准备两台虚拟机&#xff08;我这里准备windows2003、7&#xff09;&#xff0c;并让两台虚拟机可以互相通信&#xff08;配置IP&#xff0c;让他们处于同一局域网…

基于SSM的网络教学(作业)管理系统

1、项目介绍 基于SSM的网络教学&#xff08;作业&#xff09;管理系统拥有三种角色&#xff1a;管理员、教师和学生 管理员&#xff1a;教师管理、学生管理、课程管理、教学信息管理、作业管理、试卷管理、试题管理、论坛管理、系统管理、考试管理等 教师&#xff1a;课程信…

【快速上手系列】使用支付宝沙箱环境进行支付测试的快速上手

【快速上手系列】使用支付宝沙箱环境进行支付测试的快速上手 步骤 一、支付宝开放平台 1、进入支付宝开放平台&#xff0c;登录&#xff0c;然后点击控制台&#xff0c;划到最下面&#xff0c;点击沙箱 2、APPID一会要用到&#xff0c;然后将接口加签方式选择为自定义密钥&a…

【Bio】基础生物学 - 细胞膜 cell membrane

文章目录1. 细胞膜1.1 内平衡1.2 选择透过性1.3 流动镶嵌模型Ref1. 细胞膜 没有细胞膜&#xff0c;就没有细胞。 不论是否有细胞壁&#xff0c;所有的细胞都有细胞膜&#xff0c;也叫做 质膜 (plasma membrane)\blue{\text{质膜 (plasma membrane)}}质膜 (plasma membrane)。…

RabbitMQ系列【10】死信队列

有道无术&#xff0c;术尚可求&#xff0c;有术无道&#xff0c;止于术。 文章目录概念创建死信交换机、队列过期导致死信拒接消费长度限制概念 无法被消费的消息被称为死信&#xff0c;存放死信的队列也就是死信队列。 由于某些特定的原因导致队列中的某些消息无法被消费&am…

【数据结构】c++栈的应用:波兰式、逆波兰式和中缀表达式计算器

********************************************************************************************************* 本文作者科大MF22某班Noah懒羊羊同学&#xff0c;为大家提供一个作业思路&#xff0c;请勿直接copy&#xff01;&#xff01;&#xff01;一起进步学习~ ********…

Mac 通过docker安装MinIO

前言 最近MeterSphere出了新版本&#xff0c;新版本架构是这样的&#xff08;如下图&#xff09;。采用了SpringCloudSpringBoot 微服务的架构的。跟以往相比&#xff0c;多了一个新的组件&#xff0c;MinIO。也就是分布式存储。 关于MinIO 1、MinIO是什么&#xff1f; 官方…

[附源码]java毕业设计某互联网公司人力资源管理系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

【C语言】操作符详解

目录 1、操作符分类 2、算术操作符 3、移位操作符 (二进制) 3.1 左移操作符 3.2 右移操作符 4、位操作符 5、赋值操作符 6、单目操作符 6.1 单目操作符介绍 6.2 sizeof和数组 7、关系操作符 8、逻辑操作符 9、条件操作符 10、逗号表达式 11、下标引用、函…

微信对账单功能开发(V2)

下载交易账单接口开发 应用场景&#xff1a; 商户可以通过该接口下载历史交易清单。比如掉单、系统错误等导致商户侧和微信侧数据不一致&#xff0c;通过对账单核对后可校正支付状态。 注意&#xff1a; 1、微信侧未成功下单的交易不会出现在对账单中。支付成功后撤销的交易…

Azure Integrator Delphi版

Azure Integrator Delphi版 Azure Integrator包括表、队列和Blob等标准Windows Azure结构的实现&#xff0c;使开发人员能够快速轻松地将基于云的数据存储、队列管理、表配置等添加到任何桌面、Web或移动应用程序中。 Azure Integrator功能 用于访问Windows Azure表、Blob和队列…

python folium 实现地图平台制作

python实现泸定地震点观测平台制作 数据来自[走天涯徐小洋地理数据科学]&#xff0c;原始数据来自微博中国地震台网 的正式测定数据。 以下是地震点的数据&#xff1a; MagnitudeDateTimeLongitudeLatitudeDepth6.82022-9-512:52102.0829.59163.12022-9-65:28102.0729.64113…