正点原子--STM32中断系统学习笔记

1、什么是中断?

原子哥给出的概念是这样的:打断CPU正常执行的程序,转而处理紧急程序,然后返回原暂停的程序继续运行,就叫中断。

当发生中断时,当前执行的程序会被暂时中止,进而进入中断处理函数对中断事件进行处理,处理完毕后,又回到之前被暂停的程序继续执行。

1.1 中断的作用和意义

使得CPU在能够执行主程序的同时,对重要事件做出及时的响应,提高CPU的工作效率,高效处理紧急程序,不会一直占用CPU资源。

1. 实时控制:在确定时间内对相应事件作出响应,如:温度监控
2. 故障处理:检测到故障,需要第一时间处理,如:电梯门夹人了
3. 数据传输:不确定数据何时会来,如:串口数据接收

1.2 STM32 GPIO外部中断简图

信号从外部进来,通过GPIO输入,来到AFIO将GPIO引脚映射到EXTI线上, 通过EXTI进行中断屏蔽或上升/下降沿触发中断,之后来到NVIC中断总管家进行优先级判断, CPU以优先级从高到低处理中断。

2、嵌套向量中断控制器 NVIC

2.1 NVIC基本概念

NVIC(Nested vectored interrupt controller),嵌套向量中断控制器,属于内核(M3/4/7)。
NVIC支持256个中断(16内核+240外部),支持256个优先级允许裁剪!NVIC是一种中断控制器,用于管理中断系统和中断请求。

ST公司把256个优先级进行了裁剪(用不到那么多),变成了16个中断优先级。

STM32型号内核中断外部中断中断优先级
STM32F103xx106016
STM32F407xx108216
STM32F429xx109116

 不管是内核中断还是外部中断,都有对应中断服务函数,那么问题来了,什么是中断服务函数呢?中断服务函数就是中断的入口,当某一个中断发生之后,需要进入中断服务函数当中执行相应的中断程序,中断服务函数又被定义在了中断向量表里,追根溯源那么什么又是中断向量表呢?

2.1.1 什么是中断向量表?

首先啊,定义一块固定的内存,以4字节对齐(STM32是32位单片机,1字节是8位,所以32位就是4字节),用于存放各个中断服务函数的首地址。

中断向量表定义在启动文件(.s文件)中,当发生中断时,CPU会自动执行对应的中断服务函数,

 当正常执行程序时,CPU一直都被main函数占用,当发生中断时,这些中断服务函数会抢夺CPU的使用权,如下图所示。

OK,现在我们在工程里面找到启动文件,如下图所示,__Vectors就是中断向量表开始的位置。 上部分是内核中断有10个,下面是外部中断服务函数有60个。

 在《STM32F103系列参考手册》9.1.2 中断和异常向量 里有对中断向量表的说明,深色背景的是内核中断,位置从0开始的是外部中断,总共有60个外部中断服务函数。

2.2 NVIC相关寄存器介绍

NVIC相关寄存器位数寄存器个数备注
中断使能寄存器(ISER)328每个位控制一个中断
中断除能寄存器(ICER)328每个位控制一个中断
应用程序中断及复位控制寄存器(AIRCR)321位[10:8]控制优先级分组
中断优先级寄存器(IPR)82408个位对应一个中断,而STM32只使用高4位

《ARM Cortex-M3与Cortex-M4权威指南》的 7.8小节对NVIC寄存器有详细介绍; 

2.3 NVIC工作原理

当外部发中断,进入到NVIC,首先由中断使能和失能寄存器进行配置,来控制这些中断开与关,如上图所示,中断1失能,中断2,3,4使能,就来到了中断优先级寄存器(IPR),IPR对中断2-4根据对应的优先级进行判断,优先级越高的中断先得到CPU的控制权。

2.4 中断优先级基本概念

1抢占优先级(pre):高抢占优先级可以打断正在执行的低抢占优先级中断

2响应优先级(sub):当抢占优先级相同时,响应优先级高的先执行,但是不能互相打断

3,抢占和响应都相同的情况下,自然优先级越高的,先执行

4自然优先级:中断向量表的优先级

5,数值越小,表示优先级越高

2.5 中断优先级分组

举例说明:优先级分组为1,有1位抢占优先级,3位响应优先级,那么抢占优先级就有2^1=2个,响应优先级有2^3=8个。

注意:一个工程中,一般只设置一次中断优先级分组 

中断优先级举例(假设分组是2)

编号自然优先级对应外设抢占优先级响应优先级执行顺序
310RTC212
613EXTI0304
714EXTI1201
-16Systick303

由表中可知RTC和EXTI1的抢占优先级都为2,但是响应优先级不同,EXTI1的响应优先级为0,RTC的响应优先级为1,数值小的先执行,所以EXTI1是第一个执行,第二个是RTC;而EXTI0和Systick的抢占优先级和响应优先级都相同,这个时候就要看自然优先级,数值越小,就先执行,所以systick是第三个执行,第四个是EXTI0。

而高抢占优先级可以打断正在执行的低抢占优先级中断,比如EXTI0/Systick正在执行,这时RTC就可以打断它先执行。但是响应优先级高的不能打断响应优先级低的。

2.6 NVIC的使用(HAL库)

1. 设置中断分组     HAL_NVIC_SetPriorityGrouping

2. 设置中断优先级     HAL_NVIC_SetPriority

3. 使能中断      HAL_NVIC_EnableIRQ

3、外部中断/事件控制器 EXTI

主线任务:学习中断EXTI主要掌握EXTI线0~15与GPIO 引脚的对应关系

3.1 EXTI基本概念

External(Extended))interrupt/event Controller,外部(扩展)中断事件控制器,其中包含20个产生事件/中断请求的边沿检测器,即总共:20条EXTI线(F1系列)

中断和事件的理解:
中断:要进入NVIC,有相应的中断服务函数,需要CPU处理
事件:不进入NVIC,仅用于内部硬件自动控制的,如:TIM、DMA、ADC

3.2 EXTI主要特性

F1/F4/F7系列
每条EXTI线都可以单独配置:选择类型(中断或者事件)、触发方式(上升沿,下降沿或者双边沿触发)、支持软件触发、开启/屏蔽、有挂起状态位

3.3 EXTI工作原理

这里的输入线就是EXTI线,这些输入线可以通过寄存器设置为任意一个 GPIO,从《STM32F103数据手册》中我们得知,F1系列有20根,非互联型有19根;

接下来我们分析下这部分框图: 

首先我们来看第①部分:信号从某一条EXTI线输入进来,经过边沿检测电路,到达或门,那么信号如何通过边沿检测电路呢?就由上升沿触发选择寄存器下降沿触发选择寄存器这俩寄存器决定了,这俩都是32位寄存器,但它们的有效位却是由EXTI线的条数决定的,eg:F1有20条EXTI线,那么上升沿&下降沿触发选择寄存器就是20位有效。当上升沿触发选择寄存器的对应位置1,此时输入线来了一个上升沿,那么允许该信号通过边沿检测电路,而要是此时来一个下降沿,那就不允许它通过;同理,当下降沿触发选择寄存器的对应位置1,此时输入线来了一个下降沿,那么就允许该信号通过边沿检测电路,而要是此时来一个上升沿,那就不允许它通过;

第②部分:当信号通过边沿检测电路来到或门,此时或门一个输入为1,那么输出也就为1(或门:有1为1),而不用去理会软件中断事件寄存器的状态,从而实现硬件触发中断;而如果边沿检测电路是0,此时决定或门输出1的就是软件中断事件寄存器了,从而实现软件触发中断

第③部分: 不管是通过软件中断还是硬件中断触发,或门的输出都是1,那么请求挂起寄存器的对应位也置1,这时与门的一个输入就为1,要想与门输出为1,必须中断屏蔽寄存器的对应位也为1才行,这样才能把信号输入到NVIC中断控制器,如果中断屏蔽寄存器的对应位为0,那么与门输出为0,也就阻止了信号输入到NVIC中断控制器中,也就无法产生中断。所以,中断屏蔽寄存器的作用就体现出来了!!通过控制中断屏蔽寄存器(EXTI_IMR)来控制中断的产生。

第④部分:同理,事件屏蔽寄存器对应位为1时,信号会通过与门脉冲发生器输入到某个外设,从而产生事件,控制其他外设实现某种功能。

具体细致的讲解大家可以观看“正点原子”这部分 :第58讲 入门篇-EXTI工作原理(F1 F4 F7)_哔哩哔哩_bilibili

4、EXTI和IO映射关系

4.1 EXTI支持的外部中断/事件请求

4.2 AFIO简介(F1)

Alternate Function IO,即复用功能IO,主要用于重映射外部中断映射配置

 我们主要用到AFIO_EXTICR1~4这四个寄存器,用来配置EXTI中断线0~15对应的IO口。

4.3 EXTI与IO对应关系 

 也就是说,EXTI0对应PA~PG的引脚0,而EXTI0[3:0]写入的值对应的是PA还是PB、PC...PG端口号;

EXTI x ----->引脚 0 ~ 15

EXTI x [3:0]------->PA~PG端口号 

5、如何使用中断 

USART/TIM/SPI等产生的外设中断,不会进入EXTI,而是由外设自己的寄存器配置,开启相应的外设中断,直接进入NVIC。

6、HAL库中断回调处理机制介绍

发生中断,进入中断服务函数,在中断服务函数里面调用HAL库中断处理公用函数,中断处理公用函数里面用来进行异常处理,清中断标志,以及调用各种数据处理回调函数(发生什么中断,调用什么回调函数)。


本篇完。

本人博客仅代表个人见解方便记录成长笔记。

若有不足,请指出,感谢您的阅读!

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

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

相关文章

YIA主题如何关闭新版本升级提示?WordPress主题怎么取消升级提醒?

前两天YIA主题发布了升级到2.8版本,新增了一些功能,优化调整修复了一些功能,但是这些功能调整幅度不大,加上boke112百科使用的YIA主题已经进行了很多方面的个性化修改,所以就懒得升级了,但是每次进入WordPr…

C++基础语法学习笔记

C Tutorial 1.基础语法 C 应用&#xff1a;操作系统、图形用户界面和嵌入式系统 C和C区别&#xff1a;C支持类和对象 C语法 #include <iostream> using namespace std;int main(){cout << "hello world!";return 0; }int main () { cout << &q…

Flutter canvas 画一条会动的波浪线 进度条

之前用 Flutter Canvas 画过一个三角三角形&#xff0c;html 的 Canvas 也画过一次类似的&#xff0c; 今天用 Flutter Canvas 试了下 感觉差不多&#xff1a; html 版本 大致效果如下&#xff1a; 思路和 html 实现的类似&#xff1a; 也就是找出点的位置&#xff0c;使用二阶…

Linux部署DataEase数据分析工具并结合内网穿透实现任意设备远程查看数据

文章目录 前言1. 安装DataEase2. 本地访问测试3. 安装 cpolar内网穿透软件4. 配置DataEase公网访问地址5. 公网远程访问Data Ease6. 固定Data Ease公网地址 前言 DataEase 是开源的数据可视化分析工具&#xff0c;帮助用户快速分析数据并洞察业务趋势&#xff0c;从而实现业务…

Docker安装MongoDB并做副本集群

mongodb cluster 1. 创建外挂目录并授权 mkdir -p /home/mongo1/db /home/mongo1/log mkdir -p /home/mongo2/db /home/mongo2/log mkdir -p /home/mongo3/db /home/mongo3/log chmod 755 2. 拉取最新mongodb docker pull mongo3. 创建副本集结点 docker run -itd --namemong…

代码随想录算法刷题训练营day21

代码随想录算法刷题训练营day21&#xff1a;LeetCode(501)二叉搜索树中的众数、LeetCode(530)二叉搜索树的最小绝对差 LeetCode(501)二叉搜索树中的众数 题目 代码 import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map;/*…

一些大语言模型(LLM)相关的开源项目

一些大语言模型&#xff08;LLM&#xff09;相关的开源项目 更多文章访问: https://www.cyisme.top 因为站内限制问题&#xff0c;有些图片无法显示&#xff0c;导致阅读体验较差&#xff0c;可以访问原文&#xff1a;《一些大语言模型&#xff08;LLM&#xff09;相关的开源项…

Linux逻辑卷(LV)扩容

Linux逻辑卷&#xff08;LV&#xff09;扩容 1、准备物理磁盘&#xff08;分区和不分区都行&#xff09;&#xff0c;可以使用lsblk命令查看新增的磁盘&#xff0c;如下图sde就是我们新增磁盘&#xff0c;容量为600G。 2、将新磁盘变成物理卷&#xff08;PV&#xff09; pvcr…

疾控中心污水采样器的招标参数有哪些

技术指标 1 采样程序&#xff1a;可以预先编制 10 种采样程序&#xff0c;一键式启动&#xff1b; 2 采样方式&#xff1a;平行采样、 定时定量采样、定流定量采样、 定时比例采样、液位比例采样、即时定量采样等&#xff1b; 3 采样记录&#xff1a;可保存 10000 条采样记录…

dockerpipwork相关测试过程

pipework可以减轻docker实施过程中的工作量&#xff0c;在网上也找了几篇类似的文章&#xff0c;按照相应配置&#xff0c;结果并不相同 如下测试过程记录下&#xff1a; docker run -it --rm --name c1 busybox docker run -it --rm --name c2 busyboxpipework br1 c1 192…

Springboot集成Javamelody

JavaMelody的目标是监视QA和生产环境中的Java或Java EE应用服务器。它不是模拟用户请求的工具&#xff0c;而是根据用户对应用程序的使用情况来衡量和计算应用程序实际操作的统计信息的工具。JavaMelody主要基于请求统计和演化图。 它允许改进QA和生产中的应用程序&#xff0c…

Servlet服务器端的小程序

Servlet 概述 Servlet applet 运行在服务器端的小程序&#xff0c;Servlet 就是一个接口&#xff0c;定义了 Java 类被浏览器访问到的规则(Tomcat能识别)&#xff0c;我们自定义一个类&#xff0c;实现 Servlet 接口&#xff0c;复写接口中的方法。 访问流程 快速入门 创建…

Uniapp登录页面获取头像、昵称的最新方法的简单使用

前言 写小程序写到登录页面的时候&#xff0c;发现官方文档中原来的wx.getUserInfo和wx.getUserProfile不太能用了&#xff0c;学习了相对比较新的方法&#xff0c;这种方法的文档链接如下&#xff1a; https://developers.weixin.qq.com/miniprogram/dev/framework/open-abil…

搜维尔科技:第九届元宇宙数字人大赛,参赛小组报名确认公告!

各位参赛选手大家好&#xff0c;近期已收到新增报名信息如下表&#xff0c;请各位参赛选手确认&#xff0c;如果信息有误或信息不完整请电话联系赛务组工作人员进行更正 随着元宇宙时代的来临&#xff0c;数字人设计成为了创新前沿领域之一。为了提高大学生元宇宙虚拟人角色策划…

1.31学习总结

1.31 1.线段树 2.Bad Hair Day S&#xff08;单调栈&#xff09; 3.01迷宫(BFS连通块问题剪枝)&#xff08;连通性问题的并查集解法&#xff09; 4.健康的荷斯坦奶牛 Healthy Holsteins&#xff08;DFS&#xff09; 线段树与树状数组 线段树和树状数组的功能相似&#xff0c;但…

校园二手交易小程序|基于微信小程序的闲置物品交易平台设计与实现(源码+数据库+文档)

校园二手交易小程序目录 目录 基于微信小程序的闲置物品交易平台设计与实现 一、前言 二、系统功能设计 三、系统实现 1、用户信息管理 2、商品信息管理 3、公告信息管理 4、论坛信息管理 四、数据库设计 1、实体ER图 五、核心代码 六、论文参考 七、最新计算机毕…

RabbitMQ 死信队列应用

1. 概念 死信队列&#xff08;Dead Letter Queue&#xff09;是在消息队列系统中的一种特殊队列&#xff0c;用于存储无法被消费的消息。消息可能会因为多种原因变成“死信”&#xff0c;例如消息过期、消息被拒绝、消息队列长度超过限制等。当消息变成“死信”时&#xff0c;…

(申请积分专用)我的世界(MC)整合包开服教程,Pokehaan Craft 2整合包服务器搭建教程

Minecraft整合包服务器搭建教程&#xff0c;宝可梦/神奇宝贝整合包&#xff08;Pokehaan Craft 2&#xff09;开服教程。 其他整合包也可以参考此教程。要看这个整合包的游戏截图可以翻到文章最底下。 什么是整合包 Minecraft的整合包是一种包含了多个模组&#xff08;mod&a…

面向对象设计的七大设计原则

在我们探讨如何创建健壮且可维护的面向对象系统时&#xff0c;有一些原则可以为我们提供指导。这些原则可以帮助我们理解如何最好地组织我们的类和对象&#xff0c;以实现高效、模块化和可扩展的设计。在本篇文章中&#xff0c;我们将探讨这些原则&#xff0c;以及如何在我们的…

Pyth 预言机: 它们如何影响Hover?

所有链上借贷市场都使用一种称为“oracle&#xff08;预言机&#xff09;”的服务&#xff0c;为dApp提供代币定价。Oracle是一个数据系统&#xff0c;将链下信息&#xff08;例如KuCoin上的BTC/USDT价格&#xff09;传递到链上合约。从那里&#xff0c;应用程序可以支付一小笔…