告别稀里又糊涂!STM32中断优先级:分组配置与优先级判断规则全面解析

雨飞工作室 2026-06-09 17:48

ARM Cortex-M内核的单片机,都具有中断抢占优先级(Preemption Priority)和子优先级(Sub Priority,又称“响应优先级”),再加上将这些优先级进行分组,容易让人糊涂。

告别稀里又糊涂!STM32中断优先级:分组配置与优先级判断规则全面解析图1

一、怎么设置中断优先级

执行一条库函数即可:

HAL_NVIC_SetPriority(中断号抢占优先级号子优先级号)

两个参数都是数值越小,优先级越高,0为最高。

举例:

HAL_NVIC_SetPriority(DMA2_Stream2_IRQn, 0,0);

上面这条指令将DMA2_Stream2中断的抢占优先级和子优先级设为最高。


二、中断优先级分组(NVIC_PriorityGroup)

“中断优先级分组”这个概念听起来很抽象,换个说法就好懂了:其实就是为整个项目,选择一套“中断优先级分配方案”。注意,这是对整个项目的一次性选择,而不是针对某个具体的中断。

绝大多数Cortex‑M3/M4/M7系列内核的单片机,都有5种方案可选,只能选其一:

HAL_NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_0);HAL_NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_1);HAL_NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_2);HAL_NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_3);HAL_NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_4);

一旦选择了某一种中断方式,抢占优先级和子优先级的取值范围就固定下来了:

选择的中断方案

抢占优先级范围

子优先级范围

NVIC_PRIORITYGROUP_0

0

0~15

NVIC_PRIORITYGROUP_1

0~1

0~7

NVIC_PRIORITYGROUP_2

0~3

0~3

NVIC_PRIORITYGROUP_3

0~7

0~1

NVIC_PRIORITYGROUP_4

0~15

0

关键规则:

1.整个系统只能选择一个中断分组(全局配置),所有中断都遵循该分组规则;
2.4位总位数固定,抢占优先级位数越多,响应优先级位数越少,反之亦然;
3.数值越小,优先级越高(无论是抢占还是响应)。

优先级判断规则:

当多个中断同时触发时,STM32 按以下顺序判断执行顺序:

1.先比较抢占优先级:数值小的先执行,且可嵌套;
2.若抢占优先级相同,比较响应优先级:数值小的先执行;
3.若响应优先级也相同,比较中断向量表中的硬件编号:编号越小,优先级越高(硬件固定,无法修改)。

解读一下:

配置成NVIC_PRIORITYGROUP_0

抢占优先级是0,意味着完全没有抢占,所有中断一视同仁,此时中断响应顺序完全由子优先级决定。无论你代码里给抢占优先级参数填什么,实际都被视为0

HAL_NVIC_SetPriority(USART1_IRQn, 02); //抢占优先级实际为0HAL_NVIC_SetPriority(EXTI0_IRQn,31); // 抢占优先级实际也是0

配置成NVIC_PRIORITYGROUP_4

子优先级是0,意味着子优先级被禁用。优先级全部用于抢占,中断系统变成了纯抢占式模式。此时,当两个中断的抢占优先级相同时,不再比较子优先级,如果两个中断同时到来,硬件会根据中断编号(IRQn)顺序决定谁先响应(编号小的先执行)。

配置成 NVIC_PRIORITYGROUP_1~3

这三种是更均衡的方案,既有抢占优先级,也有子优先级,可以根据项目需要,灵活划分中断响应层次。


三、默认配置

STM32CubeMX直接生成的代码,默认配置成NVIC_PRIORITYGROUP_4,位于函数HAL_Init(void)中:

HAL_NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_4);

如果要修改,可以在Main函数中显式地声明,例如:

HAL_NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_2);

然后,记得要为你用到的每一个中断设定好抢占优先级和子优先级。


一个可以直接抄的"抢占分级地图"(Group_4 下,数字越小越紧急):越靠硬件越紧急,越靠业务越宽松;SysTick 永远压最底。

告别稀里又糊涂!STM32中断优先级:分组配置与优先级判断规则全面解析图2

四、代码实现(以STM32F103为例)

1. 配置中断分组(全局唯一)
#include "stm32f10x.h"//配置中断分组为Group2(2位抢占 + 2位响应)void NVIC_ConfigGroup(void){    //初始化NVIC结构体    NVIC_InitTypeDef NVIC_InitStructure;
//配置中断分组:Group2NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
//示例:配置外部中断EXTI0的优先级    NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn; //选择EXTI0中断通道    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1//抢占优先级:1(0~3)    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0//响应优先级:0(0~3)    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能该中断通道    NVIC_Init(&NVIC_InitStructure);
//示例:配置定时器TIM2的优先级    NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;//选择TIM2中断通道    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;//抢占优先级:1(与EXTI0相同)    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;//响应优先级:1(比EXTI0低)    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;    NVIC_Init(&NVIC_InitStructure);}
2. 优先级效果说明

以上配置中:


五、实际开发注意事项

1.分组选择原则:若需要频繁使用中断嵌套,选择抢占优先级位数多的分组(如 Group3/4);若很少嵌套,仅需排队执行,选择响应优先级位数多的分组(如 Group1/0);常规场景推荐 Group2(2+2),兼顾嵌套和排队需求。
2.优先级数值误区:不要认为“数值大优先级高”,STM32是数值越小优先级越高;分组配置后,抢占 / 响应优先级的取值范围会固定(如 Group2 抢占只能取 0~3),超出范围会导致配置失效。
3.系统异常优先级:复位、NMI(不可屏蔽中断)、HardFault等系统异常的优先级高于所有外部中断,且无法通过NVIC修改;SVC、PendSV、SysTick等内核中断的优先级可通过SCB->SHPR寄存器配置。
告别稀里又糊涂!STM32中断优先级:分组配置与优先级判断规则全面解析图3

六、使用FreeRTOS时的注意事项

如果上了FreeRTOS 这类操作系统,情况就不同了:内核占用了0~4优先级,留给用户的外设中断只能用5 ~ 15千万不能手动将任何中断优先级设置成0~4,否则,可能破坏系统的实时性,导致不可预料的后果。想区分优先级?很简单,在5~15之间分配就行,数值越小级别越高。


七、总结

1.STM32 中断优先级分为抢占优先级(决定嵌套)和响应优先级(决定同抢占优先级的排队),由4位寄存器拆分而来;
2.中断分组(Group0~4)全局唯一,决定4位寄存器在抢占 / 响应优先级的分配比例;
3.优先级判断顺序:抢占优先级>响应优先级>硬件中断编号,数值越小优先级越高。
告别稀里又糊涂!STM32中断优先级:分组配置与优先级判断规则全面解析图4

关键点:抢占优先级决定“能不能打断”,响应优先级决定“同时来了先服务谁”。抢占优先级:决定中断嵌套,高优先级(数值小)可打断低优先级;响应优先级:仅同抢占优先级时生效,决定排队顺序;中断分组:全局配置,4 位寄存器的拆分规则决定了抢占 / 响应优先级的取值范围。

声明:内容取材于网络,仅代表作者观点,如有内容违规问题,请联系处理。 
more
刚刚,汤道生回应一切:元宝、算力、芯片和姚顺雨
芯片课程推荐:《数字中后端课程》
曝英特尔拿下超300万张AI芯片大单
汽车早餐 | 近三月车规级存储芯片价格暴涨180%;消息称小鹏机器人核心人物离职;我国乘用车12年“胖”了近400公斤
英伟达开源Rubin 架构,AMD芯片曝光
对话全球芯片龙头:中国正在重新定义全球供应链
全球芯片,直逼2万亿美元
深圳华强换帅,80后执掌百亿芯片分销龙头
比亚迪确认自研人形机器人;国产光刻机实现突破;全球功耗最低Wi-Fi 6芯片发布
芯片设备销售,增长14%
Copyright © 2025 成都区角科技有限公司
蜀ICP备2025143415号-1
  
川公网安备51015602001305号