fantasyhpu 发表于 2019-12-11 22:06:42

STM32CubeMX对中断分组的设置

用STM32CubeMX5.4生成一个简单的工程,选两个GPIO分别作为外部中断输入引脚,设置中断分组2:

但是在生成的代码中,却是中断分组4:

点开上图中的HAL_MspInit(),也没有发现对中断分组设置的代码:


出现这种情况,是我在STM32CubeMX中存在没有设置到的地方吗?还是STM32CubeMX的bug?

pkoko 发表于 2019-12-20 00:50:48

   可以在main()的适当位置 加入 NVIC_GetPriorityGrouping() 函数,其返回值为当前的中断分组。获取当前的中断分组看看是否跟你设置的一致。
   可用 HAL_NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_2); 函数自己设置分组。

butterflyspring 发表于 2019-12-20 11:09:09

你好,我这边试了一下,没有错。在 HAL_Init(void) 中设置了默认值,若果你又对IO口的中断优先级分组配置了的话,在下面的 HAL_MspInit();中修改过来了。

fantasyhpu 发表于 2019-12-23 10:12:30

pkoko 发表于 2019-12-20 00:50
可以在main()的适当位置 加入 NVIC_GetPriorityGrouping() 函数,其返回值为当前的中断分组。获取当 ...

谢谢,确实可以手动添加。

fantasyhpu 发表于 2019-12-23 10:14:52

butterflyspring 发表于 2019-12-20 11:09
你好,我这边试了一下,没有错。在 HAL_Init(void) 中设置了默认值,若果你又对IO口的中断优先级分组配置了 ...

谢谢,你用的是STM32CUBEMX自动生成的代码吗?我用STM32CUBEMX5.4自动生成代码后,在HAL_MspInit()中并没有HAL_NVIC_SetPriorityGrouping()函数。

pkoko 发表于 2019-12-23 10:58:55

fantasyhpu 发表于 2019-12-23 10:14
谢谢,你用的是STM32CUBEMX自动生成的代码吗?我用STM32CUBEMX5.4自动生成代码后,在HAL_MspInit()中并没 ...

用CubeMX5.4自动生成的代码中,在HAL_MspInit()确实没有调用HAL_NVIC_SetPriorityGrouping()函数。而是通过类似HAL_NVIC_SetPriority(USART2_IRQn, 1, 0) 这样的函数调用。函数 HAL_NVIC_SetPriority()的原型在 stm32f1xx_hal_cortex.c 文件中定义,在该函数中调用了 NVIC_SetPriority(IRQn, NVIC_EncodePriority(prioritygroup, PreemptPriority, SubPriority));

fantasyhpu 发表于 2019-12-30 08:12:29

pkoko 发表于 2019-12-23 10:58
用CubeMX5.4自动生成的代码中,在HAL_MspInit()确实没有调用HAL_NVIC_SetPriorityGrouping()函数。而是通 ...

原来如此,万分感谢

butterflyspring 发表于 2020-1-2 16:10:45

查查CUBEMX上哪里没配置到么?

fantasyhpu 发表于 2020-1-6 16:16:53

butterflyspring 发表于 2020-1-2 16:10
查查CUBEMX上哪里没配置到么?
正如pkoko所言,HAL_NVIC_SetPriority()函数中确实调用了
NVIC_SetPriority(IRQn, NVIC_EncodePriority(prioritygroup, PreemptPriority, SubPriority))
函数,但是无论在cubemx中怎样选择中断分组(我挨个试了),生成的代码里,传入NVIC_EncodePriority()函数中的prioritygroup参数的值始终没有改变,即cubemx中断分组设置没有起作用。

fantasyhpu 发表于 2020-1-8 11:11:31

cubemx5.5解决了这个bug,已经测试。在生成的main()函数中,调用了HAL_Init()函数,在stm32f4xx_hal.c文件中打开HAL_Init()函数源码:

通过上图可见,尽管在HAL_NVIC_SetPriorityGrouping()函数设置中断分组为NVIC_PRIORITYGROUP_4,但是又调用了HAL_MspInit(),在stm32f4xx_hal_msp.c中打开HAL_MspInit()函数源码:

通过上图可见,又把中断分组改成在cubemx5.5中设置的值了。

页: [1]
查看完整版本: STM32CubeMX对中断分组的设置