首先来说说两个概念,
1、NVIC的优先级概念
抢占式优先级 (pre-emption priority):
高占先式优先级的中断事件会打断当前的主程序/中断程序运行— —抢断式优先响应,俗称中断嵌套。
副优先级(subpriority):
在占先式优先级相同的情况下,高副优先级的中断优先被响应;
在占先式优先级相同的情况下,如果有低副优先级中断正在执行, 高副优先级的中断要等待已被响应的低副优先级中断执行结束后才 能得到响应——非抢断式响应(不能嵌套)。
总结:I: 关于抢占优先级,它总是与中断被嵌套相关连.比如说在A中断中嵌套了B中断.B能打断A中断,B中断就一定属于抢占优先级了.
II: 关于副优先级,个人认为它与中断嵌套无关,它不能被嵌套.
2、判断中断是否会被响应的依据
首先是占先式优先级,其次是副优先级;
占先式优先级决定是否会有中断嵌套;
Reset、NMI、Hard Fault 优先级为负(高于普通中断优先级)且不可调整。
接着简单了解一下中断优先级(NVIC.)
STM32嵌套向量中断控制器(NVIC)中断优先级理解 CM3内核寄存器
AIRCR——应用程序中断及复位控制寄存器 地址(0XE000-ED0C)
AIRCR是个32位寄存器,其中第8,9,10位为 PRIGROUP 优先级分组设置位。见表1
表1 AIRCR寄存器图
表2为PRIGROUP[2:0] 即AIRCR 8,9,10位
PRIGROUP [2:0] | Interrupt priority level value, PRI_N[7:4] 中断优先寄存器组PRI_N[7:4]位⑴ | |
| Group priority Bits 抢占优先级对应位 | | | |
| | | | | |
| | | | | |
| | | | | |
| | | | | |
| | | | | |
|
|
|
|
|
|
表2 T优先级分组
表2注释⑴说明:
关于中断优先寄存器组PRI_N[7:4]位, PRI_N在CM3内核中为PRI_1~PRI_249.在STM32103XX中可屏蔽中断为60个.所以PRI_N为PRI_1~PR1_59.
而实际上在MDK里的STM32库文件把PRI_N定义为32位的寄存器组IPR[ 15].
即IPR[ 0]~ IPR[ 14],每一维元素因为有32位.(每个中断8位配置优先级)所以每一
元素可以配置4个中断.比如说IPR[ 0]的位(31:23)配置中断A,(23:15)配
中断B,(15:7)配置中断C,(7:0)配置中断D。就是说每8位配置一个中断,那么其实这8位中,STM32只用了高4位来配置中断优先级别,低4位无效。
注意STM3210XX系列只用了4位来表示优先级别.所以STM3210XX系列最多优先中断级别为16级。
2^4=16级。
如果上面的一段话对初学者理解还有点迷糊的话,我们看一下下面的图就应该很清楚了。
表2属于图片无法被上传(这点腾迅真的做的不够好)
结合STM32库文件表达:就是SCB->AIRCR配置--------》IP[0]。
这里有一个歧义AIRCR配置--------》IPR[0]是对整个32位IPR[0]四个中断同时配置呢?还是可以对IPR[0]中的四个中断分别设置,个人觉得可以分别独立配置
表2真值表就是具体配置STM32中断级优先级别了。
表2来自ST官方资料,STM32F10xxx Cortex-M3编程手册-英文版.pdf第135页。
参考理解Cortex-M3 权威指南.PDF