Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Кармин Новиелло - Освоение STM32.pdf
Скачиваний:
2751
Добавлен:
23.09.2021
Размер:
47.68 Mб
Скачать

Таймеры

356

HAL_NVIC_EnableIRQ(TIM6_IRQn);

HAL_TIM_Base_Init(&htim6);

HAL_TIM_Base_Start_IT(&htim6);

Приведенный выше код конфигурирует таймер TIM6 так, чтобы он истекал в течение 5 секунд. Однако, если вы переорганизуете данный код в полный пример, то увидите, что IRQ срабатывает почти сразу после вызова функции HAL_TIM_Base_Start_IT(). Это связано с тем, что процедура HAL_TIM_Base_Init() генерирует события UEV для передачи содержимого регистра TIM6->ARR во внутренний теневой регистр. Это приводит к тому, что установится флаг UIF и сработает IRQ, когда HAL_TIM_Base_Start_IT() разрешит его.

Мы можем обойти это поведение, установив бит URS в регистре TIMx->CR1: это приведет к тому, что событие UEV генерируется только тогда, когда счетчик достигает переполнения/опустошения.

Можно сконфигурировать таймер так, чтобы регистр ARR был буферизован, установив бит TIM_CR1_ARPE в регистре управления TIMx->CR1. Это приведет к тому, что содержимое теневого регистра будет обновляться автоматически. К сожалению, HAL, похоже, не предоставляет явного макроса для этого, и нам необходим низкоуровневый доступ к регистру таймера:

TIM3->CR1 |= TIM_CR1_ARPE; // Разрешение предварительной загрузки TIM3->CR1 &= ~TIM_CR1_ARPE; // Запрет предварительной загрузки

Предварительная загрузка особенно полезна, когда мы используем таймер в режиме сравнения выходного сигнала с несколькими включенными выходными каналами и каждый со своим собственным значением захвата, и мы должны быть уверены, что любое изменение в регистре CCRx происходит в одно и то же время. Это в особенности верно, если мы используем таймер для управления двигателем или преобразования энергии. Включение функции предварительной загрузки гарантирует нам, что новый параметр из регистра CCRx будет иметь место при следующем переполнении/опустошении счетчика таймера.

11.3.11. Отладка и таймеры

Во время сеанса отладки, когда выполнение приостанавливается из-за аппаратной или программной точки останова, таймеры по умолчанию не останавливаются. Иногда, напротив, во время отладки полезно останавливать таймер, особенно если он используется для управления внешним устройством.

Таймеры STM32 могут быть выборочно сконфигурированы на остановку, когда ядро приостановлено из-за точки останова. Макрос HAL __HAL_DBGMCU_FREEZE_TIMx() (где x соответствует номеру таймера) включает этот режим работы таймера. Кроме того, выходы таймеров, имеющих комплементарные выходы, отключаются и переводятся в неактивное состояние. Эта функция чрезвычайно полезна для приложений, где таймеры управляют силовыми ключами или электродвигателями. Это предотвращает повреждение силовых каскадов чрезмерным током или оставление двигателей в неконтролируемом состоянии при достижении точки останова.