STM32 中断分组解析 说明,以及优先级

STM32 中断分组与优先级解析

STM32 的中断优先级管理是嵌入式开发中核心知识点之一,其设计兼顾了灵活性和确定性,核心围绕抢占优先级 和响应优先级(也叫子优先级)展开

一、核心概念
1. 中断优先级的两个维度

STM32 将中断优先级分为两级,目的是解决中断嵌套 和同优先级中断排队的问题:

  • 抢占优先级(Preemption Priority)

    决定中断能否 "打断" 正在执行的中断(即中断嵌套)。

    • 抢占优先级数值越小,优先级越高;

    • 高抢占优先级的中断可以打断低抢占优先级的中断执行。

  • 响应优先级(Sub Priority)

    仅当多个中断抢占优先级相同时生效,决定中断的响应顺序(排队执行)。

    • 响应优先级数值越小,排队越靠前;

    • 同抢占优先级的中断,响应优先级高的先执行,但无法嵌套(因为抢占优先级相同)。

2. 中断分组(NVIC_PriorityGroup)

STM32 的中断优先级寄存器是 4 位宽(共 16 级优先级),通过 "中断分组" 将这 4 位拆分给 "抢占优先级" 和 "响应优先级",共分 5 个分组(Group0~Group4),具体拆分规则如下:

|---------|---------|---------|---------|---------|
| 中断分组 | 抢占优先级位数 | 响应优先级位数 | 抢占优先级范围 | 响应优先级范围 |
| Group 0 | 0 位 | 4 位 | 仅 0 级 | 0~15 |
| Group 1 | 1 位 | 3 位 | 0~1 | 0~7 |
| Group 2 | 2 位 | 2 位 | 0~3 | 0~3 |
| Group 3 | 3 位 | 1 位 | 0~7 | 0~1 |
| Group 4 | 4 位 | 0 位 | 0~15 | 仅 0 级 |

关键规则:

  1. 整个系统只能选择一个中断分组(全局配置),所有中断都遵循该分组规则;

  2. 4 位总位数固定,抢占优先级位数越多,响应优先级位数越少,反之亦然;

  3. 数值越小,优先级越高(无论是抢占还是响应)

二、优先级判断规则

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

  1. 先比较抢占优先级:数值小的先执行,且可嵌套;

  2. 若抢占优先级相同,比较响应优先级:数值小的先执行;

  3. 若响应优先级也相同,比较中断向量表中的硬件编号:编号越小,优先级越高(硬件固定,无法修改)。


三、代码实现(以 STM32F103 为例)
1. 配置中断分组(全局唯一)
复制代码
#include "stm32f10x.h"
// 配置中断分组为 Group2(2 位抢占 + 2 位响应)
void NVIC_ConfigGroup(void)
{
    // 初始化 NVIC 结构体
    NVIC_InitTypeDef NVIC_InitStructure;

    // 配置中断分组:Group2
    NVIC_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. 优先级效果说明

以上配置中:

  • EXTI0 和 TIM2 的抢占优先级都是 1,因此无法互相嵌套;

  • 若 EXTI0 和 TIM2 同时触发,EXTI0 的响应优先级 0 高于 TIM2 的 1,因此先执行 EXTI0 中断服务函数;

  • 若将 TIM2 的抢占优先级改为 0,则 TIM2 可以打断 EXTI0 的执行(嵌套)。

四、实际开发注意事项
  1. 分组选择原则

    • 若需要频繁使用中断嵌套,选择抢占优先级位数多的分组(如 Group3/4);

    • 若很少嵌套,仅需排队执行,选择响应优先级位数多的分组(如 Group1/0);

    • 常规场景推荐 Group2(2+2),兼顾嵌套和排队需求。

  2. 优先级数值误区

    • 不要认为 "数值大优先级高",STM32 是数值越小优先级越高;

    • 分组配置后,抢占 / 响应优先级的取值范围会固定(如 Group2 抢占只能取 0~3),超出范围会导致配置失效。

  3. 系统异常优先级

    • 复位、NMI(不可屏蔽中断)、HardFault 等系统异常的优先级高于所有外部中断,且无法通过 NVIC 修改;

    • SVC、PendSV、SysTick 等内核中断的优先级可通过 SCB->SHPR 寄存器配置。

总结

  1. STM32 中断优先级分为抢占优先级 (决定嵌套)和响应优先级(决定同抢占优先级的排队),由 4 位寄存器拆分而来;

  2. 中断分组(Group0~4)全局唯一,决定 4 位寄存器在抢占 / 响应优先级的分配比例;

  3. 优先级判断顺序:抢占优先级 > 响应优先级 > 硬件中断编号,数值越小优先级越高。

关键点回顾

  • 抢占优先级:决定中断嵌套,高优先级(数值小)可打断低优先级;

  • 响应优先级:仅同抢占优先级时生效,决定排队顺序;

  • 中断分组:全局配置,4 位寄存器的拆分规则决定了抢占 / 响应优先级的取值范围。

相关推荐
UrSpecial14 小时前
GPIO 是什么?
单片机·嵌入式硬件
剑指offer.15 小时前
ARM裸机开发-SPI
arm开发·嵌入式硬件·嵌入式·arm
修船大队长16 小时前
配置接受报文每个报文对应一个mailbox配置流程记录
网络·单片机·mcu
搁浅小泽18 小时前
二极管选型技术规范
单片机·嵌入式硬件·汽车
搁浅小泽18 小时前
电感选型技术规范
单片机·嵌入式硬件·汽车
..Dauntless..19 小时前
【stm32】串口——在MCU内部的工作过程
stm32·单片机·嵌入式硬件
lzqrzpt19 小时前
临沂LED驱动电源工程选型标准与工艺对比解析
python·单片机·嵌入式硬件·物联网
小黄蚁20 小时前
使用LVGL模拟示波器创建正弦函数波形
单片机·学习
hahaha601620 小时前
黑体轨迹和色温--光源白点
人工智能·嵌入式硬件·算法·计算机视觉
Code_Solitude1 天前
开发板点灯实验源码
stm32·单片机·嵌入式硬件