Пока изучаем варианты без FreeRTOS.
Настройки таймера для вывода импульсов на GPIO контакт
Чтобы понять , что ваш таймер может вывести импульсы на выходной контакт надо получить примерно такую картинку.
Важно , чтобы на закладке GPIO Settings в результате появился требуемый пин. В нашем случае мы выбрали вариант TIM_CH3 для пина PB0 .
Но если мы выберем другой вариант , например, TIM8_CH2N на контакте PB0 на самом деле выберется другой контакт. Кроме PB0 он еще присутствует на PB14.
Связка 1 с включенными прерываниями от таймера
HAL_TIM_PWM_Start_IT
HAL_TIM_PWM_PulseFinishedCallback
или HAL_TIM_OC_DelayElapsedCallback
HAL_TIM_PWM_Stop_IT
HAL_TIM_PWM_Start_IT дает один импульс
В HAL_TIM_PWM_PulseFinishedCallback считаем количество импульсов и когда надо останавливаем процесс , т.е. вызываем HAL_TIM_PWM_Stop_IT.
Устанавливаем счетчик в 0 и в прерывании счетчик увеличиваем на единицу:
void HAL_TIM_PWM_PulseFinishedCallback(TIM_HandleTypeDef *htim)
{
/* Prevent unused argument(s) compilation warning */
if(htim->Instance == TIM3)
{
waitT3++;
printf("~"); // трассировка никогда не помешает
}
}
В основном цикле программы тупо ждем значения допустим 50 :
Отсчитали нужное количество импульсов и обязательно вызвали в конце HAL_TIM_PWM_Stop_IT.
Вполне себе рабочий вариант.
Связка 2
Практически то же самое происходит.
HAL_TIM_OC_Start_IT
HAL_TIM_PWM_PulseFinishedCallback или HAL_TIM_OC_DelayElapsedCallback
HAL_TIM_OC_Stop_IT
Без прерываний использовать таймеры наверное не очень разумно. Поэтому и не будем.
Все прерывания всех таймеров начинаются в коллбеке : HAL_TIM_IRQHandler.