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

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.mzph.cn/news/661259.shtml

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

相关文章

Node: opensslErrorStack: [ ‘error:03000086:digital envelope routines::initialization error‘ ]异常处理

目录 一、问题描述二、问题分析三、解决方案方案一:你可以按照以下步骤来删除 NODE_OPTIONS 环境变量中的 --openssl-legacy-provider 选项:方案二:在package.json更改scripts方案三:降级 Node.js 版本 在进行前端项目开发时&…

Linux+服务器后台运行程序

在Linux服务器直接运行程序,程序运行的时间较长,程序经常会因为网络连接问题异常终止,一直盯着程序运行又费时费力,这时后台运行程序是更好的解决方式。But,如果服务器重启了,那所有进程都断掉了&#xff0…

关于v8垃圾回收机制以及与其相关联的知识点--还没整理版本

对于值类型b来说,就直接释放了其占用的内存,对于引用类型obj来说,销毁的只是变量obj对堆内存地址 1001 的引用,obj的值 { c: 3 } 依然存在于堆内存中。那么堆内存中的变量如何进行回收呢? V8的垃圾回收策略主要是基于…

【Java 数据结构】栈和队列

栈和队列 1. 栈(Stack)1.1 概念1.2 栈的使用1.3 栈的模拟实现1.4 栈的应用场景1.5 概念区分 2. 队列(Queue)2.1 概念2.2 队列的使用2.3 队列模拟实现2.4 循环队列 3. 双端队列 (Deque)4. 面试题 1. 栈(Stack) 1.1 概念 栈:一种特殊的线性表,其只允许在…

自然语言处理,基于预训练语言模型的方法,车万翔,引言部分

文章目录 自然语言处理应用任务1. 信息抽取2. 情感分析3. 问答系统4. 机器翻译5. 对话系统 自然语言处理应用任务 1. 信息抽取 信息抽取(Information Extraction, IE),是从非结构化的文本中,抽取出结构化信息的过程,…

C++ 单一附合导线平差程序

一、以下图附合导线为例,图形如下: 二、第一步,读取测量数据,读取界面设计如下: 读取数据文本文件格式如下: (1)已知点坐标数据格式: (2)角度观测…

【C++杂货铺】详解类和对象 [下]

个人博客:代码菌-CSDN博客 专栏:C杂货铺_代码菌的博客-CSDN博客 目录 🌈前言🌈 📁 初始化列表(灰常重要) 📂 引入 📂 概念 📂 特性 📁 拓展构…

51单片机编程应用(C语言):数码管

目录 1.数码管原理 一位数码管引脚定义: 四位一体数码管: 多个数码管同时显示不同数字 51单片机的数码管的原理图 51单片机实现静态显示和动态显示 静态显示: 动态显示: 1.数码管原理 一位数码管引脚定义: 数码…

外包干了10个月,技术退步明显...

先说一下自己的情况,大专生,18年通过校招进入武汉某软件公司,干了接近4年的功能测试,今年年初,感觉自己不能够在这样下去了,长时间呆在一个舒适的环境会让一个人堕落! 而我已经在一个企业干了四年的功能测…

【代码随想录】LC 349. 两个数组的交集

文章目录 前言一、题目1、原题链接2、题目描述 二、解题报告1、思路分析2、时间复杂度3、代码详解 前言 本专栏文章为《代码随想录》书籍的刷题题解以及读书笔记,如有侵权,立即删除。 一、题目 1、原题链接 349. 两个数组的交集 2、题目描述 二、解题报…

C语言实战项目<贪吃蛇>

我们这篇会使用C语言在Windows环境的控制台中模拟实现经典小游戏贪吃蛇 实现基本的功能: 结果如下: 1.一些Win32 API知识 本次实现呢我们会用到一些Win32 API的知识(WIN32 API也就是Microsoft Windows 32位平台的应用程序编程接口): 1)控制窗口大小 我们可以使用…

【Qt学习笔记】(二)信号和槽

信号和槽 1 信号和槽概述2 信号和槽的使用3 可视化生成槽函数4 自定义信号和槽5 带参数的信号和槽6 信号与槽的连接方式7 信号与槽的断开8 使用 Lambda 表达式来定义槽函数 1 信号和槽概述 在Qt中,用户和控件的每次交互过程称为一个事件。比如"用户点击按钮&q…

实时时钟芯片DS1307单片机C语言驱动程序

实时时钟RTC相关索引 1.单片机RTC及时钟芯片的时间到底从哪一年起始? 2.STM32F103单片机内部RTC实时时钟驱动程序 3.实时时钟芯片DS1302单片机C语言驱动程序 4.实时时钟芯片DS1307单片机C语言驱动程序 一、DS1307简介 DS1307是一款非易失性实时时钟(R…

【Java程序设计】【C00209】基于SSM个人求职管理系统(论文+PPT)

基于SSM个人求职管理系统(论文PPT) 项目简介项目获取开发环境项目技术运行截图 项目简介 这个一个基于SSM的个人求职管理系统,本系统共分为三种权限:管理员、普通管理员、用户 管理员:首页、个人中心、用户管理、管理…

go并发编程-介绍与Goroutine使用

1. 并发介绍 进程和线程 A. 进程是程序在操作系统中的一次执行过程,系统进行资源分配和调度的一个独立单位。B. 线程是进程的一个执行实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。C.一个进程可以创建和撤销多个线程;同一个进程中的多个…

Go语言的100个错误使用场景(11-20)|项目组织和数据类型

前言 大家好,这里是白泽。 《Go语言的100个错误以及如何避免》 是最近朋友推荐我阅读的书籍,我初步浏览之后,大为惊喜。就像这书中第一章的标题说到的:“Go: Simple to learn but hard to master”,整本书通过分析100…

DevSecOps 参考模型介绍

目录 一、参考模型概述 1.1 概述 二、参考模型分类 2.1 DevOps 组织型模型 2.1.1 DevOps 关键特性 2.1.1.1 模型特性图 2.1.1.2 特性讲解 2.1.1.2.1 自动化 2.1.1.2.2 多边协作 2.1.1.2.3 持续集成 2.1.1.2.4 配置管理 2.1.2 DevOps 生命周期 2.1.2.1 研发过程划分…

leetcode刷题(剑指offer)54.螺旋矩阵

54.螺旋矩阵 给你一个 m 行 n 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。 示例 1: 输入:matrix [[1,2,3],[4,5,6],[7,8,9]] 输出:[1,2,3,6,9,8,7,4,5]示例 2: 输入:ma…

Java基础-集合框架

集合框架: 内存层面可考虑的数据存储容器:数组,集合 数组的特点:长度,存储元素类型确定,既可以放基本数据类型,也可以放引用数据类型 缺点:长度不可变,存储元素特点单…

从零开始 Linux(一):基础介绍与常用指令总结

从零开始 Linux 01. 概念理解 1.1 什么是 Linux? Linux 是一个开源免费的 操作系统,具有很好的稳定性、安全性,且有很强的处理高并发的能力 Linux 的应用场景: 可以在 Linux 下开发项目,比如 JavaEE、大数据、Python…