嵌套向量中断控制器
本章规定 Armv8-M 嵌套向量中断控制器(NVIC)规则。
1. NVIC 定义¶
Armv8-M PE 包含一个集成的中断控制器。
适用于 Armv8.0-M 及以后架构版本的实现。
中断控制器类型寄存器(Interrupt Controller Type Register,ICTR)定义所支持的外部中断线数量,以及已实现的 NVIC 寄存器数量。具体如下表所示:
| ICTR.INTLINESNUM | 最大中断数 | 已实现的最高 NVIC_IPRn 索引 n | 其他所有 NVIC 寄存器的最高索引 n |
|---|---|---|---|
| 0b0000 | 32 | 7 | 0 |
| 0b0001 | 64 | 15 | 1 |
| 0b0010 | 96 | 23 | 2 |
| 0b0011 | 128 | 31 | 3 |
| 0b0100 | 160 | 39 | 4 |
| 0b0101 | 192 | 47 | 5 |
| 0b0110 | 224 | 55 | 6 |
| 0b0111 | 256 | 63 | 7 |
| 0b1000 | 288 | 71 | 8 |
| 0b1001 | 320 | 79 | 9 |
| 0b1010 | 352 | 87 | 10 |
| 0b1011 | 384 | 95 | 11 |
| 0b1100 | 416 | 103 | 12 |
| 0b1101 | 448 | 111 | 13 |
| 0b1110 | 480 | 119 | 14 |
| 0b1111 | 496 | 123 | 15 |
适用于 Armv8.0-M 及以后架构版本的实现。
作为 ICTR.INTLINESNUM 影响的一个示例,若 ICTR.INTLINESNUM = 0b0100,则:
- 支持 160 条外部中断线。
- 寄存器
NVIC_IPR0至NVIC_IPR39已实现,而NVIC_IPR40至NVIC_IPR123未实现。 - 寄存器
NVIC_ISER0至NVIC_ISER4已实现,而NVIC_ISER5至NVIC_IPR15未实现。所有其他 NVIC 寄存器实现相同的寄存器范围。
适用于 Armv8.0-M 及以后架构版本的实现。
参见:
- 《中断控制器类型寄存器》(ICTR, Interrupt Controller Type Register)。
- 《嵌套向量中断控制器块》(Nested Vectored Interrupt Controller Block)。
- 《嵌套向量中断控制器块(NS 别名)》(Nested Vectored Interrupt Controller Block(NS alias))。
2. NVIC 操作¶
实现哪些 NVIC 中断是 IMPLEMENTATION DEFINED 的。
适用于 Armv8.0-M 及以后架构版本的实现。
当某条 NVIC 中断线未实现时,与其关联的寄存器字段为保留。
适用于 Armv8.0-M 及以后架构版本的实现。
只有既挂起、又被使能且具有足够优先级的中断,才能抢占 PE 的执行。
适用于 Armv8.0-M 及以后架构版本的实现。
以下情况会使该中断关联的挂起状态被置位:
- 与该中断关联的输入为 HIGH,而与该中断关联的活动状态为清除,且同时没有正在进行的、对
NVIC_ICPRn的写操作来清除挂起状态。 - 与该中断关联的输入从 LOW 变为 HIGH,而与该中断关联的活动状态为置位。
适用于 Armv8.0-M 及以后架构版本的实现。
当某中断被禁用时,中断置位会使该中断变为挂起,但该中断不能变为活动。若某中断在处于活动状态时被禁用,则该中断保持活动状态,直至被复位或被异常返回清除。清除相应的使能位可阻止该关联中断的任何新的激活。
适用于 Armv8.0-M 及以后架构版本的实现。
Armv8-M 的中断行为同时兼容高电平有效与脉冲敏感的中断信号:
- 对于电平敏感中断,只要在异常处理程序返回之前电平被清除,则关联的异常处理程序对每次出现执行一次。若异常处理程序返回之后输入电平仍为 HIGH,则该异常会再次被挂起。
- 对于脉冲敏感中断,无论 NVIC 在进入异常处理程序之前看到多少个脉冲,关联的异常处理程序都只执行一次。若在进入异常处理程序之后出现脉冲,则该异常会再次被挂起。
适用于 Armv8.0-M 及以后架构版本的实现。
在某些实现中,脉冲敏感中断信号被保持足够长的时间,以确保 PE 能可靠地采样它们。
适用于 Armv8.0-M 及以后架构版本的实现。
所有 NVIC 中断都具有可编程的优先级值以及关联的异常号。
适用于 Armv8.0-M 及以后架构版本的实现。
可以通过写入相应的中断置位使能寄存器或中断清除使能寄存器的位字段,来使能与禁用 NVIC 中断。
适用于 Armv8.0-M 及以后架构版本的实现。
若关联的中断线不存在,实现可以把中断使能位硬连线为零。
适用于 Armv8.0-M 及以后架构版本的实现。
若关联的中断线不可禁用,实现可以把中断使能位硬连线为一。
适用于 Armv8.0-M 及以后架构版本的实现。
对于所支持的每条 NVIC 中断线,该 NVIC 中断是否支持在软件控制下置位和/或清除关联的挂起状态,是 IMPLEMENTATION DEFINED 的。
适用于 Armv8.0-M 及以后架构版本的实现。
参见:
- 第 B3.9 节《异常号与异常优先级号》(Exception numbers and exception priority numbers)。
- 第 B3.13 节《优先级模型》(Priority model)。
- 《嵌套向量中断控制器块》(Nested Vectored Interrupt Controller Block)。
- 《嵌套向量中断控制器块(NS 别名)》(Nested Vectored Interrupt Controller Block(NS alias))。