Пример TIM3 и FreeRTOS

Параметры приоритета прерываний в CubeMX по умолчанию :

LIBRARY_LOWEST_INTERRUPT_PRIORITY 15
LIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY 5

Приоритет тем выше чем меньше значение, т.е. 0 это самый высокий приоритет прерывания и его не может прервать никакое другое прерывание.

Изменения приоритета прерывания таймера при использовании FreRTOS

До использования FreeRtos приоритет таймера (Preemption Priority) по умолчанию равен 0, как впрочем и для все других ресурсов.

фотка 1

И посылка нескольких импульсов через DMA канал нормально работает (связка HAL_TIM_PWM_Start_DMA / HAL_TIM_PWM_Stop_DMA ).

При включении FreeRTOS приоритет таймера устанавливает равным MAX_SYSCALL_INTERRUPT_PRIORITY , то есть 5.

При чем есть нюанс : может так случится , что у таймера все еще останется значение 0. Обязательно проверьте значение приоритетов таймера после подключения FreeRtos.

Должно быть примерно так:

фотка 2

При отключении FreeRTOS есть тоже нюанс : Preemption Priority таймера останется со значением 5.
Поэтому не забываем изменить его на значение 0.

фотка 3

Значение также можно контролировать в коде , ищите 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 нормально работает в многозадачной системе:

Приоритеты выставлены все по умолчанию.

фотка 4
фотка 5

Как обычно проект открытый качаем свободно:

Файлы для скачивания

* TIM_PWM_FreeRTOS_Atollic [zip]
тестим TIM3 под FreeRTOS из Atollic Studio