目录
NVIC简述
- NVIC(Nested Vectored Interrupt Controller):中断控制器,用于总体管理异常,称之为“内嵌向量中断控制器”。
NVIC中断优先级分组
单片机中断数量对比
- STM32单片机:由CM3剪裁而来,以STM32F103为例其就含有60个可屏蔽中断
- 51单片机:仅有五个中断
单片机定时器优先级对比
- STM32单片机:因中断较多,用户需要根据自己需求设计中断优先级的先后
- 51单片机:因仅有五个定时器,由芯片固定中断优先级供客户使用
STM32单片机中断优先级分组
- 原因:因 STM32 需要用户自己设计中断优先级,中断优先级分组应运而生
- 分组的作用:根据客户需求,设置抢占优先级与响应优先级分别占几位
- 如何分组:由 3bit ( AIRCR[10:8] ) 控制抢占优先级与响应优先级分别占几位
- 抢占优先级与响应优先级:由 4bit ( IP bit[7:4] ) 控制不同的优先级决定中断发生的先后
分组配置寄存器SCB->AIRCR:
组 | AIRCR[10:8] | IP bit[7:4]分配情况 | 分配结果 |
0 | 111 | 0:4 | 0位抢占优先级:4位响应优先级 |
1 | 110 | 1:3 | 1位抢占优先级:3位响应优先级 |
2 | 101 | 2:2 | 2位抢占优先级:2位响应优先级 |
3 | 100 | 3:1 | 3位抢占优先级:1位响应优先级 |
4 | 011 | 4:0 | 4位抢占优先级:0位响应优先级 |
分配结果简述(以2组为例):
- 要配置2位抢占优先级,2位响应优先级,就需先配置 AIRCR[10:8]的数值为101
- 抢占优先级占2位有4种选择,响应优先级占2位有4种选择,故中断共可配置16种优先级
NVIC中断优先级设置
抢占优先级与响应优先级的作用
- 高抢占优先级可以打断正在进行的低抢断优先级
- 抢占优先级相同时,高响应优先级不可以打断低响应优先级
- 抢占优先级相同时,当两个中断同时发生的情况下,响应有限级高的先执行
- 如果抢占和响应有限级均相同,则看哪个中断先发生
NVIC实际应用
分组设置
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置中断分组,一般在初始化中进行
注:一般情况下,系统代码执行过程中,只设置一次中断优先级分组,设置好分组之后一般不会再改变分组。随意改变分组会导致中断管理混乱,程序出现意想不到的执行结果。
优先级设置
NVIC_InitTypeDef NVIC_InitStructure; //结构体重命名
//set NVIC
NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn; //选择通道(要中断的对象)
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //设置抢占优先级
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //设置响应优先级
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //通道使能
NVIC_Init(&NVIC_InitStructure); //根据以上参数初始化NVIC寄存器