Перейти к содержанию

STM32. One pulse mode. 1 мкс и ниже

https://www.cyberforum.ru/arm/thread2219203.html

Но дрыгал я не через ножку, а все по канону – таймер сам, аппаратно, делал свои дела.

Настроил таймер на OnePulse mode, настроил прерывания, подстройку ARR регистра – шоб импульсы по длительности менять.

Ну, я такой все подключил, настроился смотреть красивые осциллограммы, но не тут-то было. Минимальная длина импульса была 8 мкс! И меньше не становилась, хоть ты тресни. Перепробовал кучу всего – и ножки в режим “побыстрее”, и режим “fast output” и другой таймер, и от HAL отказался (задержка снизилась до 5 мкс).
Примечательно, что эти 8 мкс добавлялись и к длинным(по времени) импульсам, что и навело меня на мысль о проблеме с инициализацией/переинициализацией.

А решение такое – регистр Compare (CCRx) не должен быть равен 0. Минимальное его значение 1, иначе все время “старта” таймера, он будет считать, что вполне досчитал до сравнения и радостно выставит на ножке уровень. После внесения изменения – стал получать на ножке то, что задано (импульс в 125 ns – 8 МГц)

Сделаем 1 МГц импульс для примера

Смотрим, к какой шине подключен наш таймер (например, TIM1)

Смотрим частоту, выставленную на этой шине

Выбираем канал генерации ШИМ, выставляем 1 pulse mode. В предделителе (Prescaler) выставляем частоту шины минус 1, чтобы получить 1 МГц на входе таймера.

Включаем прерывания на таймере.

В обработчике прерывания пишем код для остановки таймера

void HAL_TIM_PWM_PulseFinishedCallback(TIM_HandleTypeDef *htim)
{
	if(htim->Instance == TIM1)
	{
		HAL_TIM_PWM_Stop_IT(&htim1, TIM_CHANNEL_1);
	}
}

В программе своей пишем следующее, чтобы запустить таймер на 1 пульс

__HAL_TIM_SET_COUNTER(&htim1, 0);
__HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_1, 1); //установка задержки перед импульсом
__HAL_TIM_SET_AUTORELOAD(&htim1, 1); //длительность импульса
HAL_TIM_PWM_Start_IT(&htim1, TIM_CHANNEL_1);

Так и не понял, почему именно магические 8 мкс. Видимо, это время, которое отжирает HAL у процессора.

Надеюсь, что кто-то найдет эту запись и решит свою проблему быстрее, чем это удалось сделать мне

Comment

programel