Несколько импульсов (PWM)

Пока изучаем варианты без FreeRTOS.

Настройки таймера для вывода импульсов на GPIO контакт

Чтобы понять , что ваш таймер может вывести импульсы на выходной контакт надо получить примерно такую картинку.

фотка 1

Важно , чтобы на закладке 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 дает один импульс

фотка 2

В 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 :

фотка 3

Отсчитали нужное количество импульсов и обязательно вызвали в конце HAL_TIM_PWM_Stop_IT.
Вполне себе рабочий вариант.


Связка 2

Практически то же самое происходит.

HAL_TIM_OC_Start_IT
HAL_TIM_PWM_PulseFinishedCallback или HAL_TIM_OC_DelayElapsedCallback
HAL_TIM_OC_Stop_IT

фотка 4

Без прерываний использовать таймеры наверное не очень разумно. Поэтому и не будем.


Все прерывания всех таймеров начинаются в коллбеке : HAL_TIM_IRQHandler.