OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4795|回复: 2

关于h743hal库源码中断分组源码bug

[复制链接]

1

主题

3

帖子

0

精华

新手上路

积分
39
金钱
39
注册时间
2019-10-28
在线时间
21 小时
发表于 2020-4-15 11:38:38 | 显示全部楼层 |阅读模式
在进行多中断优先级排布时,发现原子的代码,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。



正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

7

主题

101

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
317
金钱
317
注册时间
2017-9-16
在线时间
80 小时
发表于 2020-4-15 20:41:19 来自手机 | 显示全部楼层
这是hal库的默认行为,可在程序中修改,另外也可以借助cubemx配置,如果真的出现bug,可以给st开发组发邮件,一些trivial错误一般ST开发组不会犯,另外中断这样分组可以更好地与RTOS配合
回复 支持 反对

使用道具 举报

33

主题

218

帖子

0

精华

高级会员

Rank: 4

积分
568
金钱
568
注册时间
2015-1-12
在线时间
75 小时
发表于 2021-8-25 16:04:35 | 显示全部楼层
F411工程也遇到类似的情况
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-2-27 02:59

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表