简体   繁体   中英

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

I am currently learning CMSIS-RTOS v2 and I have an issue that is bugging me and I can't find the answer I need.

I am using the STM32L476-Disco board and the joystick center button as an interrupt. I have a very simple Interrupt callback for my center joystick interrupt:

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);
}

When I call osThreadFlagsSet, the microcontroller freezes and nothing else happen. This is why I've put the HAL_GPIO_TogglePin: to see if the mcu was still responding or not.

I know that my interrupt resets correctly because when I only put my pin toggle, I can toggle the Led correctly.

ThId_Led_Blink is a ThreadId

osThreadId ThId_Led_Blink;

I've checked that the ID is set correctly in my debugger and it is (it's not null).

As you can see, I've tried with osEvenFlagsSet and I have the same result.

When I check the CMSIS_RTOS v2 documentation, it does specify that osThreadFlagsSet can be called from an ISR, but I am not sure if I need to do something else in that case for the Flags to be set correctly and resolve the issue when the ISR is hanging.

Thanks for your help

So after frustrating hours of searching, I finally fixed my issue.

As described in this website: https://www.freertos.org/RTOS-Cortex-M3-M4.html , for STM32 microprocessor, you need to set the NVIC Group Priority to 4. If you look on freeRTOS, they are talking about putting this line in your code:

NVIC_PriorityGroupConfig( NVIC_PriorityGroup_4 );

However, the STM32 has it's own library for the NVIC and the correct function to set the priority group is:

HAL_NVIC_SetPriorityGrouping(4);

Why go with the same name when you can change everything?

So make sure to call this function before your kernel initialization if you are using nested interrupts with FreeRTOS/CMSIS RTOS.

Also, make sure that your nested interrupt priority is in the range of configured interrupt priority for your FreeRTOS, otherwise, the osThreadFlagsSet function will fail automatically.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM