stm32之NVIC_PriorityGroup_2

NVIC_PriorityGroup_2 的优先级拆分规则,以及用它配置 16 个中断的具体组合方案,我来详细拆解并给出可直接使用的配置示例。

  1. NVIC_PriorityGroup_2 的核心定义
    NVIC_PriorityGroup_2 是 STM32 中最常用的优先级分组,对 4 位优先级寄存器的拆分规则为:
    抢占优先级:2 位 → 共 4 个级别(0、1、2、3,0 为最高优先级)
    响应优先级:2 位 → 共 4 个级别(0、1、2、3,0 为最高优先级)
    总组合数:4 × 4 = 16 种 → 刚好能覆盖 16 个中断的优先级配置需求
    核心特点:抢占和响应优先级各 4 级,兼顾 "中断嵌套能力" 和 "同抢占级的排序灵活性",是工业场景中最通用的选择。
  2. 能否实现 16 个中断?
    完全可以!该分组下的 16 种(抢占 + 响应)组合刚好能为 16 个中断分配唯一的优先级,且能通过 "抢占级区分嵌套、响应级区分排队" 实现灵活的优先级管理。
  3. 16 个中断的具体组合配置示例
    假设你有 16 个典型中断(EXTI0EXTI7、USART1USART3、TIM1~TIM4、SPI1、SPI2),以下是完整的配置代码,按 "抢占优先级从高到低、同抢占级内响应优先级从高到低" 分配:
    c
    运行
    #include "stm32f10x.h"

void NVIC_Config_16IRQ_Group2(void)

{

NVIC_InitTypeDef NVIC_InitStructure;

复制代码
// 第一步:配置优先级分组为Group_2(2位抢占 + 2位响应)
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);

// ==================== 抢占优先级0(最高抢占级)====================
// 中断1:EXTI0(抢占0,响应0)→ 整体最高优先级
NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; // 抢占优先级0
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;        // 响应优先级0
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);

// 中断2:EXTI1(抢占0,响应1)
NVIC_InitStructure.NVIC_IRQChannel = EXTI1_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);

// 中断3:EXTI2(抢占0,响应2)
NVIC_InitStructure.NVIC_IRQChannel = EXTI2_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);

// 中断4:EXTI3(抢占0,响应3)→ 抢占0级中最低
NVIC_InitStructure.NVIC_IRQChannel = EXTI3_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);

// ==================== 抢占优先级1 ====================
// 中断5:EXTI4(抢占1,响应0)
NVIC_InitStructure.NVIC_IRQChannel = EXTI4_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);

// 中断6:EXTI5(抢占1,响应1)
NVIC_InitStructure.NVIC_IRQChannel = EXTI5_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);

// 中断7:EXTI6(抢占1,响应2)
NVIC_InitStructure.NVIC_IRQChannel = EXTI6_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);

// 中断8:EXTI7(抢占1,响应3)
NVIC_InitStructure.NVIC_IRQChannel = EXTI7_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);

// ==================== 抢占优先级2 ====================
// 中断9:USART1(抢占2,响应0)
NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);

// 中断10:USART2(抢占2,响应1)
NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);

// 中断11:USART3(抢占2,响应2)
NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);

// 中断12:TIM1(抢占2,响应3)
NVIC_InitStructure.NVIC_IRQChannel = TIM1_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);

// ==================== 抢占优先级3(最低抢占级)====================
// 中断13:TIM2(抢占3,响应0)
NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);

// 中断14:TIM3(抢占3,响应1)
NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);

// 中断15:SPI1(抢占3,响应2)
NVIC_InitStructure.NVIC_IRQChannel = SPI1_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);

// 中断16:SPI2(抢占3,响应3)→ 整体最低优先级
NVIC_InitStructure.NVIC_IRQChannel = SPI2_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);

}

  1. 关键优先级规则(Group_2 下)

抢占优先级决定嵌套能力:

抢占 0 的中断(如 EXTI0)可打断抢占 1/2/3 的所有中断(如 USART1、TIM2);

抢占 1 的中断可打断抢占 2/3 的中断,但无法打断抢占 0 的中断;

同抢占级的中断(如都是抢占 0)无法相互打断。

响应优先级决定同抢占级的执行顺序:

比如 EXTI0(抢占 0,响应 0)和 EXTI1(抢占 0,响应 1)同时触发时,EXTI0 先执行;

响应优先级仅在 "同抢占级 + 同时触发" 时生效,无嵌套能力。

  1. 注意事项

抢占优先级范围:Group_2 下仅能设 0/1/2/3,超出范围会被 NVIC 截断(比如设 4 会被当作 0 处理);

响应优先级范围:仅能设 0/1/2/3,同理超出范围会被截断;

分组配置时机:NVIC_PriorityGroupConfig 必须在所有中断配置前执行,且整个程序仅需调用一次。

总结

NVIC_PriorityGroup_2 是 2 位抢占优先级 + 2 位响应优先级,共 4 个抢占级别、4 个响应级别,总 16 种组合;

完全支持 16 个中断的配置,只需为每个中断分配唯一的(抢占 0~3 + 响应 0~3)组合;

核心特点:抢占 / 响应优先级均衡分配,兼顾嵌套能力和排序灵活性,是最通用的优先级分组选择。

相关推荐
进击的横打1 小时前
【车载开发系列】系统时钟与定时器
stm32·单片机·fpga开发
LCG元1 小时前
STM32实战案例:基于STM32F103的智能插座(电量计量+远程控制)
stm32·单片机·嵌入式硬件
somi72 小时前
ARM-06-时钟系统配置
arm开发·单片机·嵌入式硬件·时钟配置
爱喝纯牛奶的柠檬2 小时前
基于STM32和HAL库的大夏龙雀BT311-10C02S蓝牙模块驱动
stm32·单片机·嵌入式硬件
小谦32512 小时前
NTC热敏电阻分压测量电路的数学特性与应用选择研究
stm32·嵌入式硬件
Xueqian E3 小时前
驱动策略和效率的整理
stm32·单片机·嵌入式硬件
电子工程师成长日记-C515 小时前
51单片机气压检测仪
单片机·嵌入式硬件·51单片机
嵌入式老菜鸟qq1252427735 小时前
nRF54H20 + Zephyr 开发环境(二):烧录与踩坑实录
stm32·单片机·嵌入式硬件
-Try hard-5 小时前
ARM | 点亮LED灯!
arm开发·单片机·嵌入式硬件
日更嵌入式的打工仔5 小时前
电机三环控制
单片机·嵌入式硬件