(STM32L476RG) При установке флага (osThreadFlagsSet) происходит сбой микроконтроллера при выполнении в прерывании (GPIO EXTI) - PullRequest
1 голос
/ 25 октября 2019

В настоящее время я изучаю 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 или нет.

Я знаю, что мое прерывание сбрасывается правильно, потому что, когда я только переключаю свой пин-код, я могу правильно переключать светодиод.

ThId_Led_Blink является ThreadId

osThreadId ThId_Led_Blink;

Я проверил, что идентификатор правильно установлен в моем отладчике, и он (не ноль).

Как вы можетевидите, я пытался с osEvenFlagsSet, и у меня тот же результат.

Когда я проверяю документацию CMSIS_RTOS v2, он указывает, что osThreadFlagsSet может быть вызван из ISR, но я не уверен, если мне нужнов этом случае сделайте что-нибудь еще для правильной установки флагов и решите проблему, когда ISR зависает.

Спасибо за вашу помощь

1 Ответ

0 голосов
/ 25 октября 2019

Итак, после нескольких часов поисков я наконец-то исправил свою проблему.

Как описано на этом сайте: https://www.freertos.org/RTOS-Cortex-M3-M4.html, для микропроцессора STM32, вам нужно установить приоритет группы NVIC равным 4. Есливы смотрите на freeRTOS, они говорят о вставке этой строки в ваш код:

NVIC_PriorityGroupConfig( NVIC_PriorityGroup_4 );

Однако STM32 имеет собственную библиотеку для NVIC, и правильная функция для установки группы приоритетов:

HAL_NVIC_SetPriorityGrouping(4);

Зачем использовать одно и то же имя, если вы можете изменить все?

Поэтому обязательно вызывайте эту функцию перед инициализацией ядра, если вы используете вложенные прерывания с ОС FreeRTOS / CMSIS RTOS.

Кроме того, убедитесь, что ваш вложенный приоритет прерывания находится в диапазоне настроенного приоритета прерывания для вашей FreeRTOS, в противном случае функция osThreadFlagsSet автоматически завершится ошибкой.

...