02 HAL库驱动按键响应外部中断

引言:这里我采用的实验平台可能跟大家的不太一样,文章的图像是一块资源拓展板, 主控板式fs_mp1a, 该板子的SOC是stm32mp157a, 有两个内核一个A7, 一个M4.但是实验的流程肯定都是一样的, 因为都是裸机程序嘛。

一、按键简介


        在单片机应用中,按键是一种常见的输入设备,用于接收用户的操作信号。按键通常由金属触点和弹簧组成,当按键被按下时,触点闭合,产生一个输入电平信号。

以下是关于单片机中使用的按键的一些简要说明:

1. 使用方法:按下按键,则按键闭合,单片机可以检测到按键的状态变化。可以通过轮询(Polling)或中断(Interrupt)的方式来检测按键的状态。

2. 接线方法:按键通常需要连接到单片机的IO口上。按键一端连接到单片机的IO引脚,另一端连接到电源或地线。为了防止按键抖动的干扰,可以在按键与IO引脚之间添加一个适量的电容或者使用软件消抖算法。

3. 按键状态检测: - 轮询方式:在主循环中通过查询IO口的电平状态来检测按键是否按下。缺点是资源浪费,需要不断轮询IO口,可能造成系统响应慢。 - 中断方式:通过将按键引脚配置为中断引脚,在按键状态改变时触发中断,单片机可以立即响应。这种方式能够减少对处理器资源的占用。

4. 按键的多功能应用:通过编程的方式,可以实现按键的多功能应用,例如单击、长按、双击等不同动作触发不同的事件。

5. 按键防抖:由于按键本身的物理性质,可能会出现按键抖动问题。为了消除抖动的影响,可以设置一个适当的延迟时间,在此时间范围内检测到按键的变化,才认定为有效按键。 总之,在单片机应用中,按键的使用可以方便地实现用户交互,增加了单片机系统的灵活性和可操作性。

二、 实验步骤


1. 查看按键原理图

可以看到, 当按键按下,与KEY1网络标号相连接的引脚读到的将是低电平

2. 配置工程

将KEY1对应的引脚配置为输入模式, 也可以将其配置为GPIO的外部中断模式, 这里也就是上面按键介绍的类中工作模式一种是轮询, 一种是中断异步的方式。这里采用的是第二种实验方式。

大家不要奇怪我的SOC的封装怎么这么奇怪, 这里给大家介绍一下SOC的常见封装。

SOC(System on a Chip)是指将所有系统功能集成到一颗芯片中的集成电路。它集成了处理器、存储器、外设接口、电源管理等功能,使得一个完整的计算系统能够放入一个单一的芯片中。SOC芯片是现代嵌入式系统中常见的核心组件。

常见的SOC封装有以下几种:

1. BGA(Ball Grid Array)封装:BGA封装是目前应用最广泛的封装之一,芯片底部有一定数量的焊点球形排列成网状,通过焊接与印刷电路板(PCB)相连接。它具有密集的引脚布局和良好的热散发能力,适用于高性能和高集成度的SOC芯片。

2. LGA(Land Grid Array)封装:LGA封装与BGA非常相似,芯片的引脚以方形或长方形排列在芯片底部,通过焊接连接到PCB。LGA封装通常比BGA封装更容易维修和更容易替换。 3. QFN(Quad Flat No-leads)封装:QFN封装是一种表面焊接封装,引脚位于封装底部的芯片引脚焊盘上,没有外露引脚。它具有尺寸小、体积小、成本低、性能良好等优点,适用于小型和低功耗的SOC芯片。

4. LQFP(Low-profile Quad Flat Package)封装:LQFP封装是一种具有四个平坦的边框和引脚的封装,引脚沿封装底部延伸。LQFP封装具有良好的热散发能力和可靠性,并且广泛应用于各种芯片封装。

5. CSP(Chip Scale Package)封装:CSP封装是一种非常紧凑的封装形式,芯片尺寸接近封装的尺寸,因此称为芯片级封装。它具有小尺寸、低成本、低功耗等优点,适用于小型和低功耗SOC芯片的集成。

这些是SOC芯片常见的几种封装类型,不同的封装具有不同的特点和适用场景,开发者可以根据具体需求选择合适的封装来设计和应用SOC芯片。

这里博主采用的实验平台是引脚处于soc下面的封装形式。

3. 函数编写

在这个位置可以找到我们的中断处理函数的定义

下面让我们一起追一下这个代码, 可以看到在这个中断处理函数中调用了别的函数, 这种函数的专业术语叫做非叶子函数。让我们跳过去看一下这个函数。

在这个函数中我们可以看到,这个函数根据我们设置的中断触发方式区分了一下调用的函数, 也就是图中光标的所在位置的那个函数。 

我们再跳转, 对了, 跳转时鼠标右键, 打开声明那一项。

 这个函数之前的__weak是一个__atrribute__参数属性, 这个符号的可以弱化这个函数符号, 当在整个的工程中出现这个函数名时, 也就是强符号, 就是我们可以对这个函数进行重写,类似C++中的多态, 这个__weak修饰的函数可以理解为基类中的虚函数。

接着我们对这个函数进行重写, 在里面完成我们想要的代码逻辑

void HAL_GPIO_EXTI_Rising_Callback(uint16_t GPIO_Pin)
{
	if(GPIO_Pin == GPIO_PIN_9) {
		if(HAL_GPIO_ReadPin(GPIOF, GPIO_PIN_9) == GPIO_PIN_RESET) {
				GPIO_LED1_TOOGLE();
				GPIO_LED2_TOOGLE();
				GPIO_LED3_TOOGLE();
		}
	}
}

到这里还不算完, 记得根据自己实验的平台判断按键是否需要消去机械抖动。                                                                                                                                                                           

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

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

相关文章

2023/12/30 c++ work

定义一个Person类,私有成员int age,string &name,定义一个Stu类,包含私有成员double *score,写出两个类的构造函数、析构函数、拷贝构造和拷贝赋值函数,完成对Person的运算符重载(算术运算符、条件运算…

【现代信息检索】国科大何苯老师现代信息检索课程作业 —— 第三次作业

1 docID判断 1判断 2100200311411510610710810901100111111211 表 1 评判情况 表 1 1 1 中是两个判定人员基于某个信息需求对 12 12 12 个文档进行相关性判定的结果(0 不相关,1 相关)。假定我们开发了一个 IR 系统,针对该…

基于RetinaFace+Jetson Nano的智能门锁系统——第一篇(烧录系统)

文章目录 设备1.首先在PC端安装VMware虚拟机和Ubuntu182.安装VMware Tools3.安装SDK Manager 设备 Jetson NanoMicro-USB - USB-A电源线HDMI线屏幕PC一台 1.首先在PC端安装VMware虚拟机和Ubuntu18 VMware下载地址:https://www.vmware.com/cn/products/workstatio…

这本书没有一个公式,却讲透了数学的本质

这本书没有一个公式,却讲透了数学的本质! 《数学的雨伞下:理解世界的乐趣》。一本足以刷新观念的好书,从超市到对数再到相对论,娓娓道来。对于思维空间也给出一个更容易理解的角度。 作者:米卡埃尔•洛奈 …

BikeDNA(三) OSM数据的内在分析2

BikeDNA(三) OSM数据的内在分析2 1.数据完整性 见上一篇BikeDNA(二) OSM数据的内在分析1 2.OSM标签分析 见上一篇BikeDNA(二) OSM数据的内在分析1 3.网络拓扑结构 本节探讨数据的几何和拓扑特征。 例…

2024孙多勇®跨年演讲,重塑医美增长力,开启璀璨华章!

不谋万事者,不足谋一时;不谋全局者,不足谋一域。明者因时而变,智者随时而制。 12月31日-1月3日由汇成医美集团主办的,以“重塑医美增长力”为主题的第七届孙多勇跨年演讲暨「英雄2024」年度战略规划案,在中…

matlab概率论例子

高斯概率模型: [f,xi] ksdensity(x): returns a probability density estimate, f, for the sample in the vector x. The estimate is based on a normal kernel function, and is evaluated at 100 equally spaced points, xi, that cover the range of the da…

python 通过高德地图POI多边形搜索需要的数据

高德文档地址: https://lbs.amap.com/api/webservice/guide/api/search/ python代码实现 import requests import json import csv import re import warnings#warnings.filterwarnings("ignore", categorySyntaxWarning) from Coordin_transformlat imp…

Floyd(弗洛伊德)算法总结

知识概览 Floyd算法适合解决多源汇最短路问题,其中源点是起点,汇点是终点。时间复杂度是。 算法思想 例题展示 题目链接 活动 - AcWing系统讲解常用算法与数据结构,给出相应代码模板,并会布置、讲解相应的基础算法题目。https:/…

【软件工程】航行敏捷之路:深度解析Scrum框架的精髓

🍎个人博客:个人主页 🏆个人专栏: 软件工程 ⛳️ 功不唐捐,玉汝于成 目录 前言 正文 Scrum(敏捷开发框架之一) 详细介绍和解释: 优缺点: 优点: 缺点&…

计算机操作系统(OS)——P5设备管理

1、I/O设备的概念和分类 什么是I/O设备 I/O就是输入/输出(Input/Output)。 I/O设备就是可以将数据输入到计算机,或者可以接收计算机输出数据的外部设备,属于计算机中的硬件部件。 UNIX系统将外部设备抽象为一种特殊的文件&#x…

C#MVC项目---登录

目录 1、创建登录类 2、添加控制器-视图 3、修改View视图 4、添加action登录方法 1、创建登录类 public class LoginModel { [Required, StringLength(maximumLength: 20, ErrorMessage "请输入2-20个字符", MinimumLength 2)] public s…

中国蚁剑的安装以及简单的使用方法

中国蚁剑的安装 正确使用蚁剑 第一次打开这个进行初始化 点击初始化,选择第二个文件目录 则会显示初始化成功,重启后会 鼠标右键点击添加数据 出现这个弹窗 输入url和连接密码即可 这里输入的连接密码时6是因为在写入redis.cmd时,REQUEST[6]…

MySQL数据库索引优化

一、引言 1. 索引的重要性 MySQL数据库索引的重要性主要体现在,一是查询速度优化,索引可以极大地提高查询速度。对于没有索引的表,MySQL必须进行全部扫描来找到所需的行,如果表中数据量很大,那么通常很慢。通过适当的…

Udp实现一个小型shell

实现原理 首先我们要有个客户端和一个服务器,客户端向服务器传递命令。而服务器收到命令后创建一个管道,并fork一个子进程。随后子进程解析命令,再把标准输出换成管道文件,因为命令行命令是自动输出到显示器的,所以我…

Redis Cluster集群模式学习

Redis Cluster集群模式 Redis哨兵模式:https://blog.csdn.net/liwenyang1992/article/details/133956200 Redis Cluster集群模式示意图: Cluster模式是Redis3.0开始推出采用无中心结构,每个节点保存数据和整个集群状态,每个节点都…

常见位运算模板方法总结(包含五道例题)

哈喽大家好&#xff0c;今天博主给大家带来算法基础常见位运算的模板&#xff0c;可以说大家遇到的百分之九十与位运算有关的题都可以用得上。话不多上我们上干货&#xff1a; 一.基础位运算符 << 左移运算符 >> 右移运算符 ~ 取反 & 与运算 | …

爱思唯尔的KBS——模板、投稿、返修、接收的总结

第二篇论文终于是接受了QAQ&#xff0c;被审稿人疯狂拖时间&#xff0c;KBS是真难绷啊 由于之前发布过关于爱思唯尔旗下的ESWA博客&#xff0c;KBS和ESWA是类似的&#xff0c;因此本篇博客主要说下区别以及期间碰到的各种情况&#xff0c;有疑问依然可以在评论区说&#xff0c;…

消息中间件常见知识点

一&#xff1a;消息队列的主要作用是什么&#xff1f; 1.消息队列的特性&#xff1a; 业务无关&#xff0c;一个具有普适性质的消息队列组件不需要考虑上层的业务模型&#xff0c;只做好消息的分发就可以了&#xff0c;上层业务的不同模块反而需要依赖消息队列所定义的规范进行…

(五)分文件编程

文章目录 为什么要引入分文件编程.C文件怎么添加.H文件怎么书写以及如何进行链接.H书写格式&#xff1a;“有头有尾标识符”例如&#xff08;timer.h) .H链接链接到头文件所在路径的文件夹路径即可 提供一个分文件编程的一种代码最后附上视频演示 为什么要引入分文件编程 C程序…