1.什么是中断
中断: 由于中断源的触发,常规程序被打断, CPU转
而运行中断响应函数,而后又回到常规程序的执行,
这一过程叫做中断。
中断优先级的概念
中断的意义和作用
中断处理的过程和术语
STM32 GPIO外部中断简图
从反向介绍
2.NVIC基本概念
内核中NVIC的位置 核心外设!!!在内核内部
ST公司裁剪了 中断优先级
NVIC的内部结构
由NVIC控制所有中断源 可屏蔽和接受中断源 0 1 2 3… 然后进入中断仲裁 (每一个中断源的中断优先级都存储在图片上的四个bit位中)中断优先级分组详细内容在下面
NVIC寄存器介绍
中断使能寄存器 一共256个位 其中240个位是对应外部中断 寄存器写1就是使能(16个位保留)
中断除能寄存器 和使能寄存器的功能相反 寄存器位数一样
应用程序中断及复位控制寄存器 只有一个寄存器 一共32位 但是我们只使用位10到位8
中断优先寄存器 对应240个外部中断 一个寄存器对应的是8个位 但是stm32只使用四个位
NVIC工作原理
外部中断(240个里的四个) 进入内核中的NVIC 进入使能和除能寄存器 如果使能就进入IPR寄存器 除能就无法进入 再经过IPR寄存器和AIRCR寄存器的中断优先级控制
排列出中断的优先级进入CPU进行处理
而内部中断则是直接进入SHPR 寄存器(地位和IPR一样) 在进入CPU处理
中断向量表
中断向量表的概念
就是每一个中断函数都有一个地址储存在flash的目录 当中断函数对应的中断源产生请求中断 那么系统就会去flash的目录找到对应的中断函数的地址跳转到中断函数执行 (这个目录会根据中断优先级排列各自中断函数的地址 0 1 2 3…)
在参考手册中查看中断向量表
其中main的等级最低 任何中断函数都可抢夺CPU使用权
stm32中断优先级基本概念
抢占优先级可以打断 响应优先级不可以被打断 (就比如1和2的相应优先级一样 1正在执行 2无法打断1的执行来执行 同理 1也不可以打断2正在执行的程序来执行)
如果要同时处理两个响应优先级相同的中断 就要看自然优先级
比如优先级为0就大于优先级为1 以此类推(负数比0更优先执行)
stm32中断优先级分组
STM32中断优先级分组 本来是NVIC有8个分组的 但是由于IPR只使用四个位 所以分组减少了3组 总共为5个组
第0组有0个抢占优先级 有16个响应优先级 第一组有2个抢占优先级 8个响应优先级
第二组有4个抢占优先级以此类推
中断优先级举例
如RTC和EXTI1的抢占优先级一样 响应优先级高的先执行(数字越小越先执行)
Systick和EXTI0的抢占优先级和响应优先级一样 就看自然优先级 谁小谁先执行
再举一个列子
第一幅图
第一条虚线是常规程序 main函数 然后收到了A的中断请求 执行A的中断函数 然后在执行A的中断函数中又收到了B的中断请求 因为B的抢占优先级高于A所以会进行中断嵌套就是在执行A的中断函数的过程中执行B的中断函数(跳转到B的中断函数) 待中断A B完成后再回到main函数中执行常规操作
第二幅图
在执行常规程序时 收到了A的中断请求 执行A的中断函数 又收到了BC的中断请求因为C的抢占优先级比B高(数字越小越高)所以先执行C的在执行B的
第三幅图
同第二幅图一样 只不过C是因为子优先级0小于1 C的子优先级更高
脉冲型中断源和电平型中断源
脉冲中断源不需要手动清除中断源 而电平型中断源需要手动清除
中断的四种状态
第三个图就是活动且挂起 就是在执行中断A的函数中 A的中断请求又一次发起在挂起状态
第四个图是A在活动 B也在活动(在B的中断函数执行的过程当中)
中断协作模型
由片上外设产生中断源
如何使用NVIC
标准库
第一个函数是用来调整中断的优先级的(虚线的位置 给几个位给抢占优先级给几个位给子优先级)
第二个函数是用来选择中断源的或者屏蔽中断源的
这个函数NVIC_PriorityGroupConfig
调用这个函数传入相应的宏定义 就可以划分抢占优先级和子优先级 在图片中划分了两个抢占优先级和两个子优先级 (如果不想发生中断嵌套就把抢占优先级划分为0)
NVIC初始化函数
就是声明一个结构体 然后往结构体内写值 这个值可以直接为数字也可以为宏定义 这个结构体的第一个成员就是中断源的名称 (去IRQn_Typq寻找)第二个成员是抢占优先级的值 第三个成员是子优先级的值 (比如抢占优先级的值为0 就前两个二进制位位00 然后子优先级为2 对应的二进制位为10 那四个位就为0010 中断优先级)第四个成员就是开关 使能中断