对STM32的NVIC_PriorityGroupConfig使用及优先级分组方式理解

优先级分组图片
由于STM32使用了4位,所以最多有5个优先级分组。
STM32 HAL库中的中断优先级分组

/* Preemption Priority Group -------------------------------------------------*/
#define NVIC_PriorityGroup_0          ((u32)0x700) /* 0 bits for pre-emption priority
                                                      4 bits for subpriority */
#define NVIC_PriorityGroup_1          ((u32)0x600) /* 1 bits for pre-emption priority
                                                      3 bits for subpriority */
#define NVIC_PriorityGroup_2          ((u32)0x500) /* 2 bits for pre-emption priority
                                                      2 bits for subpriority */
#define NVIC_PriorityGroup_3          ((u32)0x400) /* 3 bits for pre-emption priority
                                                      1 bits for subpriority */
#define NVIC_PriorityGroup_4          ((u32)0x300) /* 4 bits for pre-emption priority
                                                      0 bits for subpriority */
  • 如果按着NVIC_PriorityGroup_4这么分
    就是4个抢占优先级,由于STM32只有4组所以没有亚优先级。所以最多可以有2 * 2 * 2 * 2=16个优先级。在优先级配置的时候就可以指定相应位优先级等级,如:
NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQChannel;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 8; // 指定抢占式优先级别1,可取0-15
  • 如果按照NVIC_PriorityGroup_3这么分
    有3个抢占优先级,一个亚抢占优先级。也就是说,共有8个可抢占优先级,且每级优先级中都有2个亚抢占优先级。
    (抢占优先级:高优先级可以抢占低优先级;亚抢占优先级:不能抢占,如果两个亚抢占优先级同时发生则会执行亚优先级更高的一级。)
NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQChannel;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2; // 指定抢占式优先级别0,可取0-7
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; // 指定响应优先级别1

猜你喜欢

转载自blog.csdn.net/qq_43448742/article/details/100763988