NVIC: Nested vectored interrupt controller, 嵌套中断向量控制器。
中断与异常:
所有能打断正常执行流的事件都称为异常。 异常与中断的区别在于, 中断请求是来自于Cortex内核外部, 比如各种片上外设, 外部中断请求等, 它们对于内核是”异步”的; 而异常则是由于Cortex内核在执行指令或者访问存储等操作时所产生的, 对于Cortex内核来说是属于”同步”的(可以参见Cortex M3权威指南), 异常和中断一般可以不加区分的使用。
Cortex内核可以支持多达240个外部中断, 编号16 – 255. 编号1 – 15的为系统异常, 编号0未被使用。
Cortex支行中断嵌套, 允许高优先级的中断抢占低优先级的中断。 Cortex M3/M4可支行多达256级的可编程优先级和128级的抢占, 但有3个系统异常优先级固定, 并且优先级为负数, 高于其它任何异常, 这三个异常分依次为 复位, NMI, Hard Fault.
NMI是Non-Maskable Interrupt(不可屏蔽中断)缩写, 在STM32F4中, NMI被连接到时钟安全系统CCS(Clock security system)异常上。
Hard Fault是总线fault, 存储管理fault, 用法fault所产生的结果, 详细信息可以参考Cortex M3权威指南。
优先级寄存器
如上所述, Cortex M3/M4支行多达256级的可编程优先级和128级抢占, 每个中断使用一个8位的寄存来配置优先级。 但实际一款芯片会根据情况做适当的精简, 裁剪掉表达优先级的几个低端有效位, 以减少优先级的级数。但是不管使用多少位来表达优先级, 都是以MSB对齐的, 这主要是为了避免程序在不同器件之间移植时不会出现优先级顺序的更改。
抢占优先级和响应优先级
响应优先级也叫做 亚优先级 或者 子优先级, 每一个中断都有这两种优先级属性。 当一个低优先级的中断正在执行时, 如果有更高优先级的中断请求, 系统将会响应这个中断, 即发生中断嵌套。
如果两个中断的优先级相同, 则后来的中断要等到先来的中断执行完毕后才会被响应。 但是如果两个中断同时到达(或者都在挂起状态), NVIC会根据它们响应优先级的高低来决定响应那一个。
如果它的的响应优先级也相同, 那么NVIC会根据它们在中断向量表中的排序先后来决定先响应那一个。
在STM32中使用了4bit来表达抢占优先级和响应优先级, 有以下5种分组方式:
可见STM32一共提供了16级中断优先级.