
你有没有想过一个问题:
多个外设同时产生中断,谁先执行?高优先级中断来了,低优先级中断怎么办?
NVIC说了算。
NVIC(Nested Vectored Interrupt Controller)是Cortex-M内核的"中断CPU"------专门管中断的硬件模块,不依赖软件轮询。
NVIC的五大核心能力
1. 优先级仲裁
- 抢占优先级:决定能否打断别人(数值越小越高)
- 子优先级:抢占相同时决定谁先执行(不能打断)
- 自然优先级:向量表位置(最后的仲裁)
2. 硬件向量取址
中断触发后,NVIC直接从向量表取ISR地址(无需软件查中断标志),配合硬件压栈,中断响应仅12个时钟周期。
3. 尾链优化
中断A未退出、中断B已挂起→跳过A的出栈和B的入栈,直接执行B,连续响应仅6个时钟周期。
4. 优先级分组
SCB->AIRCR的PRIGROUP字段决定4个优先级位如何切分(分组0~4,默认分组4:4位抢占,0位子优先)。
5. 中断屏蔽与控制
- ISER/ICER:使能/禁用中断
- ISPR/ICPR:挂起/清除挂起(软件触发中断)
- IABR:查询中断是否正在执行
可配置的16级优先级
NVIC支持最多16级抢占优先级(分组4),数值0最高、15最低。

中断响应流程(硬件自动完成)
- 外设产生中断请求
- NVIC裁决优先级(与当前中断比较,判断是否嵌套)
- 硬件自动压栈(8个寄存器,32字节)
- 从向量表取ISR地址
- 跳转执行ISR
- ISR返回(硬件自动出栈)
压栈、取址、出栈都是硬件完成,无需软件PUSH/POP。
这个故事的启示, NVIC不是"外设",是Cortex-M内核的组成部分。没有NVIC,中断响应需要软件查询标志、软件压栈------慢且不确定。 NVIC让ARM32的中断响应快且确定(12个时钟周期)。写在最后, NVIC的5个核心能力:优先级仲裁、硬件向量取址、尾链优化、优先级分组、中断屏蔽控制------五个功能,撑起整个中断系统。
(本文灵感源于于振南《新概念ARM32单片机》教程第5.4节、第5.5节、第5.6节、第5.8节。)
觉得有用?点赞、转发,让更多人看懂NVIC的"中断CPU"定位。
