Микроконтроллеры, такие как STM32, используют аппаратные таймеры для генерации сигналов различных частот, генерации выходов с широтно-импульсной модуляцией (PWM), измерения входных импульсов и запуска событий на известных частотах или задержках. Части STM32 имеют несколько разных видов периферийных устройств таймера которые меняются в конфигурации. Простейшие таймеры (TIM6 и TIM7) в основном ограничены генерированием сигналов известной частоты или импульсов фиксированной ширины. В то время как более сложные таймеры добавляют дополнительное оборудование для использования такой генерируемой частоты для независимого генерирования сигналов с определенной шириной импульсов или измерения таких сигналов.
Пример базового таймера показан на рисунке. Этот таймер состоит из четырех компонентов — контроллера, прескалера (PSC), регистра «автоперезагрузки» (ARR) и счетчика (CNT). Функция прескалера состоит в том, чтобы разделить опорные часы на более низкую частоту. Таймеры STM32 имеют 16-битные регистры предварительного масштабирования и могут делить опорные тактовые импульсы на любое значение 1..65535. Например, системные тактовые частоты 24 МГц STL32 VL Discovery можно использовать для генерации частоты счета 1 МГц с предварительным масштабированием 23 (0..23 == 24 значения). Регистр счетчика может быть сконфигурирован для подсчета вверх, вниз или вверх / вниз, а также для перезагрузки из регистра автоматической перезагрузки всякий раз, когда он обновляется («событие обновления»), или для остановки, когда он обновится. Базовый таймер генерирует выходное событие (TGRO), которое можно настроить на событие обновления или когда счетчик включен (например, на входе GPIO).
Чтобы понять три режима счетчика, рассмотрите рисунок ниже. В этих примерах мы предполагается предварительное масштабирование 1 (счетчик тактовых импульсов равен половине внутренних тактовых импульсов), а значение автоматической перезагрузки — 3. Обратите внимание, что в режиме «Вверх» счетчик увеличивается от 0 до 3 (ARR) и затем сбрасывается до 0. Когда происходит сброс, генерируется «событие обновления». Это событие обновления может быть привязано к TRGO или в более сложных таймерах с каналами захвата / сравнения может иметь дополнительные эффекты (описано ниже). Аналогичным образом, в режиме «Вниз» счетчик уменьшается с 3 до 0, а затем сбрасывается до 3 (ARR). В режиме Down генерируется «событие» обновления (UEV), когда счетчик сбрасывается в ARR. Наконец, в режиме Up / Down счетчик увеличивается до ARR, затем уменьшается до 0 и повторяется. UEV генерируется перед каждым разворотом с тем эффектом, что период в режиме вверх / вниз на один короче, чем в режиме вверх или вниз.
Многие таймеры расширяют этот базовый модуль добавлением каналов счетчиков, таких как показан на рисунке ниже. «X» относится к номеру канала — часто таймеры поддерживают несколько каналов. С этим скромным дополнительным оборудованием выход может генерироваться всякий раз, когда регистр счетчика достигает определенного значения, или регистр счетчика может быть захвачен, когда происходит конкретное событие ввода (возможно, предварительно масштабированные входные часы).

Важным применением каналов счетчика является генерация точно синхронизированных импульсов. Существует два варианта этого использования — «одноимпульсные» импульсы, в которых генерируется один импульс, и широтно-импульсная модуляция, в которой серия импульсов генерируется с периодом UEV счетчика. Ширина импульса контролируется регистром захвата / сравнения (CCR). Например, выход канала (OCxREF) может быть привязан к тому, больше ли (или меньше) регистр CNT, чем регистр сравнения. На рисунке ниже показано использование двух каналов для одноимпульсных и ШИМ-выходов. Здесь мы предполагаем, что ARR равно 7, а CCR равно 3. В режиме ШИМ ARR контролирует период, а CCR контролирует ширину импульса (и, следовательно, рабочий цикл). В одноимпульсном режиме импульс начинает циклы CCR после начального события запуска и имеет ширину ARR—CRR. Можно использовать несколько каналов для создания набора синхронизированных импульсов, начинающихся с точными задержками друг от друга.
Канал таймера также может использоваться для измерения длительности импульса — фактически декодируя сигналы ШИМ. Существует много других вариантов конфигурации таймеров STM32, включая механизмы синхронизации нескольких таймеров как друг с другом, так и с внешними сигналами.


