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