скрытое меню

Несколько таймеров и FreeRTOS

Нагружаем контроллер STM32F407 тремя потоками и смотрим как они борятся за место под солнцем в среде FreeRTOS

Реализуем три равноправных потока.

В каждом запускаем передачу пачки импульсов через связку HAL_TIM_PWM_Start_DMA / HAL_TIM_PWM_PulseFinishedCallback / HAL_TIM_PWM_Start_DMA.

far8=0;
if((res=HAL_TIM_PWM_Start_DMA(&htim8, TIM_CHANNEL_1,(uint32_t*)pData, 8))!=HAL_OK)
  printf("HAL_TIM_PWM_Start_DMA != HAL_OK");

while(far8 == 0 )
			;

if((res=HAL_TIM_PWM_Stop_DMA(&htim8, TIM_CHANNEL_1))!=HAL_OK)
  printf("HAL_TIM_OC_Stop_DMA != HAL_OK");

vTaskDelay(1); // вот тут если не давать другим потокам возможность поработать , 
// то возможно вообще и не поработают совсем.

И смотрим что из этого получается :

фотка 1

При такой высокой нагрузке (передача ШИМ за микросекунды ) каждый поток должен давать другим поработать vTaskDelay(1); . Иначе другие потоки вообще могут не заработать ни разу .

Проверьте сами. Проект можно скачать внизу.

Тут все потоки равноправные :

фотка 2

Самое приятное в этом примере , что это все работает и не зависает. Причем использовался только HAL и FreeRTOS.

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

* TIM3_TIM4_TIM8_PWM_FreeRTOS_Atollic STM3232 [zip]
пытаемся FreeRTOS заставить зависнуть ... (не пулучается)