中断 NVIC的概念和原理

1.什么是中断

中断: 由于中断源的触发,常规程序被打断, CPU转
而运行中断响应函数,而后又回到常规程序的执行,
这一过程叫做中断。
中断优先级的概念
中断 NVIC的概念和原理_第1张图片

中断 NVIC的概念和原理_第2张图片
中断的意义和作用中断 NVIC的概念和原理_第3张图片
中断处理的过程和术语
中断 NVIC的概念和原理_第4张图片

STM32 GPIO外部中断简图中断 NVIC的概念和原理_第5张图片
从反向介绍

2.NVIC基本概念

内核中NVIC的位置 核心外设!!!在内核内部
中断 NVIC的概念和原理_第6张图片

在这里插入图片描述
在这里插入图片描述
ST公司裁剪了 中断优先级中断 NVIC的概念和原理_第7张图片
NVIC的内部结构
中断 NVIC的概念和原理_第8张图片
由NVIC控制所有中断源 可屏蔽和接受中断源 0 1 2 3… 然后进入中断仲裁 (每一个中断源的中断优先级都存储在图片上的四个bit位中)中断优先级分组详细内容在下面

NVIC寄存器介绍
中断 NVIC的概念和原理_第9张图片
中断使能寄存器 一共256个位 其中240个位是对应外部中断 寄存器写1就是使能(16个位保留)
中断除能寄存器 和使能寄存器的功能相反 寄存器位数一样
应用程序中断及复位控制寄存器 只有一个寄存器 一共32位 但是我们只使用位10到位8
中断优先寄存器 对应240个外部中断 一个寄存器对应的是8个位 但是stm32只使用四个位
NVIC工作原理
中断 NVIC的概念和原理_第10张图片
外部中断(240个里的四个) 进入内核中的NVIC 进入使能和除能寄存器 如果使能就进入IPR寄存器 除能就无法进入 再经过IPR寄存器和AIRCR寄存器的中断优先级控制
排列出中断的优先级进入CPU进行处理
而内部中断则是直接进入SHPR 寄存器(地位和IPR一样) 在进入CPU处理

中断向量表

中断向量表的概念中断 NVIC的概念和原理_第11张图片
就是每一个中断函数都有一个地址储存在flash的目录 当中断函数对应的中断源产生请求中断 那么系统就会去flash的目录找到对应的中断函数的地址跳转到中断函数执行 (这个目录会根据中断优先级排列各自中断函数的地址 0 1 2 3…)
在参考手册中查看中断向量表
中断 NVIC的概念和原理_第12张图片
在这里插入图片描述

中断 NVIC的概念和原理_第13张图片
其中main的等级最低 任何中断函数都可抢夺CPU使用权

stm32中断优先级基本概念

中断 NVIC的概念和原理_第14张图片
抢占优先级可以打断 响应优先级不可以被打断 (就比如1和2的相应优先级一样 1正在执行 2无法打断1的执行来执行 同理 1也不可以打断2正在执行的程序来执行)
如果要同时处理两个响应优先级相同的中断 就要看自然优先级
比如优先级为0就大于优先级为1 以此类推(负数比0更优先执行)

stm32中断优先级分组

STM32中断优先级分组 本来是NVIC有8个分组的 但是由于IPR只使用四个位 所以分组减少了3组 总共为5个组
中断 NVIC的概念和原理_第15张图片
第0组有0个抢占优先级 有16个响应优先级 第一组有2个抢占优先级 8个响应优先级
第二组有4个抢占优先级以此类推
中断优先级举例
中断 NVIC的概念和原理_第16张图片
如RTC和EXTI1的抢占优先级一样 响应优先级高的先执行(数字越小越先执行)
Systick和EXTI0的抢占优先级和响应优先级一样 就看自然优先级 谁小谁先执行
再举一个列子
中断 NVIC的概念和原理_第17张图片
第一幅图
第一条虚线是常规程序 main函数 然后收到了A的中断请求 执行A的中断函数 然后在执行A的中断函数中又收到了B的中断请求 因为B的抢占优先级高于A所以会进行中断嵌套就是在执行A的中断函数的过程中执行B的中断函数(跳转到B的中断函数) 待中断A B完成后再回到main函数中执行常规操作
第二幅图
在执行常规程序时 收到了A的中断请求 执行A的中断函数 又收到了BC的中断请求因为C的抢占优先级比B高(数字越小越高)所以先执行C的在执行B的
第三幅图
同第二幅图一样 只不过C是因为子优先级0小于1 C的子优先级更高

脉冲型中断源和电平型中断源

中断 NVIC的概念和原理_第18张图片
脉冲中断源不需要手动清除中断源 而电平型中断源需要手动清除
中断的四种状态
中断 NVIC的概念和原理_第19张图片
第三个图就是活动且挂起 就是在执行中断A的函数中 A的中断请求又一次发起在挂起状态
第四个图是A在活动 B也在活动(在B的中断函数执行的过程当中)

中断协作模型

中断 NVIC的概念和原理_第20张图片
由片上外设产生中断源

如何使用NVIC

标准库中断 NVIC的概念和原理_第21张图片
第一个函数是用来调整中断的优先级的(虚线的位置 给几个位给抢占优先级给几个位给子优先级)
第二个函数是用来选择中断源的或者屏蔽中断源的
这个函数NVIC_PriorityGroupConfig
中断 NVIC的概念和原理_第22张图片调用这个函数传入相应的宏定义 就可以划分抢占优先级和子优先级 在图片中划分了两个抢占优先级和两个子优先级 (如果不想发生中断嵌套就把抢占优先级划分为0)
NVIC初始化函数

就是声明一个结构体 然后往结构体内写值 这个值可以直接为数字也可以为宏定义 这个结构体的第一个成员就是中断源的名称 (去IRQn_Typq寻找)第二个成员是抢占优先级的值 第三个成员是子优先级的值 (比如抢占优先级的值为0 就前两个二进制位位00 然后子优先级为2 对应的二进制位为10 那四个位就为0010 中断优先级)第四个成员就是开关 使能中断

中断 NVIC的概念和原理_第23张图片

你可能感兴趣的:(单片机,嵌入式硬件)