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

news/2024/4/29 9:50:13/文章来源:https://blog.csdn.net/qq_63922192/article/details/127922852

需提前学习:使用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.luyixian.cn/news_show_224154.aspx

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

相关文章

利用ogg微服务版将oracle同步到kafka

ogg微服务版可以再界面上配置抽取、复制进程,不必进入到shell中进行配置,并且图形化界面可以看到更多信息。 系统架构 源端安装ogg for oracle 19C , 目标端安装ogg for bigdata 21C kafka 2.2 数据库:19C 所有软件安装在同台服务器上&#…

理解Linux32位机器下虚拟地址到物理地址的转化

文章目录前言一、基本概念介绍二、虚拟地址到物理地址的转化过程总结前言 简要介绍LINUX32位系统下虚拟地址到物理地址的转化过程。 一、基本概念介绍 在32位机器下,IO的基本单位是块(块:4kb),在程序编译成可执行程序时也划分好了以4kb为单…

JVM【类加载与GC垃圾回收机制】

JVM【类加载与GC垃圾回收机制】🍎一.JVM🍒1.1JVM简介🍒1.2JVM执行流程🍎二.JVM运行时数据区🍒2.1 程序计数器(线程私有)🍒2.2 栈(线程私有)🍒2.3 堆(线程共享)🍒2.4 方法区(线程共享…

OWASP API SECURITY TOP 10

目录 1. API 安全风险 2. 细说TOP10 1. Broken Object Level Authorization 2. Broken User Authentication 3 Excessive Data Exposure 4 Lack of Resources & Rate Limiting 5 Broken Function Level Authorization 6 Mass Assignment 7 security misconfigura…

【原创】使用Golang的电商搜索技术架构实现

作者:黑夜路人 时间:2022年11月 一、背景: 现在搜索技术已经是非常主流的应用技术,各种优秀的索引开源软件已经很普遍了,比如 Lucene/Solr/Elasticsearch 等等主流搜索索引开源软件,让我们搭建一个优秀的…

【FLASH存储器系列十】Nand Flash芯片使用指导之一

目录 1.1 芯片简介 1.2 功能框图 1.3 存储结构 1.4 信号定义 1.5 双平面(plane)操作 1.6 Die间交错操作 1.7 错误管理 今天以MT29F8G08AJADAWP芯片为例,说明nand flash的操作方法。 1.1 芯片简介 这是一款镁光的容量8Gb,总…

liunx集成jmeter进行压测实践

首先liunx环境需要部署jdk 1,获取jmeter免安装包:点击我获取免安装包 2,获取jmeter-manger工具,用于生成报告,日志等 点击我获取工具 3,在服务器上新建一个文件夹存放jmeter,推荐在/usr/local/下面,我这里由于权限问…

E 排队(排列组合)[牛客小*白月赛61]

题面如下: 思路 or 题解: 对于一个长度为 nnn 的 排列组合 如果存在一对 逆序对 (x,y)(x, y)(x,y) xxx 在 yyy 的前面有 n∗(n−1)2\frac{n * (n - 1)}{2}2n∗(n−1)​ 种情况 剩下 n−2n - 2n−2 个位置可以随意填数进去,不会影响到逆序对 …

狗屎一样的面试官,你遇到过几个?

做了几年软件开发,我们都或多或少面试过别人,或者被别人面试过。大家最常吐槽的就是面试造火箭,进厂拧螺丝。今天就来吐槽一下那些奇葩(gou)一样的面试官 A 那是在我刚工作1年的时候,出去面试前端开发。 那…

Python编程 元组的创建

作者简介:一名在校计算机学生、每天分享Python的学习经验、和学习笔记。 座右铭:低头赶路,敬事如仪 个人主页:网络豆的主页​​​​​​ 目录 前言 一.元组知识点 二.元组(tuple) 1.元组介绍(掌握) 2.元组创建(掌握) 3.…

鉴源论坛 · 观模丨浅谈随机测试

作者 | 黄杉 华东师范大学软件工程学院博士 苏亭 华东师范大学软件工程学院教授 首发 | 鉴源论坛 观模 01 什么是随机测试 (Random Testing) 随机测试是一种使用随机、相互独立的程序输入来对计算机程序进行测试的黑盒软件测试(在完全忽…

Springboot常用参数注解

访问路径为http://localhost:8080/ PathVariable GetMapping("/get/{id}/blank/{name}")public Map getValue(PathVariable("id") Integer id,PathVariable("name") String name,PathVariable Map<String,String> kv){Map map new Hash…

大一新生HTML期末作业 学生个人网页设计作业 HTML5响应式个人简历网站模板 web前端网页制作课作业

&#x1f389;精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业…

CNN (吴恩达 2021

week1-2 02_边缘检测例子_哔哩哔哩_bilibili ​ ​ 我们之前在说面部识别介绍过&#xff0c;要识别面部&#xff0c;都是从细微的边缘入手&#xff0c;一层一层聚类&#xff0c;最终实现人脸的识别。神经网络由浅层到深层&#xff0c;分别可以检测出图片的边缘特征 、局部特…

web前端大一实训 HTML+CSS+JavaScript王者荣耀(60页) web课程设计网页规划与设计 HTML期末大作业 HTML网页设计结课作业

&#x1f389;精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业…

【MySQL进阶】深入理解B+树索引底层原理

【MySQL进阶】深入理解B树索引底层原理 文章目录【MySQL进阶】深入理解B树索引底层原理一、前言——没有索引的查找1、在一个页中的查找2、在很多页中查找3、总结二、索引1、一个简单的索引方案2、InnoDB中的索引方案3、B 树4、聚簇索引5、二级索引6、回表7、联合索引三、InnoD…

【MySQL数据库笔记 - 进阶篇】(二)索引

✍个人博客&#xff1a;https://blog.csdn.net/Newin2020?spm1011.2415.3001.5343 &#x1f4da;专栏地址&#xff1a;暂定 &#x1f4dd;视频地址&#xff1a;黑马程序员 MySQL数据库入门到精通 &#x1f4e3;专栏定位&#xff1a;这个专栏我将会整理 B 站黑马程序员的 MySQL…

linux备份mysql8.0数据库脚本

文章目录环境要求步骤1、创建一个.sh文件编写shell脚本2、添加定时任务环境要求 linux系统&#xff0c;安装了mysql8.0 步骤 1、创建一个.sh文件编写shell脚本 创建文件的命令&#xff1a; vim ***.shshell文件文件参考自文章 链接 export LANGen_US.UTF-8 #注意&#xf…

Python如何爬取免费爬虫ip

做过大数据抓取的程序员应该都知道&#xff0c;正常市面上的爬虫ip只分为两种&#xff0c;一种是API提取式的&#xff0c;还有一种是账密形式隧道模式的。往往因为高昂费用而止步。对于初学者觉得没有必要&#xff0c;我们知道每个卖爬虫ip的网站有的提供了免费IP&#xff0c;可…

webpack5 Preload / Prefetch解决按需求加载速度

代码分离 | webpack 中文文档webpack 是一个模块打包器。它的主要目标是将 JavaScript 文件打包在一起&#xff0c;打包后的文件用于在浏览器中使用&#xff0c;但它也能够胜任转换&#xff08;transform&#xff09;、打包&#xff08;bundle&#xff09;或包裹&#xff08;pa…