(STM32L476RG) 标志设置 (osThreadFlagsSet) 在中断 (GPIO EXTI) 中执行时会使微控制器崩溃

(STM32L476RG) Flag setting (osThreadFlagsSet) crashes microcontroller when executed in an Interrupt (GPIO EXTI)

我目前正在学习 CMSIS-RTOS v2,但我有一个问题困扰着我,我找不到我需要的答案。

我正在使用 STM32L476-Disco 板和操纵杆中心按钮作为中断。我的中心操纵杆中断有一个非常简单的中断回调:

void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin){
    //osEventFlagsSet(evt_id,0x0001);
    HAL_GPIO_TogglePin(LD5_GPIO_Port,LD5_Pin);
    osThreadFlagsSet(ThId_Led_Blink,0x0001);
}

当我调用 osThreadFlagsSet 时,微控制器冻结并且没有其他任何事情发生。这就是我放置 HAL_GPIO_TogglePin 的原因:查看 MCU 是否仍在响应。

我知道我的中断会正确重置,因为当我只切换引脚时,我可以正确切换 Led。

ThId_Led_Blink 是一个 ThreadId

osThreadId ThId_Led_Blink;

我已经检查过我的调试器中的 ID 设置正确并且它是(不为空)。

如您所见,我尝试了 osEvenFlagsSet,结果相同。

当我查看 CMSIS_RTOS v2 文档时,它确实指定可以从 ISR 调用 osThreadFlagsSet,但我不确定在这种情况下是否需要做其他事情来设置标志正确解决ISR挂起问题

感谢您的帮助

经过数小时令人沮丧的搜索,我终于解决了我的问题。

如本网站所述:https://www.freertos.org/RTOS-Cortex-M3-M4.html,对于 STM32 微处理器,您需要将 NVIC Group Priority 设置为 4。如果您查看 freeRTOS,他们正在讨论将这一行放入您的代码中:

NVIC_PriorityGroupConfig( NVIC_PriorityGroup_4 );

但是,STM32 有自己的 NVIC 库,设置优先级组的正确函数是:

HAL_NVIC_SetPriorityGrouping(4);

既然可以改变一切,为什么还要使用相同的名字?

因此,如果您在 FreeRTOS/CMSIS RTOS 中使用嵌套中断,请务必在内核初始化之前调用此函数。

此外,请确保您的嵌套中断优先级在为您的 FreeRTOS 配置的中断优先级范围内,否则,osThreadFlagsSet 函数将自动失败。