详细了解stm32---按键

news2024/11/17 11:52:09

提示:永远支持知识文档免费开源,喜欢的朋友们,点个关注吧!蟹蟹!

目录

一、了解按键

二、stm32f103按键分析

三、按键应用


一、了解按键

         同学们,又见面了o(* ̄▽ ̄*)ブ,最近降温了,注意保暖哦!这次我们来了解stm32中的按键操作 ,首先我们需要了解什么是按键,以及按键的基本结构,如下图就是我们按键的基本结构:

按键是什么呢?说专业一点,按键就是一种电子开关使用时轻轻按开关按钮就可以使开关接通,当松开手的时候,开关断开。说白了按键就是用来实现一个电路的通路以及断开操作的开关。

看完上图之后我们该如何给按键接线呢?假设我们一定要接1引脚,但是接1,2呢?、还是接1,3呢?假设我们接的是1,3,此时电路是不是一直是通路,当我们按下按键和不按下按键是不是都是同一个结果,因为1,3相连引脚初始是导通的,那我们还能实现按键操作吗?不能吧,所以我们应该接1,2引脚吧,同样的我们也可以接1,4引脚对吧,等等。

通常的按键所用开关为机械弹性开关,当机械触点断开、闭合时,电压信号如图:

在图中我们可以看出,理想的按键电压信号波形图是空闲状态维持一种电平(低电平或者是高电平,具体需要我们自己根据电路图配置),当我们 按下按键的时候,电压信号波形产生一个跳变吧,当我们松开按键的时候电压又跳变回原来的状态,有了这种跳变,我们是不是就可以根据电压的这一特性来实现控制某一个灯的开关啦,或者某一外设的开关?

但实际情况却有些差强人意,因为当我们按下按键的时候,按键会产生一个机械抖动,这个抖动会影响我们对电压信号波形的判断,就比如我们不小心碰了一下按键,灯就开了,这样过于灵敏是不是不太好呀?那我们该如何去解决这个问题呢?可以用延时吧?就是那个systick,延时10ms或者20ms,当经过10ms之后如果电平还是维持在一个低电平或者高电平我们是不是就可以判断按键按下了,这样就可以解决误触这个问题了,当然这不是最优解决方法,更优解决方法我们可以通过外部中断去实现。

 ok,知道这些之后我们接下来可以通过按键来实现stm32上的一个灯的控制了,我们先来分析按键的原理图

二、stm32f103按键分析

我们怎么去看这个图呢?看网络标号吧,看网络标号对应哪个引脚吧,比如这个WK_UP这个网络标号就连接在如下图:

WK_UP对应的引脚是PA0吧,这个按键我们可以用来当作一个普通的按键来用,当然也可以用来当作唤醒,外部中断的一个唤醒按键,那什么时候需要唤醒呢?就是当我们的这个芯片进入到一个睡眠模式,或者是待机模式,或者什么什么模式,反正就是低功耗的模式里面其中一种,我们可以通过这个按键来唤醒我们这个系统。

我们先来分析一下,我们这个按键按下之后识别到什么电平:

我们拿WK_UP(PA0)引脚来举例,当我们按下按键之后,我们在引脚可以识别到一个高电平吧?为什么?因为我们这个按键外部接了一个3.3V的上拉电阻,当我们按下按键之后我们就可以读到一个高电平。再问大家一个问题,我们WK_UP(PA0)引脚该配置成输入还是输出模式呢?我们站在芯片的角度考虑,我们是需要去读取WK_UP(PA0)引脚的输出电平对吧,所以我们是需要将WK_UP(PA0)配置成输入模式。我们通过读取它的电平变化来判断按键是否按下。那么就需要WK_UP(PA0)引脚有一个电平的变化,这样我们才能通过这个电平的变化来判断按键是否按下。好,那么,当我们按键有按下的时候WK_UP(PA0)引脚处于高电平,而我们又需要这个引脚有一个电平跳变,故我们应该给这个引脚配置成下拉输入模式吧,这样,当WK_UP(PA0)引脚处于空闲状态时就处于低电平,当我们按下按键的时候电平跳变成高电平,所以我们就可以通过这个电平变化来判断按键是否按下。

三、按键应用

ok,我们现在可以来尝试着写一下代码,我们板子上有三个按键,我们尝试着用WK_UP(PA0)来点亮灯,用PC8来熄灭灯,用PC9来使灯闪烁。

代码如下:

首先我们要知道一个函数(以下的函数在固件库中可以查询到):

其中有两个 函数我们需要注意:

GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, u16 GPIO_Pin);

GPIO_ReadInputData(GPIO_TypeDef* GPIOx)

其中:

第一个函数有两个参数,第一个是选择要读取的GPIO,第二个参数是选择要读取的GPIO对应的引脚

第二个函数就只有一个参数,也就是说第二个函数使用来读取一组GPIO引脚的

我们用按键点灯需要的是一个引脚吧,不需要读取一组GPIO吧,所以我们选择第一个函数进行GPIO的输入读取。

好,知道这些之后我们就可以正式开始写代码了:

代码如下:

key.c文件:

#include "key.h"
u8 key_flag;
void Key_Init(void)
{
	GPIO_InitTypeDef  GPIO_InitStruct;
	/*打开时钟*/
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOC, ENABLE);
	/*配置GPIO*/
	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPD;/*下拉输入*/
	GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0;
	GPIO_Init(GPIOA, &GPIO_InitStruct);

	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPU;/*上拉输入*/
	GPIO_InitStruct.GPIO_Pin = GPIO_Pin_8|GPIO_Pin_9;
	GPIO_Init(GPIOC, &GPIO_InitStruct);
}


void Read_Key(void)
{
	/***以下的代码还有很多可以修改的地方,比如说可以用位带操作简化GPIO读取操作,还可以用外部中断来处理延时产生的问题等等***/
	if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0) == SET)
	{
		/*消除抖动*/
		delay_ms(20);
		if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0) == SET)
		{
			key_flag = 1; 
		}
		if(GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_8) == RESET)
		{
			key_flag =  2;
		}
		if(GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_9) == RESET)
		{
			key_flag = 3;
		}
	}
}

main.c文件:

#include "systick.h"
#include "usart_drv.h"
#include "key.h"
#include "led.h"
extern u8 key_flag;
void HardWare_Init(void)
{
	SysTick_Init(72);
	Usart_MyConfig(115200);//这个串口可以用来调试代码用
	Key_Init();
}

int main(void)
{

	HardWare_Init();
	while(1)
	{
		Read_Key();
		switch (key_flag)
			{
				case 1:
					LED_Ctrl(LED_0, LED_ON);
					break;
				case 2:
					LED_Ctrl(LED_0, LED_OFF);
					break;
				case 3:
					delay_ms(200);
					LED_Ctrl(LED_0, LED_ON);
					delay_ms(200);
					LED_Ctrl(LED_0, LED_OFF);
					break;
			}
	}
}

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

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

相关文章

我在代码随想录|写代码之203. 移除链表元素,707. 设计链表,206. 反转链表

​第一题 ​​ 203. 移除链表元素 题目: 思路分析: 我们要删除节点说白了就是将节点移除,将要删除的节点的前一个的next域移动到要删除节点的next域,我们可以这样写当我们运到我们要删除节点然后件他删除,那么怎么删除?我们可以直接让我们要删除的元素找不到。如果我们直接将…

如何在Centos 7环境下安装MySQL并登录

目录 先获取MySQL官方yum源 然后正常使用yum命令下载mysql即可完成MySQL的下载 使用mysql客户端登录mysqld服务端 能够登录mysql客户端后,我们最后还需要做一点配置 先获取MySQL官方yum源(包括对yum源的介绍) 介绍一下yum源 yum源就是一…

k8s如何部署seata(分布式事务)?(第一篇)

k8s如何部署seata(分布式事务)? 官方传送门https://seata.io/zh-cn/ 快速入门SEATA Seata 是一款开源的分布式事务解决方案,致力于提供高性能和简单易用的分布式事务服务。Seata 将为用户提供了 AT、TCC、SAGA 和 XA 事务模式,为用户打造一站…

RMQ算法总结

知识概览 RMQ又叫ST表、跳表,可以用来解决区间最值问题,这里这有查询没有修改。当然,这样的问题用线段树也是可以解决的。RMQ算法本质上是倍增动态规划,它的思想是先倍增预处理再查询。f(i, j)表示从i开始,长度是的区…

TableAgent:让数据分析变得轻松简单,导师再也不用担心我的数据分析能力啦!

TableAgent——导师再也不用担心我的数据分析能力啦 1. TableAgent介绍1.1 TableAgent——数据分析智能体1.2 背后强大的技术支持 2. TableAgent注册3. TableAgent使用3.1 入门级使用3.2 魔鬼级使用 4. 对比使用5. 总结 1. TableAgent介绍 1.1 TableAgent——数据分析智能体 …

PostgreSQL向量数据插件--pgvector安装(附PostgreSQL安装)

PostgreSQL向量数据插件--pgvector安装 一、版本二、数据库安装1. 在官网下载PostgreSQL14.0的安装包2.增加用户postgres3.解压安装 三、pgvector安装1. 从github上克隆下来2. 安装pgvector插件3. 开始使用pgvector启用pgsql命令行创建扩展 本文为本人在安装pgvector中踩过的坑…

Postgresql在Windows中使用pg_dump实现数据库(指定表)的导出与导入

场景 Windows中通过bat定时执行命令和mysqldump实现数据库备份: Windows中通过bat定时执行命令和mysqldump实现数据库备份_mysqldump bat-CSDN博客 Windows上通过bat实现不同数据库之间同步部分表的部分字段数据: Windows上通过bat实现不同数据库之间…

Java EE 多线程之线程安全的集合类

文章目录 1. 多线程环境使用 ArrayList1. 1 Collections.synchronizedList(new ArrayList)1.2 CopyOnWriteArrayList 2. 多线程环境使用队列2.1 ArrayBlockingQueue2.2 LinkedBlockingQueue2.3 PriorityBlockingQueue2.4 TransferQueue 3. 多线程环境使用哈希表3.1 Hashtable3.…

Spring深入学习

1 Bean创建的生命周期 Spring bean是Spring运行时管理的对象。Spring Bean的生命周期指的是Bean从创建到初始化再到销毁的过程,这个过程由IOC容器管理。 IOC即控制反转,是面向对象编程中的一种设计原则,通过依赖注入(DI&#xf…

TrustZone之中断及中断处理

一、中断 接下来,我们将查看系统中的中断,如下图所示: 通用中断控制器(GIC)支持TrustZone。每个中断源,在GIC规范中称为INTID,分配到以下三个组之一: • Group0:安全中断,以FIQ方式发出信号 • 安全Group1:安全中断,以IRQ或FIQ方式发出信号 • 非安全Gr…

SuperMap iManager 11i(2023) SP1新特性汇总

作者:ls 【目录】 (一)GIS云套件支持发布聚合服务(二)GIS云套件支持自定义/修改服务接口信息(三)GIS云套件管理界面支持批量修改镜像(四)GIS云套件管理界面可调整服务节点…

iA Writer for Mac:释放创作力的专业MarkDown写作软件

iA Writer for Mac是一款专业的MarkDown写作软件,为Mac用户提供了简洁、高效的写作环境。无论您是一名专业写作人员、学生或博主,iA Writer都能帮助您以最简单的方式将想法转化为文字。 首先,iA Writer的界面非常简洁,只展示您正…

MATLAB 系统辨识 + PID 自动调参

MATLAB 系统辨识 PID 自动调参 Matlab R2021b下载安装详细教程Chapter1 MATLAB 系统辨识 PID 自动调参1. 导入数据2. 系统辨识3. PID 自动调参 Chapter2 MATLAB系统辨识Chapter3 【MATLAB】使用系统辨识工具箱(System Identification)建模Chapter4 matlab系统辨识工具箱及其反…

网络服务IP属地发生变化的原因有哪些?

近期,许多用户发现自己的网络服务IP属地发生了变化。原本固定的IP地址不再是静态的,而是发生了变动。这一现象引起了广大用户的关注和疑惑,对网络服务的使用和信息安全产生了影响。为了解决用户的疑虑,我们对此现象进行了深入探究…

云仓酒庄带您品法国葡萄酒

说起葡萄酒肯定绕不开法国,法国葡萄酒闻名中外,口碑卓越。作为世界上的产酒大国,可以说是每一寸土地都可以种植葡萄。云仓酒庄的品牌雷盛红酒分享这么优秀的一个葡萄酒产酒国有哪些特点呢? 1.产区特色:波国有最著名的…

js输入框部分内容不可编辑,其余正常输入,el-input和el-select输入框和多个下拉框联动后的内容不可修改

<tr>//格式// required自定义指令<e-td :required"!read" label><span>地区&#xff1a;</span></e-td><td>//v-if"!read && this.data.nationCode 148"显示逻辑<divclass"table-cell-flex"sty…

百华鞋业入围全国老年用品标准编制参编单位

12月8日&#xff0c;中国轻工业信息中心组织召开了中国轻工业适老系列标准研讨会。中国轻工业联合会信息统计部&#xff08;中国轻工业信息中心&#xff09;副主任马真出席会议并讲话。中国轻工业信息中心标准工作负责人孟慧敏介绍了相关标准制定情况。会议由中国轻工业信息中心…

Cellinx NVT 摄像机 GetFileContent.cgi任意文件读取漏洞 (CVE-2023-23063)

0x01 产品简介 Cellinx NVT IP PTZ是韩国Cellinx公司的一个摄像机设备。 0x02 漏洞概述 Cellinx NVT v1.0.6.002b版本存在安全漏洞&#xff0c;该漏洞源于存在本地文件泄露漏洞&#xff0c;攻击者可读取系统密码等敏感信息。 0x03 复现环境 FOFA&#xff1a;body"loc…

LAMP平台——构建PHP运行环境

在构建LAMP平台时&#xff0c;各组件的安装顺序依次为Linux、Apache、MySQL、PHP。其中Apache和 MySQL的安装并没有严格的顺序&#xff1b;而PHP环境的安装一般放到最后&#xff0c;负责沟通Web服务器和数据库 系统以协同工作。 PHP 即 Hypertext Preprocessor&#xff08;超级…

连续型随机变量的概率密度

如果对于随机变量的分布函数&#xff0c;存在非负可积函数&#xff0c;使得对于任意实数&#xff0c;有&#xff1a; 那么就称为连续型随机变量&#xff0c;称为的概率密度函数&#xff0c;简称密度函数。