新手上路
- 积分
- 39
- 金钱
- 39
- 注册时间
- 2019-10-28
- 在线时间
- 21 小时
|
在进行多中断优先级排布时,发现原子的代码,h743hal库版本的中断分组存在一些问题:
在主函数初始化时会调用 HAL_Init();进行初始化,HAL_Init();中有语句对整个系统的中断进行分组,即HAL_NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_4);
通过手册或者hal库函数定义可以明白,当分组为4时,用于中断分组的4位全部用来做抢占优先级用,0位用于子优先级。
@arg NVIC_PRIORITYGROUP_0: 0 bits for preemption priority
* 4 bits for subpriority
* @arg NVIC_PRIORITYGROUP_1: 1 bits for preemption priority
* 3 bits for subpriority
* @arg NVIC_PRIORITYGROUP_2: 2 bits for preemption priority
* 2 bits for subpriority
* @arg NVIC_PRIORITYGROUP_3: 3 bits for preemption priority
* 1 bits for subpriority
* @arg NVIC_PRIORITYGROUP_4: 4 bits for preemption priority
* 0 bits for subpriority
但是在例程串口和定时器中断时,我发现对两者中断优先级进行初始化时,在中断分组为4的情况下,初始化了子优先级:
#if EN_USART1_RX
HAL_NVIC_EnableIRQ(USART1_IRQn); //使能USART1中断通道
HAL_NVIC_SetPriority(USART1_IRQn,3,3); //抢占优先级3,子优先级3
#endif
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中断
}
}
子优先级在分组为4的情况下应该没有作用,所以当初始化时,若果想要子优先级生效,应该更改Hal_Iint()中的分组指令:
HAL_NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_4);
更改为
HAL_NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_2);
这样寄存器两位用来抢占,两位用来响应,范围都是0-3。
另外,在分组为4的情况下子优先级是否有效我并没有试验,大家可以尝试一下是否会出bug。
|
|