interruptstm32interrupt-handlingrtoscmsis

(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


Solution

  • 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(NVIC_PRIORITYGROUP_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.