STM32中断优先级解读:抢占优先级和响应优先级

百科   2024-12-12 15:56   北京  



1、抢占优先级和响应优先级
STM32的中断向量具有两个属性:抢占属性和响应属性,其属性编号越小,表明它的优先级别越高。抢占,是指打断其他中断的属性,即因为具有这个属性会出现嵌套中断(在执行中断服务函数A的过程中被中断B打断,执行完中断服务函数B再继续执行中断服务函数A),抢占属性由NVIC_IRQChannelPreemptionPriority的参数配置。而响应属性则应用在抢占属性相同的情况下,当两个中断向量的抢占优先级相同时,如果两个中断同时到达, 则先处理响应优先级高的中断,响应属性NVIC_IRQChannelSubPriority参数配置。例如,现在有三个中断向量,如下表:
若内核正在执行C的中断服务函数,则它能被抢占优先级更高的中断A打断,由于B和C的抢占优先级相同,所以C不能被B打断。但如果B 和C中断是同时到达的,内核就会首先响应响应优先级别更高的B中断。

2、NVIC的优先级组
在配置优先级的时候,还要注意一个很重要的问题,即中断种类的数量。NVIC只可以配置16种中断向量的优先级,即抢占优先级和响应优先级的数量由一个4位的数字来决定,把这个4位数字的位数分配成抢占优先级部分和响应优先级部分。有5组分配方式:
第0组:所有4位用来配置响应优先级:16种中断向量具有都不相同的响应优先级。
第1组:最高1位用来配置抢占优先级,低3位用来配置响应优先级。表示有2种级别的抢占优先级(0级,1级),有8种响应优先级:有8种中断,其抢占优先级都为0级,响应优先级分别为0~7;其余8种中断向量的抢占优先级则都为1级,响应优先级别分别为0~7。
第2组:2位用来配置抢占优先级,2位用来配置响应优先级:4种抢占优先级,4 种响应优先级。
第3组:高3位用来配置抢占优先级,最低1位用来配置响应优先级:8种抢占优先级,2种响应2优先级。
第4组:所有4位用来配置抢占优先级:16种中断向量都是只有抢占属性,没有响应属性。

要配置这些优先级组,可以采用库函数NVIC_PriorityGroupConfig(),可输入的参数为NVIC_PriorityGroup_0~NVIC_PriorityGroup_4,分别为以上5种分配组。


于是,有读者觉得疑惑了,如此强大的STM32,所有GPIO都能够配置成外部中断,USART、ADC等外设也有中断,而NVIC只能配置16种中断向量,那么在某个工程中使用超过16个中断怎么办呢?注意NVIC能配置的是16种中断向量,而不是16个,当工程中有超过16个中断向量时,必然有两个以上的中断向量是使用相同的中断种类,而具有相同中断种类的中断向量不能互相嵌套。

3、中断优先级设置步骤
1.系统运行后先设置中断优先级分组。
在主函数调用函数:
void NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup);
2.整个系统执行过程中,只设置一次中断分组。
3.针对每个中断,设置对应的抢占优先级和响应优先级:
void NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct);//配置过程NVIC_InitTypeDef   NVIC_InitStructure;NVIC_InitStructure.NVIC_IRQChannel =USART1_IRQn;//串口1中断,此处可改为任何有中断功能的模块定时器,外部中断等NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority =1;//抢占优先级为1NVIC_InitStructure.NVIC_IRQChannelSubPriority =2;//子优先级位2NVIC_InitStructure.NVIC_IRQChannelCmd =ENABLE;//IRQ通道使能NVIC_Init(&NVIC_InitStructure); //根据上面指定的参数初始化NVIC寄存器
4.如果需要挂起/解挂,查看中断当前激活状态,分别调用相关函数即可。
5.优先级分组只是给抢占优先级与响应优先级在中断优先级寄存器中高四位分配各个优先级数字所占的位数,在程序中只能设定一次。
6.每写一个关于中断优先级的程序必须包含下列两个函数: 
void NVIC_PriorityGroup();//写在主程序中;NVIC_Init();  //写在初始化配置中

4、代码示例
{//使能EXTI0中断NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQChannel;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1//指定抢占式优先级别1NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0//指定响应优先级别0NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStructure);//使能EXTI9_5中断NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQChannel;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0//指定抢占式优先级别0NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1//指定响应优先级别1NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStructure);//TIM3中断NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn; //TIM3中断NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //先占优先级0级NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //从优先级3级NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能NVIC_Init(&NVIC_InitStructure); TIM_Cmd(TIM3, ENABLE);  //使能TIMx外设}
在上例子中,优先抢占优先级,其数字越低,优先级越高。相同下比较响应优先级,其数字越低,优先级越高。


5、注意事项
1)如果指定的抢占式优先级别或响应优先级别超出了选定的优先级分组所限定的范围,将可能得到意想不到的结果;
2)抢占式优先级别相同的中断源之间没有嵌套关系;
3)如果某个中断源被指定为某个抢占式优先级别,又没有其它中断源处于同一个抢占式优先级别,则可以为这个中断源指定任意有效的响应优先级别。

雨飞工作室
本着“让人有所知,让人有所思”的理念,带你游走在无人机及机器人、智能交通、物联网领域,领略人间芳华,感受百味人生。
 最新文章