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

news2024/10/6 5:52:56

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库中断处理公用函数,中断处理公用函数里面用来进行异常处理,清中断标志,以及调用各种数据处理回调函数(发生什么中断,调用什么回调函数)。

下篇笔记是实战部分,通过按键实现外部中断控制LED灯亮灭。


本篇完。

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

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

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

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

相关文章

Vector CANdb++ Editor和CANdb++ Admin的区别

目录 1 CANdb Editor和CANdb Admin的功能偏差 2 CANdb Program窗口 3 下载并安装CANdb Editor和CANdb Admin 3.1 安装CANdb Admin.J1939 3.0 SP27 优质博文推荐阅读(单击下方链接,即可跳转): Vector工具链 CAN Matrix DBC …

解析Excel文件内容,按每列首行元素名打印出某个字符串的统计占比(超详细)

目录 1.示例: 1.1 实现代码1:列数为常量 运行结果: 1.2 实现代码2:列数为变量 运行结果: 1.示例: 开发需求:读取Excel文件,统计第3列到第5列中每列的"False"字段占…

Linux VLAN相关概念、转发原理及处理流程

背景 二、三层转发是网络工程师经常接触到的一个问题,VLAN配置是二、三层转中一个很重要的概念,在配置VLAN的情况下,内核对报文是如何处理的呢? 概念 了解VLAN转发,首先必须知道VLAN相关概念; VLAN作用 V…

闲聊电脑(4)硬盘分区

夜深人静,万籁俱寂,老郭趴在电脑桌上打盹,桌子上的小黄鸭和桌子旁的冰箱又开始窃窃私语…… 小黄鸭:冰箱大哥,上次你说的那个“分区”和“格式化”是什么意思? 冰箱:分区么,就是分…

Kotlin快速入门系列10

Kotlin的委托 委托模式是常见的设计模式之一。在委托模式中,有两个对象参与处理同一个请求,接受请求的对象将请求委托给另一个对象来处理。与Java一样,Kotlin也支持委托模式,通过关键字by。 类委托 类的委托即一个类中定义的方…

VPP学习-startup.conf配置文件

背景 VPP(Vector Packet Processing,矢量报文处理),作为一个开源的高性能数据包处理框架,旨在提供可扩展、灵活且高效的网络数据包处理能力;由于传统Linux 内核协议栈整体网络吞吐性能的局限性,…

MySQL | 一定会走索引却没有走的原因,日志报conversion相关错误

TL;DR:函数作用于表字段时,索引会失效。 具体情况 Indexes如下: SQL如下: explain select *from accounting_status_flow_tab_00000000WHERE ( client_no 6848134000 and loan_no 0119324345936016261000 )order by modif…

MySQL 8.0 引入 innodb_flush_method 等新参数的系统调用分析

本文我们将讨论如何在操作系统级别验证 innodb_flush_method 和 innodb_use_fdatasync 修改为默认值之外的其它值(特别是 O_DIRECT 是最常用的)后的效果。 介绍 首先,让我们定义该 innodb_flush_method 参数的作用。它规定了 InnoDB 如何管…

加快“数实融合”推进新型工业化 济南个性化体检“把脉”企业数字化转型难点痛点

加快“数实融合”推进新型工业化 济南个性化体检“把脉”企业数字化转型难点痛点 以主流价值为光,解读“济南故事”,解码C位新闻。爱济南客户端推出“追光”栏目,发挥新型主流媒体权威性和创新性,着眼经济社会发展紧要处、关键处、…

Java学习day26:和线程相关的Object类的方法、等待线程和唤醒线程(知识点详解)

声明:该专栏本人重新过一遍java知识点时候的笔记汇总,主要是每天的知识点题解,算是让自己巩固复习,也希望能给初学的朋友们一点帮助,大佬们不喜勿喷(抱拳了老铁!) 往期回顾 Java学习day25:守护线…

压力测试工具-Jmeter使用总结

目录 一.前言 二.线程组 三.线程组的组件 四.线程组-HTTP请求 1、JSON提取器 2、XPATH提取器 3、正则表达式提取器 五.线程组-断言 1、响应断言 2、JSON断言 六.创建测试 1.创建线程组 2.配置元件 3.构造HTTP请求 4.添加HTTP请求头 5.添加断言 6.添加查看结果树…

Python之Numpy 和 Pandas

目录 2.1 numpy import numpy as np array np.array([[1,2,3],[2,3,4]]) print(array) print(number of dim:,array.ndim) print(shape:,array.shape) print(size:,array.size)pandas 1,pandas 基本介绍 df2 pd.DataFrame({A:1.,B:pd.Timestamp(20130102),C:pd.Series(1,i…

算法设计与分析实验:最短路径算法

一、网络延迟时间 力扣第743题 本题采用最短路径的思想进行求解 1.1 具体思路 (1)使用邻接表表示有向图:首先,我们可以使用邻接表来表示有向图。邻接表是一种数据结构,用于表示图中顶点的相邻关系。在这个问题中&am…

【C语言进阶篇】assert宏 使用详解

文章目录 一、assert简介 二、assert使用方法和规则 2.1 头文件 2.2 原型 2.3 功能 2.4 示例 2.5 assert的打开与关闭 三、注意事项 3.1 运行效率问题 3.2 assert只适用于调试版本 3.3 资源释放与清理 3.4 过度依赖 四、总结 个人主页: 倔强的石头的…

Datax3.0+DataX-Web部署分布式可视化ETL系统

一、DataX 简介 DataX 是阿里云 DataWorks 数据集成的开源版本,主要就是用于实现数据间的离线同步。DataX 致力于实现包括关系型数据库(MySQL、Oracle 等)、HDFS、Hive、ODPS、HBase、FTP 等各种异构数据源(即不同的数据库&#x…

(2024,SaFaRI,双三上采样和 DFT,空间特征和频率特征)基于扩散模型的图像空间和频率感知恢复方法

Spatial-and-Frequency-aware Restoration method for Images based on Diffusion Models 公和众和号:EDPJ(进 Q 交流群:922230617 或加 VX:CV_EDPJ 进 V 交流群) 目录 0. 摘要 3. 方法 3.1 修改数据保真度 3.2 …

Python中使用Opencv-python库绘制直线、矩形、圆、文本

Python中使用Opencv-python库绘制直线、矩形、圆、文字 在Python中使用Opencv-python绘制直线、矩形、圆、文本非常简单,分别使用到line、rectangle、circle、putText这几个函数,具体可以参考https://docs.opencv.org/4.9.0/d6/d6e/group__imgproc__dra…

基础小白快速入门c语言----数据类型

数据类型,运算符,表达式 1c语言支持 数据类型 1.基础类型(基本类型) a数值类型 整型:往往有符号和无符号的区分,(signed)有符号 (unsigned)无符号 基础整型&#xff1…

GSM模块的使用及注意事项

1.如何使用? 最近,我准备使用GSM模块(SIM900A)发送英文短信到指定号码,翻阅资料如下: 可见,只要给该模块按照如下步骤发送指令: 就可以使得模块正常工作。(SIM900A&#…

6-1 A. DS二叉树—二叉树构建与遍历(不含框架)

题目描述 给定一颗二叉树的逻辑结构如下图,(先序遍历的结果,空树用字符‘#’表示,例如AB#C##D##),建立该二叉树的二叉链式存储结构,并输出该二叉树的先序遍历、中序遍历和后序遍历结果。 输入 第…