stm32学习笔记-中断系统
文章目录
- 问题引入
- 1、中断系统概述。
- 1.1 为什么要中断(中断意义)
- 中断和轮询比较:
- 1.2 中断处理过程
- 1.3 中断笔试题
- 1.4 中断服务函数
- 2、STM32中断的体系结构。
- 2.1 结构框图
- 2.2 NVIC 内嵌向量中断控制器
- NVIC的作用
- NVIC的主要功能。
- NVIC的中断优先级
- NIVC中配置中断的相关寄存器
- 2.3 stm32NVIC中断优先级的配置
- 2.4 stm32中断配置思路
- 3、stm32F10x产品的向量表。
问题引入
问题引入:我们想通过 按键 控制灯亮 ,怎么做
一般做法:轮询
2b轮询例子:
2:吃了吗?B:没吃
2:吃了吗?B:没吃
2:吃了吗?B:吃了
2:吃了吗?B:…
2:吃了吗?B:滚!
具体做法
1 将GPIO口设为输入模式,
2 不断判断GPIO口的电平状态,从而得到是否按下按键
这样的 方式叫 “轮询”
轮询 有天生的 缺陷:
- 浪费CPU时间
- 查询GPIO口的状态时,占用总线
有人提出,能不能这样做,按下或弹起的时候,外设主动通知CPU,这就叫中断。
1、中断系统概述。
日常中的中断,有更紧急的事情出现要去处理。比如说看电视的时候,电话响了,暂停电视听电话。
1.1 为什么要中断(中断意义)
处理器的中断:在处理器中,中断是一个过程。在处理器正常执行程序时,出现内部/外部紧急事件需要去处理,处理器暂停当前的程序,去处理紧急事件,处理完毕后,返回被打断的程序处继续往下执行。
中断可以提升CPU的处理效率,同时能堆突发事件做出实时的处理。实现程序的并行化,实现嵌入式系统进程之间的切换。
中断不是动不动就用的,在特定的应用场合应用。
中断和轮询比较:
中断
- 适于处理对响应要求非常高的事件
- 适于处理持续事件非常短的事件
- 适于低功耗的应用
- 程序设计较复杂
轮询
- 适于处理对时间响应要求低的场合
- 程序设计简单
1.2 中断处理过程
中断处理的简略过程如下:
保护现场
保护现场,寄存器的值压栈。执行中断
查询并执行对应的中断服务程序。通过中断向量去寻找中断服务程序。返回现场
恢复现场。
1.3 中断笔试题
中断是什么?请简述单片机中断处理的过程
CPU在正常执行程序的过程中,由于内部/外部事件的触发或程序的预先安排引起CPU暂时中断当前正在运行的程序,而转去执行中断服务子程序,待中断服务子程序执行完毕后,CPU继续执行原来的程序,这一过程称为中断;
中断处理的过程:
第一步:保护现场,将当前位置的PC地址压栈;
第二步:跳转到中断服务程序,执行中断服务程序;
第三步:恢复现场,将栈顶的值回送给PC;
第四步:跳转到被中断的位置开始执行下一个指令;
1.4 中断服务函数
相比于正常子函数,中断服务函数有什么特点和需要注意的地方?
1.相比正常的子函数,中断函数服务函数中不能有耗时的操作,最不能在中断服务函数中有延时函数。
2.不能有引起中断睡眠的函数。
3.不能递归调用自身。
4.在中断服务函数中不能出现可重入函数。比如printf。
5.中断服务函数中没有参数以及没有返回值。
2、STM32中断的体系结构。
2.1 结构框图
一个中断要被CPU响应必须通过两级:
- 自身外设中断源配置
- NVIC: 中断控制器。
每一个外设中断控制器(分管部门):外设中的每一个外设都有一个自己的中断开关,内核中的系统定时器等也有自己中断开关。能够产生中断的设备通过中断请求线(IRQ line)连到NVIC上面,所有能够产生中断的设备必须要有一根中断请求线。
NVIC(主管家):NVIC专门管理中断的,每一个中断都要在NVIC中挂号(使NVIC监听器中断请求)。NVIC收到外设的中断请求,会将其中断请求发送给内核,内核收到NVIC的中断通知之后,就会去判断时哪个中断发生,然后查找FLASH中断向量表去获取相应的中断处理函数。
举例:
由简单GPIO电平引起的中断,由部件脚EXTI(外部中断管理控制器)管理。
某个GPIO需要产生中断,若EXTI使能之后,EXTI会把中断的请求,通知给NVIC;
NVIC若对其使能,则NVIC把这个中断请求通知给CORTEX_M3;
最终由内核CORTEX_M3处理中断。
stm32所有的I/O都可以配置中断。
2.2 NVIC 内嵌向量中断控制器
Nested Vectored interrupt controller,NVIC属于M3内核的一个外设。这个NVIC专门用于管理中断,就像秦朝设立丞相那样减轻皇帝的负担,它帮助CM3处理器管理中断。
它的库函数在core_cm.3和misc.h
NVIC的作用
1、快。(男人就是要快!)
快速的运行的产品需要快,如高铁,飞机,导弹等产品。
2、标准化,同一化。
中断服务程序同一了,方便编程人员。
NVIC的主要功能。
- 中断管理。
- 支持异常及中断向量化处理。减少中断处理的一个时间。
- 支持嵌套中断。例如:一个中断发生了,另一个更加紧急的中断不久也发生了,可以打断当前中断的处理,去执行紧急程度更改的中断。
NVIC的中断优先级
STM32f03支持60个可屏蔽中断,每个中断具备自己的中断优先级控制字节(8位,但是只使用高4位),用于表达优先级的高4位被分为抢占式优先级和响应优先级。
所以STM32(Cortex-M3)中有两个优先级的概念-抢占式优先级(主优先级)和响应优先级(从优先级)。每个中断源都需要被指定这两种优先级。
中断被响应先后顺序:
- 抢占式优先级不同:
高抢占式优先级的中断可以在具有低抢占式优先级的中断在执行的过程中可以被响应,即中断嵌套。(高抢占低) - 抢占式优先级相同:
当一个中断来到后,另一个中断正在被处理,后来的中断被挂起,等当前的中断处理完后才能被处理。(先来后到)
当两个中断同时到达,且没有中断正被执行,则中断控制器根据它们的响应优先级高低来决定先处理哪个。 - 抢占式优先级,响应优先级都相同:
根据它们在中断向量表的排位顺序决定先处理哪一个。(看最终位置) - 中断优先级的数值越低,优先等级越高
优先级越高,比如相应优先级为0和1的中断同时到达将会先响应优先级为0的中断。如果优先级为1的中断正在运行,这时0中断到达,将会先暂停1去执行0,等0执行完毕再回到1.
NIVC中配置中断的相关寄存器
中断号保存在 IPSR
中断优先级控制的寄存器组:IP[240]
因为M3内核最多有 240个可屏蔽的中断,所以有240个确定 中断优先级的寄存器 ,
每个IP寄存器是8位的, 高4位用来设置抢占和响应优先级(根据分组),
低4位没有用到
Stm32f10x有60个中断 ,所以用到了 IP[0]~IP[59]
中断使能寄存器组:ISER[8]
32位寄存器,每个位控制一个中断的使能。
STM32F10x只有60个可屏蔽中断,所以只使用了其中的ISER[0]和ISER[1]。
ISER[0]的bit0~bit31分别对应中断0 ~ 31。ISER[1]的bit0 ~ 27对应中断32 ~59;
中断失能寄存器组:ICER[8]
32位寄存器,每个位控制一个中断的失能。
STM32F10x只有60个可屏蔽中断,所以只使用了其中的ICER[0]和ICER[1]。
ICER[0]的bit0 ~ bit31分别对应中断 0 ~31。ICER[1]的bit0 ~ bit27 对应中断32 ~ 59;
配置方法跟ISER一样。
中断挂起控制寄存器组:ISPR[8]
作用:用来挂起中断
中断解挂控制寄存器组:ICPR[8]
作用:用来解挂中断
2.3 stm32NVIC中断优先级的配置
思路:
- 首先设置中断优先级分组。(整个系统执行过程中,只设置一次中断分组,若随意改变会导致中断管理混乱)
- 然后针对相应的中断,设置对应的抢占优先级和响应优先级。
系统运行后先设置中断优先级分组(4bits 空间 存储两个优先级)。
1.首先得对优先级进行分组。
调用函数:
void NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup);
参数NVIC_PriorityGroup选择如下:
NVIC_PriorityGroup_0 //抢占优先级占0bits, 响应优先级占4bitsNVIC_PriorityGroup_1 //抢占优先级占1bits, 响应优先级占3bitsNVIC_PriorityGroup_2 //抢占优先级占2bits, 响应优先级占2bitsNVIC_PriorityGroup_3 //抢占优先级占3bits, 响应优先级占1bitsNVIC_PriorityGroup_4 //抢占优先级占4bits, 响应优先级占0bits
举例:在设置为NVIC_PriorityGroup_2 时,抢占优先级有2^2=4个,同理响应优先级也有4个。
2. 针对每个中断,设置对应的抢占优先级和响应优先级。
void NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct);
typedef struct
{uint8_t NVIC_IRQChannel; //指定要初始化的中断通道(中断号)uint8_t NVIC_IRQChannelPreemptionPriority;//设置响应优先级,0~15数值越低,优先级越uint8_t NVIC_IRQChannelSubPriority; //设置抢占优先级,0~15数值越低,优先级越高FunctionalState NVIC_IRQChannelCmd; //ENABLE/DISABLE。禁止中断/使能中断
} NVIC_InitTypeDef;
注意:只能指定一个,不能使用 或运算符| 来初始化多个中断通道。
2.4 stm32中断配置思路
- 配置中断优先组。
NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup); - 配置中断优先级,开启中断通道。
NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct); - 配置使能相应外设的中断。
不同外设的配置函数有差异。如外部中断使用EXTI_Init(),串口使用USART_ITConfig()。 - 编写相应中断的中断服务函数。
xxx_IRQHanlder()
3、stm32F10x产品的向量表。
stm32有许多中断,用中断向量表对中断进行管理。中断向量表给每个中断分配一个地址。这个地址里面是一个跳转语句。可以看到每个向量占用4个字节。而这四个字节就可以存储一个跳转指令。
非阴影部分为外设的中断向量。4个字节
共60个外部中断。
stm32学习笔记-中断系统相关推荐
- 009 - STM32学习笔记 - 中断
009 - STM32学习笔记 - 中断 这节的内容,野火的官方视频我反复看了好几次,但是感觉火哥在这块讲解的特别绕,理解起来很吃力,后来在看了一下其他老师的视频,结合一些书本资料和官方手册,才搞清楚 ...
- 微机原理学习笔记——中断系统
中断系统 目录 中断系统 一.中断的基本概念 中断源 开中断和关中断 中断优先权 中断向量表 中断过程 二.8086中断系统 中断源 可屏蔽中断周期 中断向量表 中断过程 三.可编程中断控制器8259 ...
- STM32学习笔记1----STM32F429系统时钟
FreeRTOS任务基本知识 1.系统时钟 在 STM32F429 中,有 5 个最重要的时钟源,为 HSI.HSE.LSI.LSE.PLL.其中 PLL实际是分为三个时钟源,分别为主 PLL ...
- STM32学习笔记(三)丨中断系统丨EXTI外部中断(对射式红外传感器计次、旋转编码器计次)
本篇文章包含的内容 一.中断系统 1.1 中断的定义 1.2 中断优先级 1.3 中断的嵌套 1.4 STM32中的中断系统 1.4.1 STM32的中断资源 1.4.2 嵌套中断向量控制器 NVIC ...
- STM32学习笔记(四)丨TIM定时器及其应用(定时中断、内外时钟源选择)
本篇文章包含的内容 一.TIM 定时器 1.1 TIM 定时器简介 1.2 TIM 定时器类型及其工作原理简介 1.2.1 基本定时器工作原理及其结构 1.2.2 通用定时器工作原理及其结构 1.2. ...
- STM32学习笔记 | 引起电源和系统异常复位的原因
关注+星标公众号,不错过精彩内容 每一块处理器都有复位的功能,不同处理器复位的类型可能有差异,引起复位的原因也可能有多种. STM32的复位功能非常强大,可通过软件.硬件和一些事件触发系统复位,而且通 ...
- 《STM32学习笔记》4——核心功能电路与编程(下)
接上文,文中的图片,大多数来自视频的截图(来自洋桃电子). 欢迎大家批评指正! STM32学习笔记-专栏 文章目录 一.蜂鸣器驱动 1.蜂鸣器介绍 2.蜂鸣器电路 3.蜂鸣器程序 二. MIDI 音乐 ...
- STM32学习笔记(六)丨TIM定时器及其应用(输入捕获丨测量PWM波形的频率和占空比)
本篇文章包含的内容 一.输入捕获 1.1 输入捕获简介 1.2 输入捕获通道的工作原理 1.3 输入捕获的主从触发模式 1.4 输入捕获和PWMI结构 二.频率的测量方法 2.1 测频法 2.2 测周 ...
- STM32学习笔记(15)——SPI协议
STM32学习笔记(15)--SPI协议 一.SPI协议简介 1. 物理层 2. 协议层 (1) 通讯的开始与停止 (2)时钟极性CPOL.时钟相位CPHA 二.STM32的SPI外设 1. 通讯引脚 ...
最新文章
- 计算机教师简介50字,教师风采个人简介50字数.docx
- 通俗易懂的图解堆排序
- 1.15 异常处理规则
- html解析的简单方式,HTML解析看我就够了,不依赖任何第三方,两个方法搞定
- 实验一 简单词法分析程序设计
- leetcode580. 统计各专业学生人数(SQL)
- linux怎么随机按行打散文件,linux shell 将文件按照行数以及顺序拆分成多个文件...
- shell脚本实现printf数字转换N位补零
- Pwn2Own 2020 曝出的Linux 内核漏洞已修复
- CS229的简单梳理(待续)
- 组合数学(2)——组合矩阵
- 当不知轴承型号时如何寻找轴承故障频率_轴承故障的检测,处理
- 计算机应用软件开机自动启动设置,如何关闭开机自动启动的软件?
- java excel 冻结_如何实现表格的首行冻结2
- 单细胞测序的marker基因
- Java游戏实验报告_java俄罗斯方块游戏实验报告.doc
- Flink 实现Locality 模式调度
- 踽踽独行,你好像这世界上最孤独的灵魂
- AGV搬运机器人磁导航传感器D-MNSV7-X16安装方法与注意事项
- c语言统计行数单词数字符数,C语言统计字数行数单词数的程序
热门文章
- .San(三). Xia(峡).近一个月调度过程图解简介
- iot-Scada免费Scada组态软件系列教程4-二次开发与版本部署
- 优先使用TimeUnit类中的sleep()(转自 ImportNew - 刘志军 翻译自 javarevisited)
- js和jQuery获取浏览器窗口的高度、宽度的方法详解
- PI圆周率小数点后一百万位数据
- Win10家庭版组策略打不开怎么办
- 百度AI产品与应用学习路线之AI服务应用(百度云智学院学习笔记)
- JAVA常用基础API(经典实例)
- SVN Commit的时候提示Unexpected HTTP status 413 'Request Entity Too Large' on xxxx
- 联想拯救者y7000充电一闪一闪,接触不良