stm32中断优先级NVIC_IRQChannelPreemptionPriority的理解及使用

NVIC_IRQChannelPreemptionPriority;         //先占优先级

NVIC_IRQChannelSubPriority;                     //从优先级

1、两者之间的逻辑关系:

具有先占式优先级的中断可以在具有先占式优先级的中断处理过程中被响应,即中断嵌套,

或者说先占式优先级的中断可以嵌套在先占式优先级的中断中。

当两个中断源的先占式优先级相同时,这两个中断将没有嵌套关系,当一个中断到来后,如果正在处理另一个中断,这个后到来的中断就要等到前一个中断处理完之后才能被处理。

如果这两个中断同时到达,则中断控制器根据他们的从优先级高低来决定先处理哪一个;

如他们的先占式优先级从优先级都相等,则根据他们在中断表中的排位顺序决定先处理哪一个。

2、NVIC_PriorityGroupConfig(NVIC_PriorityGroup_X)的理解

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_x):是决定有几个先占优先级和从优先级.

NVIC_PriorityGroup_X  可取如下值:NVIC_PriorityGroup_0           NVIC_PriorityGroup_1

               NVIC_PriorityGroup_2           NVIC_PriorityGroup_3           NVIC_PriorityGroup_4

表1

表1中第四列表示:   先占优先级占可以占几位二级制 。

                                  如先占优先级1位,从优先级3位。

表示   NVIC_IRQChannelPreemptionPriority = x;      // x取值范围为0~1 ;    (0  ~  2^1-1)

          NVIC_IRQChannelSubPriority =y;                   // y取值范围为0~7 ;     (0  ~  2^3-1)

优先级数字越小,优先级越高

示例:

     NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);

  // NVIC_PriorityGroup_1  决定了先占优先级 可选0-1 , 从优先级 可选0-7   NVIC_InitStructure.NVIC_IRQChannel=TIM3_IRQn; //定时器3中断             
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;    //先占优先级0,可选0-1
    NVIC_InitStructure.NVIC_IRQChannelSubPriority=7;      //从优先级7,可选0-7
    NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
    NVIC_Init(&NVIC_InitStructure);

注:

整个系统执行过程中,只设置一次中断分组。(NVIC_PriorityGroupConfig只是对一个寄存器操作。多次操作以最后一次设置为准。)

针对每个中断,设置对应的先占优先级和从优先级。

如果不设置中断优先级分组,则中断优先级分组默认为0,即0位抢占优先级,4位响应优先级。
 

版权声明:本文为CSDN博主「静戴冠」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_33795842/article/details/121031585

NVIC_IRQChannelPreemptionPriority;         //先占优先级

NVIC_IRQChannelSubPriority;                     //从优先级

1、两者之间的逻辑关系:

具有先占式优先级的中断可以在具有先占式优先级的中断处理过程中被响应,即中断嵌套,

或者说先占式优先级的中断可以嵌套在先占式优先级的中断中。

当两个中断源的先占式优先级相同时,这两个中断将没有嵌套关系,当一个中断到来后,如果正在处理另一个中断,这个后到来的中断就要等到前一个中断处理完之后才能被处理。

如果这两个中断同时到达,则中断控制器根据他们的从优先级高低来决定先处理哪一个;

如他们的先占式优先级从优先级都相等,则根据他们在中断表中的排位顺序决定先处理哪一个。

2、NVIC_PriorityGroupConfig(NVIC_PriorityGroup_X)的理解

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_x):是决定有几个先占优先级和从优先级.

NVIC_PriorityGroup_X  可取如下值:NVIC_PriorityGroup_0           NVIC_PriorityGroup_1

               NVIC_PriorityGroup_2           NVIC_PriorityGroup_3           NVIC_PriorityGroup_4

表1

表1中第四列表示:   先占优先级占可以占几位二级制 。

                                  如先占优先级1位,从优先级3位。

表示   NVIC_IRQChannelPreemptionPriority = x;      // x取值范围为0~1 ;    (0  ~  2^1-1)

          NVIC_IRQChannelSubPriority =y;                   // y取值范围为0~7 ;     (0  ~  2^3-1)

优先级数字越小,优先级越高

示例:

     NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);

  // NVIC_PriorityGroup_1  决定了先占优先级 可选0-1 , 从优先级 可选0-7   NVIC_InitStructure.NVIC_IRQChannel=TIM3_IRQn; //定时器3中断             
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;    //先占优先级0,可选0-1
    NVIC_InitStructure.NVIC_IRQChannelSubPriority=7;      //从优先级7,可选0-7
    NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
    NVIC_Init(&NVIC_InitStructure);

注:

整个系统执行过程中,只设置一次中断分组。(NVIC_PriorityGroupConfig只是对一个寄存器操作。多次操作以最后一次设置为准。)

针对每个中断,设置对应的先占优先级和从优先级。

如果不设置中断优先级分组,则中断优先级分组默认为0,即0位抢占优先级,4位响应优先级。
 

版权声明:本文为CSDN博主「静戴冠」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_33795842/article/details/121031585

生成海报
点赞 0

静戴冠

我还没有学会写个人说明!

暂无评论

相关推荐