4.STM32-中断

news2024/12/23 22:23:12

STM32-中断

需求:红灯每两秒进行闪烁,按键key1控制绿灯亮灭

在这里插入图片描述

简单的程序代码无法满足要求

如何让STM32既能执行HAL_DELAY这种耗时的任务,同时又能快速响应按键按下这种突发情况呢

设置中断步骤

1.接入中断

将KEY1输入模式由原先的GPIO_Input设置为GPIO_EXTI12(第12号外部中断线)

在这里插入图片描述

  • 修改后需要重新设置用户标签。

在这里插入图片描述

在这里插入图片描述

根据GPIO口的特性,按键按下时,电平由高电平变为低电平,因此选择下降沿触发中断

2.开启中断向量

在这里插入图片描述

保存并生成代码

3.编写中断发生时的代码

在这里插入图片描述

在生成的Core->Src->stm32f1xx_it.c文件中 其为缀it代表interrupt中断相关的文件,在文件的最下方

在这里插入图片描述

该函数就是我们按下按键触发中断后STM32会调用执行的中断处理函数

在这里插入图片描述

其执行时间十分短。

在这里插入图片描述

因此在此处对小灯进行控制,但值得注意的是

在这里插入图片描述

每当按键按下时都有下降沿,会一直触发中断,所以对小灯触发的效果不是很好

在这里插入图片描述

处理:延迟10ms检测是否为低电平,此if判断还可以防止第二个10ms的下降沿所触发的中断

4.设置中断优先级

HAL_DELAY依赖于Time base : System tick timer 1ms 的优先级,而系统默认优先级最高15,若中断的优先级低于15则无法执行,因此解决方法:让Svstem tick timer的优先级数字小于咱们的EXTI15_10即可

在这里插入图片描述

  • 处理过后能满足需求,但程序对于中断的处理中不会使用HAL_DALAY,希望中断任务能尽快结束,往往还会有一些更加巧妙的方法来实现。

深入中断

EXTI

GPIO口内部:在输入控制模块

在这里插入图片描述

在信号到达复用功能输入后,进入 外部中断/事件控制器 ,如下图

在这里插入图片描述

像这样的外部中断共有19组,这19个外部中断线的前16个,也就是EXTI0~EXTI15分别对应着与其编号相同的GPIO口

每个引脚上PA0,PB0,PC0,PD0 对应EXTI0这条线 PA1,PB1,PC1,PD1 对应EXTI1这条线,以此类推

  • 左下角的脉冲发生器,以及事件屏蔽寄存器与事件(Event)相关,事件型号会送达相应的外设,由外设自行处理。

在这里插入图片描述

配置这两个寄存器,如果给KEY1配置了下降沿触发中断,那么上升沿触发选择寄存器的第12位关闭为0,下降沿的触发选择寄存器的第12位开启为1

在这里插入图片描述

此时,如果边沿检测电路检测到下降沿就会向后发出高电平信号

在这里插入图片描述

经过或门后,将请求挂起寄存器对应的位置为1,如果是接受到来自第十二根外部中断线来的高电平后,将第12位0 置为 1 ,将此为输出 到与门,与门的特性是两个1才为1,中断屏蔽寄存器中只有其对应位上为1才能输出为1进入到NVIC,将KEY1设为GPIO_EXTI12时,就已经将中断屏蔽寄存器12位置为了1,接着送往最高层NVIC,其主要作用便是掌管着一张中断向量表,指向中断处理函数。

在这里插入图片描述

在中断向量表中。只有1-4号中断线有自己的中断向量,5-9 共享中断向量 EXTI9_5,10 - 15 共享中断向量 EXTI15_10

在信号抵达NVIC后,NVIC会找到中断向量EXTI15_10,然后按照指向去寻找EXTI5_10_IRQHandler并执行

在这里插入图片描述

执行完成后,HAL_GPIO_EXTI_IRQHandler(KEY1_Pin)会将请求挂起寄存器中的对应位置为0,此时EXTI5_10_IRQHandler()函数结束执行,否则会一直执行下去。

在这里插入图片描述

HAL_GPIO_EXTI_IRQHandler(KEY1_Pin)调用了名为__HAL_GPIO_EXIT_CLEAR_IT的函数

其功能是清除请求挂起寄存器,也就是将请求寄存器的第12位清为0,就不会误导NVIC再次执行EXTI5_10_IRQHandler()

其次回到NVIC中断向量表中,还有中断优先级的信息

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

上面设置了系统滴答的抢占优先级由于我们的EXTI15_10,是为了让系统滴答可以在EXTI15_10执行过程中抢占执行,从而为HAL_Delay提供时间基准,HAL_Delay就可以被打断,不然HAL_Delay没有时间基准,无法被打断 无法 实现在HAL_Delay时运行EXTI5_10_IRQHandler()

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

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

相关文章

React学习02 -事件处理、生命周期和diffing算法

文章目录 react事件处理非受控组件受控组件高阶函数函数柯里化 生命周期引出生命周期旧版生命周期新版生命周期 Diffing算法 react事件处理 1.react通过onXXX属性指定事件处理函数, a.react使用的是自定义事件,将原生js事件方法重写并改为小驼峰写法&am…

大数据新视界 --大数据大厂之大数据驱动下的物流供应链优化:实时追踪与智能调配

💖💖💖亲爱的朋友们,热烈欢迎你们来到 青云交的博客!能与你们在此邂逅,我满心欢喜,深感无比荣幸。在这个瞬息万变的时代,我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…

前端自定义指令控制权限(后端Spring Security)

1. 新建 directives/auth.ts   //导入自定义指令 import auth from /directives/auth// 注册全局自定义指令 v-auth app.directive(auth, auth);1.1完整的authDirective.ts import { wmsStore } from "/store/pinia"// 判断用…

dmdfm5安装部署

dmdfm5安装部署 1 环境说明2 命令行安装dmfdm52.1 创建 dmdba 用户2.2 命令行安装 dmdfm2.3 配置自启动脚本服务2.4 web端 访问 dmdfm 3 安装过程错误记录4 更多达梦数据库学习使用列表 1 环境说明 cpu x86OS 麒麟v10(sp2)dmfdm5 版本 : dmdfm_V5.0.1.1_rev157137_x86_linux_6…

计算机网络803-(4)网络层

目录 1.虚电路服务 虚电路是逻辑连接 2.数据报服务 3.虚电路服务与数据报服务的对比 二.虚拟互连网络-IP网 1.网络通信问题 2.中间设备 3.网络互连使用路由器 三.分类的 IP 地址 1. IP 地址及其表示方法 2.IP 地址的编址方法 3.分类 IP 地址 (1&#x…

双通讯直流电能计量装置功能介绍

DJSF1352系列电子式直流电能表是为满足现代直流电力计量需求而设计的高性能设备。其主要特点包括液晶显示和RS485通讯功能,方便与微机进行数据交互,适用于充电桩、蓄电池、太阳能电池板等多种直流信号设备的电量监测。该产品由测量单元、数据处理单元、通…

python数学运算库numpy的使用

数组 numpy创建数组的方法 可以用np.array()将一个列表作为参数 import numpy as npd1 np.array(range(1,7))print(d1) # 输出数据 print(d1.size) # 输出元素个数 print(d1.ndim) # 输出数组维度 print(d1.shape) # 输出数组形状(长宽高) 可以…

pdf合并成一个文件,揭秘四款好用软件!

在这个数字化时代,PDF文件已成为我们工作、学习和生活中不可或缺的一部分。无论是报告、合同、还是学术论文,PDF以其跨平台兼容性和良好的格式保持性赢得了广泛青睐。然而,面对多个PDF文件需要合并成一个完整文档时,你是否也曾感到…

对于JS脚本加标签功能的一些小理解

在JS中加标签,最主要的应用场景就是结合循环代码使用。用标签标识循环或者代码块,以便使用break 和 continue语句来结束循环。个人觉得标签加循环的本质作用是为了增加性能,减少运行代码行,以便提速。示例如下: 打印输…

Leetcode.20 有效的括号

关键词:vector, push_back(), pop_back(), stack, push(), pop(), top() 1.题目 2.解答思路及解答 解答思路: 左括号需要一个相同的括号,如果是括号嵌套的方式,可以类比“回文数”那题,利用双下标或者双指针遍历。 …

shell 脚本批量更新本地git仓库

文章目录 一、问题概述二、解决方法三、运行效果1. windows2. centos 一、问题概述 你是否遇到这样的场景: 本地git仓库克隆了线上的多个项目,需要更新时,无法象svn一样,选中多个项目一起更新。 只能苦逼的一个个选中&#xff0c…

【解决办法】git clone报错unable to access ‘xxx‘: SSL certificate problem

git clone 是 Git 版本控制系统中的一个基本命令,用于从远程仓库复制一个完整的版本库到本地。这个命令不仅复制远程仓库中的所有文件,还复制仓库的历史记录,使得你可以在本地进行版本控制操作,如提交(commit&#xff…

YOLO11改进|SPPF篇|引入YOLOv9提出的SPPELAN模块

目录 一、【SPPELAN】模块1.1【SPPELAN】模块介绍1.2【SPPELAN】核心代码 二、添加【SPPELAN】模块2.1STEP12.2STEP22.3STEP32.4STEP4 三、yaml文件与运行3.1yaml文件3.2运行成功截图 一、【SPPELAN】模块 1.1【SPPELAN】模块介绍 下图是【SPPELAN】的结构图,让我们…

AI产品经理面试100问,三天看完一周拿5个offer

Attention(重点掌握) 1.什么是 Attention?为什么要用 Attention?它有什么作用? 2.Attention的流程是什么样的? 3.普通的Attention和Transformer的Self-attention之间有什么关系? 4.什么是Self-attention? Transformer(重点掌握) 1.Transformer是什么,它的基…

socket编程(java)

socket编程(java) 简介 ​ Socket(套接字)是计算机网络编程中用于实现网络通信的一种机制。它提供了一种编程接口,允许应用程序通过网络进行数据传输,实现不同主机之间的通信。 ​ Socket可以看作是一种…

多态相关问题

多态 1、概念的概念 通俗来讲&#xff0c;就是多种形态。具体点就是去完成某个行为&#xff0c;当不同的对象去完成时会产生出不同的状态。 例子&#xff1a;新用户 领红包 99 老用户 领红包 2 不常用 领红包 6 符合多态条件&#xff1a; #include <iostream> using …

计算机毕业设计 医院预约挂号系统的设计与实现 Python毕业设计 Python毕业设计选题【附源码+安装调试】

博主介绍&#xff1a;✌从事软件开发10年之余&#xff0c;专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精…

力扣之1364.顾客的可信联系人数量

题目&#xff1a; sql建表语句&#xff1a; Create table If Not Exists Customers (customer_id int, customer_name varchar(20), email varchar(30)); Create table If Not Exists Contacts (user_id int, contact_name varchar(20), contact_email varchar(30)); Cre…

qiankun 主项目和子项目都是 vue2,部署在不同的服务器上,nginx 配置

1、主项目配置 1.1 micro.vue 组件 <template><div id"container-sub-app"></div> </template><script> import { loadMicroApp } from qiankun; import actions from /utils/actions.js;export default {name: microApp,mixins: [ac…

react实现实时计时的最简方式

js中时间的处理&#xff0c;不借助于moment/dayjs这样的工具库&#xff0c;原生获取格式化的时间&#xff0c;最简单的实现方式可以参考下面这样。 实现效果 代码实现 封装hooks import { useState, useEffect } from "react";export function useCountTime() {c…