理解STM32F103的中断优先级分组
分组名称 | 抢占优先级范围 | 子优先级范围 | 分配方式 |
---|---|---|---|
NVIC_PriorityGroup_0 | 0 | 0-15 | 0位 抢占优先级,4位 子优先级 |
NVIC_PriorityGroup_1 | 0-1 | 0-7 | 1位 抢占优先级,3位 子优先级 |
NVIC_PriorityGroup_2 | 0-3 | 0-3 | 2位 抢占优先级,2位 子优先级 |
NVIC_PriorityGroup_3 | 0-7 | 0-1 | 3位 抢占优先级,1位 子优先级 |
NVIC_PriorityGroup_4 | 0-15 | 0 | 4位 抢占优先级,0位 子优先级 |
// 设置优先级分组
/* 因此抢占优先级的取值范围为0-3,子优先级的取值范围为0-3 */
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); // 配置USART1中断
NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);// 配置TIM2中断
NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
NVIC_Init(&NVIC_InitStructure);
/*
行为分析:
TIM2中断(抢占0)可以打断USART1中断(抢占1)
如果TIM2和USART1同时发生,TIM2先执行(抢占优先级更高)
如果有两个抢占优先级相同的中断同时发生,子优先级高的先执行因此:
需要精细的中断嵌套控制:选择更多抢占优先级的分组(如Group_3或Group_4)
需要精细的同优先级中断顺序控制:选择更多子优先级的分组(如Group_0或Group_1)*/
此外(来此安富莱):
-
具有高抢占式优先级的中断可以在具有低抢占式优先级的中断服务程序执行过程中被响应,即中
断嵌套,或者说高抢占式优先级的中断可以抢占低抢占式优先级的中断的执行。 -
在抢占式优先级相同的情况下,有几个子优先级不同的中断同时到来,那么高子优先级的中断优先被响应。
-
在抢占式优先级相同的情况下,如果有低子优先级中断正在执行,高子优先级的中断要等待已被响应的低子优先级中断执行结束后才能得到响应,即子优先级不支持中断嵌套。
-
Reset、 NMI、 Hard Fault 优先级为负数, 高于普通中断优先级, 且优先级不可配置。
-
对于初学者还有一个比较纠结的问题就是系统中断(比如: PendSV, SVC, SysTick)是不是一定比外部中断(比如 SPI,USART)要高,答案:不是的,它们是在同一个 NVIC 下面设置的。