Параметры приоритета прерываний в CubeMX по умолчанию :
LIBRARY_LOWEST_INTERRUPT_PRIORITY 15
LIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY 5
Приоритет тем выше чем меньше значение, т.е. 0 это самый высокий приоритет прерывания и его не может прервать никакое другое прерывание.
Изменения приоритета прерывания таймера при использовании FreRTOS
До использования FreeRtos приоритет таймера (Preemption Priority) по умолчанию равен 0, как впрочем и для все других ресурсов.
И посылка нескольких импульсов через DMA канал нормально работает (связка HAL_TIM_PWM_Start_DMA / HAL_TIM_PWM_Stop_DMA ).
При включении FreeRTOS приоритет таймера устанавливает равным MAX_SYSCALL_INTERRUPT_PRIORITY , то есть 5.
При чем есть нюанс : может так случится , что у таймера все еще останется значение 0. Обязательно проверьте значение приоритетов таймера после подключения FreeRtos.
Должно быть примерно так:
При отключении FreeRTOS есть тоже нюанс : Preemption Priority таймера останется со значением 5.
Поэтому не забываем изменить его на значение 0.
Значение также можно контролировать в коде , ищите HAL_NVIC_SetPriority для DMA , для таймера:
HAL_NVIC_SetPriority(DMA1_Stream5_IRQn, 0, 0);
Как послать
Выводы:
HAL_TIM_PWM_Start_DMA / HAL_TIM_PWM_PulseFinishedCallback / HAL_TIM_PWM_Start_DMA нормально работает в многозадачной системе:
Приоритеты выставлены все по умолчанию.
Как обычно проект открытый качаем свободно:
Файлы для скачивания
*
тестим TIM3 под FreeRTOS из Atollic Studio