欢迎光临
我们一直在努力

简单理解:配置NVIC优先级分组2(2位抢占+2位子优先级)具体有哪几个?

NVIC(Nested Vectored Interrupt Controller,嵌套向量中断控制器)优先级分组是 STM32 中用于管理中断优先级的重要机制,通过分组决定抢占优先级和子优先级各占多少比特位2。以下是具体介绍2:

  • 分组方式:STM32 支持 5 种优先级分组,通过NVIC_PriorityGroupConfig()函数配置。具体如下:
    • NVIC_PriorityGroup_0:0bit 抢占优先级、4bit 响应优先级,抢占优先级取值为 0,响应优先级取值为 0~15。
    • NVIC_PriorityGroup_1:1bit 抢占优先级、3bit 响应优先级,抢占优先级取值为 0~1,响应优先级取值为 0~7。
    • NVIC_PriorityGroup_2:2bit 抢占优先级、2bit 响应优先级,抢占优先级取值为 0~3,响应优先级取值为 0~3。
    • NVIC_PriorityGroup_3:3bit 抢占优先级、1bit 响应优先级,抢占优先级取值为 0~7,响应优先级取值为 0~1。
    • NVIC_PriorityGroup_4:4bit 抢占优先级、0bit 响应优先级,抢占优先级取值为 0~15,响应优先级取值为 0。
  • 优先级规则:组优先级高的中断能抢占组优先级低的中断,实现中断嵌套。若多个挂起异常共用相同的组优先级,则需使用次优先级来决定同组中的异常优先级。例如在 NVIC_PriorityGroup_2 中,抢占优先级为 0 的中断可以打断抢占优先级为 1、2、3 的中断,若两个中断抢占优先级都为 1,则子优先级低的(数值小)会先执行。

在 NVIC 优先级分组 2(2 位抢占优先级 + 2 位子优先级)下,抢占优先级(Preemption Priority)和子优先级(Sub Priority)的取值范围均为 0~3(2 位二进制数的所有组合),二者的所有组合共形成 4(抢占)× 4(子)= 16 种具体优先级配置。

16 种优先级配置详情表

下表列出了所有组合,包含 “抢占优先级、子优先级、对应的 IP 寄存器 4 位值(二进制 / 十进制)”,其中:

  • IP 寄存器值:NVIC 的中断优先级控制寄存器(IP)用 4 位存储优先级,分组 2 下的格式为 [抢占优先级(2位)][子优先级(2位)],即 (抢占优先级 << 2) | 子优先级。
  • 优先级规则:抢占优先级数值越小,优先级越高(可打断低抢占优先级中断);若抢占优先级相同,子优先级数值越小,优先级越高(仅决定同抢占级下的响应顺序,不可嵌套)。
序号抢占优先级(2 位)子优先级(2 位)IP 寄存器 4 位值(二进制)IP 寄存器值(十进制)
1 0 0 00 00 0
2 0 1 00 01 1
3 0 2 00 10 2
4 0 3 00 11 3
5 1 0 01 00 4
6 1 1 01 01 5
7 1 2 01 10 6
8 1 3 01 11 7
9 2 0 10 00 8
10 2 1 10 01 9
11 2 2 10 10 10
12 2 3 10 11 11
13 3 0 11 00 12
14 3 1 11 01 13
15 3 2 11 10 14
16 3 3 11 11 15

关键说明

  • 优先级高低对比示例:

    • 配置 1(抢占 0,子 0)优先级 最高,可打断所有其他 15 种配置的中断;
    • 配置 16(抢占 3,子 3)优先级 最低,无法打断任何其他配置的中断,且仅在所有高优先级中断未挂起时才响应;
    • 配置 5(抢占 1,子 0)和配置 7(抢占 1,子 2):抢占优先级相同,配置 5 的子优先级更高,若二者同时挂起,配置 5 先响应(不可嵌套)。
  • 代码配置示例(以配置 7 为例):若需将某中断(如定时器 1 更新中断)配置为 “抢占 1,子 2”,代码如下:

    // 1. 先设置分组2(整个程序仅需调用1次)
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);

    // 2. 配置具体中断优先级(定时器1更新中断)
    NVIC_InitTypeDef NVIC_InitStruct;
    NVIC_InitStruct.NVIC_IRQChannel = TIM1_UP_IRQn; // 中断通道:定时器1更新
    NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 1; // 抢占优先级1
    NVIC_InitStruct.NVIC_IRQChannelSubPriority = 2; // 子优先级2
    NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE; // 使能中断
    NVIC_Init(&NVIC_InitStruct);

  • 注意事项:

    • 同一系统中仅能选择一种 NVIC 分组(如分组 2),多次调用NVIC_PriorityGroupConfig()会导致优先级混乱;
    • 抢占 / 子优先级不可超出 0~3 的范围,否则会出现未定义的中断响应行为。
  • 赞(0)
    未经允许不得转载:171主机测评 » 简单理解:配置NVIC优先级分组2(2位抢占+2位子优先级)具体有哪几个?
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址