中断向量表与优先级

← 中断总览 | ← 主页


中断向量表

中断向量表建立了 中断事件 与 中断处理程序入口地址 的对应关系。

17762613915431776261401220

上电-⇒SCB_VTOR寄存器里面找到中断向量表的地址


中断编号

Exception Number 和 CMSIS 的 IRQn_Type 都是 编号 ,不是优先级。

硬件使用 Exception Number 将内核异常和外设中断放在同一套异常模型中进行仲裁, CMSIS 则使用 IRQn_Type 方便 C 代码区分二者。

类型物理异常号Exception NumberCMSIS 中断号IRQn_Type
内核系统异常1~15使用负数表示;Reset 通常不定义对应的IRQn
芯片厂商定义的外设中断16 及以上从 0 开始递增
异常或中断Exception NumberIRQn_Type
Reset1通常无Reset_IRQn
NMI2NonMaskableInt_IRQn = -14
HardFault3HardFault_IRQn = -13
MemManage4MemoryManagement_IRQn = -12
BusFault5BusFault_IRQn = -11
UsageFault6UsageFault_IRQn = -10
SVCall11SVCall_IRQn = -5
DebugMonitor12DebugMonitor_IRQn = -4
PendSV14PendSV_IRQn = -2
SysTick15SysTick_IRQn = -1
第一个外设中断160

对 CMSIS 已定义的异常或中断,两套编号满足:

不要把负数 IRQn 当成高优先级。 例如 NMI 的 IRQn 是 ,但其固定架构优先级是 ;HardFault 的 IRQn 是 ,固定架构优先级是 。Reset、NMI、HardFault 的固定架构优先级依次为 、、,不能通过 NVIC 配置。

优先级设置

优先级分组抢占优先级子优先级域
0Bit[7:1]Bit[0]
1Bit[7:2]Bit[1:0]
2Bit[7:3]Bit[2:0]
3Bit[7:4]Bit[3:0]
4Bit[7:5]Bit[4:0]
5Bit[7:6]Bit[5:0]
6Bit[7]Bit[6:0]
7—Bit[7:0]
  • 优先级分组 : 由 SCB→AIRCR.PRIGROUP 配置,决定优先级寄存器 8 位字段如何切分;高位是抢占优先级,低位是子优先级域。
  • 优先级寄存器 :系统异常使用 SCB→SHPR1~SHPR3,外设中断使用 NVIC→IPR(CMSIS 映射为 SCB→SHP[] 和 NVIC→IP[],有很多)。

都在NVIC外设里

  • 抢占优先级与子优先级 :硬件依据 PRIGROUP 解释同一个优先级字段(优先级寄存器)

抢占优先级决定能否打断当前中断;抢占优先级相同时,子优先级决定 Pending 中断的响应顺序,但不能触发嵌套。

CMSIS 通常通过 NVIC_SetPriorityGrouping() 设置 PRIGROUP,再通过 NVIC_SetPriority() 写入 SHPR 或 IPR 对应的优先级字段。