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)组合;

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

相关推荐
fengfuyao9851 小时前
利用 STM32 和 ADS1256 进行高精度数据采集
stm32·单片机·嵌入式硬件
黑白园2 小时前
ADC读取XY二轴操纵杆数据通过I2C_GPIO模拟 控制0.96寸OLED显示
stm32·单片机·嵌入式硬件
一个平凡而乐于分享的小比特3 小时前
还在手动挡写单片机?MicroPython 一脚油门踩进 Python 硬件世界
单片机·嵌入式硬件·micropython
LCG元4 小时前
STM32实战:基于STM32F103的工业仪表数据采集(多路ADC)
stm32·单片机·嵌入式硬件
BT-BOX4 小时前
Stm32CubeMX+Proteus仿真--STM32外部中断
stm32·单片机·proteus
Wallystech-Linda5 小时前
DR9574 vs DR9574S — Choosing the Right IPQ9574 WiFi 7 Platform for Your Network
嵌入式硬件
森利威尔电子-6 小时前
森利威尔SL8700 降压型大功率 LED 恒流驱动器:5A/95%效率,支持 PWM/模拟调光
单片机·嵌入式硬件·集成电路·芯片·电源芯片
三佛科技-187366133976 小时前
GP8892SEH贴片SOP7省外围5V2A隔离型原边反馈芯片直接替代MT3723
单片机·嵌入式硬件
Quinn276 小时前
正点原子 STM32MP257 修复异核 FreeRTOS 例程 osDelay() 函数比 HAL_Delay() 延时快的问题
stm32·单片机·嵌入式硬件
周周记笔记6 小时前
【元器件专题】三极管性能
单片机·嵌入式硬件