NVIC基础知识
- 具有高抢占式优先级的中断可以在具有低抢占式优先级的中断处理过程中被响应,即中断嵌套,或者说高抢占式优先级的中断可以嵌套低抢占式优先级的中断。
- 在抢占式优先级相同的情况下,有几个子优先级不同的中断同时到来,那么高子优先级的中断优先被响应。
- 在抢占式优先级相同的情况下,如果有低副优先级中断正在执行,高副优先级的中断要等待已被响应的低副优先级中断执行结束后才能得到响应——非抢断式响应(不能嵌套)。
- 判断中断是否被响应的依据
先是占先式优先级,其次是副优先级
占先式优先级决定是否会有中断嵌套
Reset、NMI、Hard Fault 优先级为负高于普通中断优先级)且不可调整
STM32中断优先级
Cortex-M3允许具有较少中断源时使用较少的寄存器位指定中断源的优先级,因此STM32把指定中断优先级的寄存器位减少到4位,这4个寄存器位的分组方式如下:
第0组:所有4位用于指定响应优先级
第1组:最高1位用于指定抢占式优先级,最低3位用于指定响应优先级
第2组:最高2位用于指定抢占式优先级,最低2位用于指定响应优先级
第3组:最高3位用于指定抢占式优先级,最低1位用于指定响应优先级
第4组:所有4位用于指定抢占式优先级
- NVIC库函数—外设中断
#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 分组,也就是没有抢占优先级,只有 0-15 的
子优先级---ST 公司编写*/
NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup);//指定中断源的优先级
/*举例如下*/
NVIC_InitStructure.NVIC_IRQChannel = EXTI2_IRQn; //选择中断线
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x00;// 指定抢占式优先级别0
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x01; //指定响应优先级别1
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //中断使能
/*设置优先级分组---ARM公司编写*/
void NVIC_SetPriorityGrouping(uint32_t PriorityGroup);
- SCB寄存器—系统中断