ZHCUAN6E October 2022 – May 2025 MSPM0L1105 , MSPM0L1106 , MSPM0L1116 , MSPM0L1117 , MSPM0L1227 , MSPM0L1227-Q1 , MSPM0L1228 , MSPM0L1228-Q1 , MSPM0L1303 , MSPM0L1304 , MSPM0L1304-Q1 , MSPM0L1305 , MSPM0L1305-Q1 , MSPM0L1306 , MSPM0L1306-Q1 , MSPM0L1343 , MSPM0L1344 , MSPM0L1345 , MSPM0L1346 , MSPM0L2227 , MSPM0L2227-Q1 , MSPM0L2228 , MSPM0L2228-Q1
嵌套矢量中断控制器 (NVIC) 是一个业界通用的 Arm 组件,可将外设中断(位于处理器外部)连接到 CPU。NVIC 支持连接多达 32 个本机外设中断源。
可通过系统专用外设总线 (PPB) 区域中的存储器映射寄存器配置 NVIC。请参阅表 3-7 中的 NVIC 寄存器列表。随器件提供的软件开发套件 (SDK) 对于 NVIC 支持标准 Arm Cortex 微控制器软件接口标准 (CMSIS) 寄存器访问定义。访问任何 NVIC 寄存器时,应用软件必须使用 32 位对齐的字大小事务。
除了将外设中断连接到处理器之外,NVIC 还支持对每个中断的优先级进行编程。
可以通过 NVIC 中的中断设置使能 (ISER) 和中断清除使能 (ICER) 寄存器来读取、设置和清除外设中断的启用状态。32 个中断映射到 ISER 和 ICER 寄存器,其中的中断 0 位于每个寄存器的 BIT0 位置 (LSB),中断 31 位于每个寄存器的 BIT31 位置 (MSB)。要启用中断,请设置 ISER 寄存器中相应的使能位。向 ISER 写入“0”无效。可以通过读取 ISER 寄存器来确定启用了哪些中断。读取时,“1”表示启用中断;“0”表示禁用。要禁用中断,请设置 ICER 寄存器中相应的使能位。向 ICER 写入“0”无效。
在 NVIC 已禁用某个中断的情况下,如果该中断由相应的外设设置为有效状态,则 NVIC 中断将进入挂起状态,但不会中断处理器。如果中断在有效状态时(处理程序正在运行时)被禁用,它将保持有效状态,直到异常处理程序返回结果或发生复位,但不会进一步激活。
可以通过 NVIC 中的中断设置挂起 (ISPR) 和中断清除挂起 (ICPR) 寄存器来读取、设置和清除中断挂起状态。32 个中断映射到 ISPR 和 ICPR 寄存器,其中的中断 0 位于每个寄存器的 BIT0 位置 (LSB),中断 31 位于每个寄存器的 BIT31 位置 (MSB)。要读取某个中断是否为挂起状态,请读取 ISPR 或 ICPR。读取时,“1”表示中断为挂起状态;“0”表示非挂起状态。要通过软件将中断设置为挂起状态,请设置 ISPR 寄存器中的相应位。向 ISPR 写入“0”无效。要清除中断挂起状态,请设置 ICPR 寄存器中的相应位。向 ICPR 写入“0”无效。请注意,如果外设中断条件仍然存在,即使挂起状态被清除也将由硬件再次设置。
NVIC 上的中断具有可编程的优先级。可能有四个优先级。设置优先级的方法是对 NVIC 中的八个 IPRx 寄存器进行编程。每个优先级字段的长度为 8 位,因此每个 32 位寄存器可配置 4 个中断的优先级。Arm Cortex-M0+ 仅实现每个 8 位优先级字段的最高有效 2 位(提供 4 个优先级)。较低的优先级值具有较高的优先级。系统异常(复位、NMI、硬故障)分别具有固定的优先级 -3、-2 和 -1。因此,这些异常的优先级总是高于外设中断。外设中断优先级可编程为 0、64、128 或 192,其中 0 为最高优先级,192 为最低优先级。
如果处理器当前正在处理一个异常,那么这个异常只能被一个更高优先级的异常抢占。如果处于挂起状态下的多个异常都分配到相同的优先级,则首先处理具有最低异常编号的异常。
| 地址 | 寄存器 | CMSIS | 说明 |
|---|---|---|---|
| 0xE000.E100 | NVIC_ISER | NVIC->ISER[0] | 中断设置使能寄存器 |
| 0xE000.E180 | NVIC_ICER | NVIC->ICER[0] | 中断清除使能寄存器 |
| 0xE000.E200 | NVIC_ISPR | NVIC->ISPR[0] | 中断设置挂起寄存器 |
| 0xE000.E280 | NVIC_ICPR | NVIC->ICPR[0] | 中断清除挂起寄存器 |
| 0xE000.E400 | NVIC_IPR0 | NVIC->IP[0] | 中断优先级寄存器 (0-3) |
| 0xE000.E404 | NVIC_IPR1 | NVIC->IP[1] | 中断优先级寄存器 (4-7) |
| 0xE000.E408 | NVIC_IPR2 | NVIC->IP[2] | 中断优先级寄存器 (8-11) |
| 0xE000.E40C | NVIC_IPR3 | NVIC->IP[3] | 中断优先级寄存器 (12-15) |
| 0xE000.E410 | NVIC_IPR4 | NVIC->IP[4] | 中断优先级寄存器 (16-19) |
| 0xE000.E414 | NVIC_IPR5 | NVIC->IP[5] | 中断优先级寄存器 (20-23) |
| 0xE000.E418 | NVIC_IPR6 | NVIC->IP[6] | 中断优先级寄存器 (24-27) |
| 0xE000.E41C | NVIC_IPR7 | NVIC->IP[7] | 中断优先级寄存器 (28-31) |