两种优先级
抢占优先级PreemptPriority:中断服务函数正在执行时,抢占优先级高的可以打断抢占优先级低的,实现中断的嵌套,相当于51的“高优先级”
响应优先级(子优先级)SubPriority:抢占优先级相同的情况下,当两个中断同时被触发时,为避免中断的阻塞,高响应优先级的中断源会被优先触发,但高响应优先级不能打断低相应优先级,相当于51的“自然优先级”
特性:数字越小优先级越高,其中Reset,Hard fault,NMI优先级为负数且不可变,高于普通的中断优先级
优先级组的配置
简述:每个可屏蔽中断都有对应的优先级寄存器IP,例如F429有91个可屏蔽中断,对应IP[0]~IP[90],对于M3/4/7的内核,IP有八位,可设置2^8 = 256级优先级,但ST只用了高四位[7:4],可以实现2^4 = 16级优先级,由于存在两类优先级,因此需要将这四位分给两个优先级用于配置优先级别,我们将不同的分分配方式成为优先级分组(NVIC_PriorityGroup),由寄存器SCB->AIRCR的10~8bit控制
API:HAL_NVIC_SetPriorityGrouping(NVIC_PriorityGroup_n)
以上函数出现在HAL_Init() 中,用于对优先级分组进行设定,n = 0~4
例如:HAL_NVIC_SetPriorityGrouping(NVIC_PriorityGroup_2)//采用优先级分组2
优先级的设定
API:void HAL_NVIC_SetPriority(IRQn_Type IRQn,//中断号,此处由枚举IRQn_Type映射
uint32_t PreemptPriority,//抢占优先级
uint32_t SubPriority)//响应优先级(子优先级)
例如:HAL_NVIC_SetPriority(TIM3_IRQn,1,3);
void HAL_NVIC_EnableIRQ(IRQn_Tpye IRQn) //中断使能,同样由Disable,不赘述
例如:HAL_NVIC_EnableIRQ(TIM3_IRQn);