STM32 嵌套向量中断控制器NVIC学习


STM32中有两个优先级的概念:抢占式优先级和响应优先级(也叫副优先级)。

他们的特性是:

1:高抢占式优先级的中断可以嵌套在低抢占式优先级的中断中:,即低抢占式优先级的中断可以被高抢占式优先级的中断打断;

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

3:如果两个具有相同抢占式优先级的中断同时到达,那么系统给先处理高响应优先级的中断;

3:如果两个中断的抢占式优先级和响应优先级都相等,则根据他们在中断表中的排位顺序决定先处理哪一个。

总的来看,它们的级别关系是: 抢占式优先级 > 响应优先级 > 中断表中的排位顺序。只有在上一级优先级相同时下一级优先级才会起作用。


在stm32系统中使用 抢占式优先级(NVIC_IRQChannelPreemptionPriority)和响应优先级(NVIC_IRQChannelSubPriority) 共同构成了一个 中断优先级,每个中断优先级共有4bit数据来表示其使用的抢占优先级和响应优先级,而中断优先级又被分成了四组,每一组使用一种抢占优先级数据位和响应优先级数据位的组合方式。

#define NVIC_PriorityGroup_0         ((uint32_t)0x700) /*!< 0 bits for pre-emption priority
                                                            4 bits for subpriority */
#define NVIC_PriorityGroup_1         ((uint32_t)0x600) /*!< 1 bits for pre-emption priority
                                                            3 bits for subpriority */
#define NVIC_PriorityGroup_2         ((uint32_t)0x500) /*!< 2 bits for pre-emption priority
                                                            2 bits for subpriority */
#define NVIC_PriorityGroup_3         ((uint32_t)0x400) /*!< 3 bits for pre-emption priority
                                                            1 bits for subpriority */
#define NVIC_PriorityGroup_4         ((uint32_t)0x300) /*!< 4 bits for pre-emption priority
                                                            0 bits for subpriority */
如上述代码,第0组 NVIC_PriorityGroup_0 使用0bits表示抢占式优先级------NVIC_IRQChannelPreemptionPriority无效,4bits表示响应优先级--NVIC_IRQChannelSubPriority值可为0~15。因此,在这一组中的中断没有抢占式优先级,只有响应优先级,它们互相不可打断。

第2组  NVIC_PriorityGroup_2 使用2bits表示抢占优先级------NVIC_IRQChannelPreemptionPriority值可为0~3,使用2bits表示响应优先级NVIC_IRQChannelSubPriority值可为0~3。

无论使用哪一组,其优先级总数(抢占优先级*响应优先级)都是16.

stm32使用NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup)来设置使用的中断优先级组。

    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);  //使用中断优先级组1 -- 1bit表示抢占优先级,3bits表示响应优先级
    // 设置先占优先级0~1,响应优先级0~7
    NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;           //选择中断线0
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;  //抢占优先级为 1
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;         //响应优先级为 0
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;            //中断使能
    NVIC_Init(&NVIC_InitStructure);



你可能感兴趣的:(中断,STM32)