欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

STM32的NVIC中断以及抢占优先级和响应优先级

程序员文章站 2022-07-02 12:29:08
...

一、抢占优先级和响应优先级

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

若内核正在执行C 的中断服务函数,则它能被抢占优先级更高的中断A 打断,由于B和C 的抢占优先级相同,所以C 不能被B 打断。但如果B 和C 中断是同时到达的,内核就会首先响应响应优先级别更高的B 中断。

二、NVIC 的优先级组

Cortex-M3允许具有较少中断源时使用较少的寄存器位指定中断源的优先级,因此STM32把指定中断优先级的寄存器位减少到4位,这4个寄存器位的分组方式如下:
第0组:所有4位用于指定响应优先级
第1组:最高1位用于指定抢占式优先级,最低3位用于指定响 应优先级
第2组:最高2位用于指定抢占式优先级,最低2位用于指定响应优先级
第3组:最高3位用于指定抢占式优先级,最低1位用于指定响应优先级
第四组:所有4位用于指定抢占式优先级

M3用8bits而STM32用高四位来表示抢占和子优先级:bit=1表示抢占;bit=0表示非抢占即子优先级;所以共有5中方案分组:
分组  Bit7 Bit6  Bit5  Bit4 说明:
第0组 0   0    0   0
第1组 1   0    0   0
第2组 1   1    0   0 抢占共有22=4(03);子优先级22=4(03),共44=16级嵌套
第3组 1   1    1   0  抢占共有23=4(07);子优先级21=2(01),共82=16级嵌套
第4组 1   1    1   1
到底谁优先:数字越小优先级越高,抢占级数字小的可剥夺抢占级数字大的
1抢占相同,子优先级不同:此时没有抢占剥夺,此时按照子优先级顺序排序
2抢占和子优先级都相同但有先后:此时无抢占剥夺,依照FIFO,前一个执行完了才能执行后者;
3抢占和子优先级都相同且同时到达:此时按照中断向量表顺序排先后

例如如下代码:

void HAL_TIM_Base_MspInit(TIM_HandleTypeDef *htim)
{
    if(htim->Instance==TIM3)
	{
		__HAL_RCC_TIM3_CLK_ENABLE();            //使能TIM3时钟
		HAL_NVIC_SetPriority(TIM3_IRQn,1,3);    //设置中断优先级,抢占优先级1,子优先级3
		HAL_NVIC_EnableIRQ(TIM3_IRQn);          //开启ITM3中断   
	}
	
	 if(htim->Instance==TIM4)
	{
		__HAL_RCC_TIM4_CLK_ENABLE();            //使能TIM4时钟
		HAL_NVIC_SetPriority(TIM4_IRQn,1,2);    //设置中断优先级,抢占优先级1,子优先级2
		HAL_NVIC_EnableIRQ(TIM4_IRQn);          //开启ITM4中断   
	}
}

则TIM4的优先级比TIM3优先级高。

相关标签: # STM32 stm32