[Home] [< Prev: DAC: цифро-аналоговый преобразователь] [Next: Таймер TIM1 с расширенным управлением >]

Таймеры в микроконтроллерах STM

Таймер - одно из важнейших для микроконтроллера устройств, которое применяется для решения множества задач: отсчёт времени, планирование действий, генерация сигналов, измерение параметров сигналов и др. Разработчики устройств на базе микроконтроллеров активно используют таймеры, а разработчики микроконтроллеров, в свою очередь, стараются наиболее полно удовлетворить потребности пользователей, предоставляя им в распоряжение различные по сложности и возможностям таймеры.

Так, типичный представитель микроконтроллеров STM32 содержит порядка десяти таймеров. В их число входят как простые таймеры с базовым набором функций, так и таймеры весьма сложные и многофункциональные. С одной стороны, это даёт массу возможностей для профессиональных разработчиков, с другой - превращает в кошмар изучение данного вопроса для начинающих.

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

Оглавление
Таймеры в микроконтроллерах STM
   Введение
   Виды таймеров в STM32
   Устройство таймера
   Обзор таймеров STM32
Таймер TIM1 с расширенным управлением 
Базовые таймеры TIM6 и TIM7 

Здесь приведены ссылки на статьи с подробным описанием некоторых таймеров. Особенно хочется выделить устройства TIM1, TIM6, TIM7. TIM1 относится к таймерам с расширенным управлением, которые являются наиболее сложными. Если хорошо разобраться с TIM1, будет легко работать со всеми остальными таймерами. TIM6, TIM7 напротив, относятся к базовым таймерам, которые являются самыми простыми и имеют минимум функций. Остальные таймеры занимают промежуточное положение по шкале "сложности". Таким образом, изучив материалы по TIM1 и TIM6, TIM7, можно составить довольно полное представление обо всём спектре таймеров, имеющихся в микроконтроллерах STM32, их устройстве и возможностях.



Введение

Таймер - устройство, отмеряющее заданный интервал времени, по окончании которого оно вырабатывает определённый сигнал.

Когда таймер является частью микроконтроллера, способом сигнализации может быть, например, прерывание. Обычно таймер работает в периодическом режиме, т.е. не останавливается после формирования сигнала, а начинает сразу же отмерять следующий интервал такой же длительности. В результате таймер генерирует сигналы (прерывания) с определённой частотой, через заданные интервалы времени.

Периодический и сигнальный режимы работы таймера Рис. %img:id1

Сигнальный режим подразумевает то, что таймер отмеряет заданный интервал времени, по его окончании генерирует сигнал и останавливается. Таймер может иметь аппаратную поддержку сигнального режима, либо этот режим можно легко реализовать программно (достаточно отключить таймер в обработчике прерывания или выполнить требуемые действия внутри обработчика только при первом вызове).

Технически таймер строится на основе счётчика, который подсчитает импульсы некоторого тактового сигнала. Обычно сигнал о срабатывании таймера формируется при переполнении счётчика. Как правило, имеется возможность управлять модулем пересчёта счётчика таймера (задавать количество импульсов между двумя последовательными переполнениями счётчика). Это позволяет при фиксированной частоте тактового сигнала на входе счётчика устанавливать требуемую частоту генерации сигналов от таймера. Кроме того, обычно имеется программный доступ к счётчику таймера, по текущему значению которого можно с высоким разрешением определять время, прошедшее с момента последнего переполнения счётчика.

Таймер даёт возможность микроконтроллеру и программе вести отсчёт времени, что определяет два основных направления применения:

  1. Для выполнения требуемых действий в заданные моменты времени.
  2. Для определения (фиксации) моментов, когда произошли некоторые интересующие нас события.

К первому направлению применения таймера можно отнести, например, управление внешними устройствами по заранее запланированному расписанию, в соответствии с которым в требуемые моменты времени программа посылает управляющие сигналы к контролируемым устройствам. Интервал времени между двумя соседними запланированными моментами времени может варьироваться в широких пределах - от единиц периодов тактового сигнала до практически бесконечности (часы, сутки, годы). Независимо от длительности интервала, его можно задать с высокой точностью и с очень высоким разрешением во времени - до периода тактового сигнала.

Способность таймера отмерять очень малые интервалы времени открывает возможность применения таймера для генерации сигналов: цифровых (для этого достаточно выполнять переключение состояния внешнего вывода в соответствии с законом изменения синтезируемого сигнала) или аналоговых (за счёт совместной работы таймера и DAC).

Также таймер можно использовать для организации среды выполнения программы. Речь идёт, прежде всего, о реализации многозадачности путём переключения между выполняемыми задачами по сигналу таймера.

Не менее важным является второе направление использования таймера - для фиксации момента наступления событий. Это может быть: ведение журнала событий, измерение параметров внешних сигналов (длительность импульса, период сигнала) и т.д. Сюда можно отнести, опять же, решение задач управления, теперь уже в тех случаях, когда реакция на внешний сигнал зависит от момента его поступления.

Виды таймеров в STM32

В микроконтроллерах Cortex-M, к которым относятся и микроконтроллеры STM32, всегда имеется, по крайней мере, один таймер - системный таймер, наличие которого гарантируется требованиями архитектуры. Стандартизация системного таймера на уровне архитектуры существенно упрощает его использование. Как минимум, это обеспечивает переносимость кода, использующего этот таймер между разными микроконтроллерами. Переносимость особенно важна для кода операционных систем, так что неудивительно, то, что системный таймер обычно задействован для нужд операционной системы, если она используется, конечно.

Кроме системного таймера, микроконтроллеры STM32 имеют сторожевой таймер (и даже не один). Сторожевые таймеры имеют достаточно узкую специализацию - они используются для автоматической перезагрузки в случае зависания программы.

Кроме того, микроконтроллеры STM32 имеют множество универсальных таймеров*, которые можно использовать на своё усмотрение. В отличие от системного, они являются не частью ядра, а периферийными устройствами микроконтроллера. Включают в себя следующие типы таймеров: базовые, общего назначения и таймеры с расширенным управлением. Базовые таймеры являются самыми простыми, в соответствии со своим названием имеют лишь набор базовых функций. Таймеры с расширенным управлением - самые сложные и имеют наибольшее количество реализованных функций.

* Термин "универсальный таймер" не используется в официальной документации STM, я его ввёл для собственного удобства, чтобы объединить указанные выше три тесно связанных типа таймеров.

Для таймеров в микроконтроллерах семейства STM32 используется следующая система именования: название начинается с префикса TIM, за которым следует номер таймера: TIM1, TIM2, и т.д. Важно то, что номер таймера определяет его тип. И в разных микроконтроллерах таймеры с одинаковыми номерами обычно совместимы (одинаково устроены, имеют одинаковый набор функций и управляются одинаковым образом с помощью одинаковых наборов регистров; что, однако, не освобождает от необходимости внимательного ознакомления со справочным руководством: не гарантируется полное отсутствие различий). Такой подход очень удобен, так как позволяет легко переходить от одного микроконтроллера к другому - как в смысле изучения, так и при переносе кода. Используемая в микроконтроллерах STM система именования таймеров подразумевает то, что нумерация не обязательно должна быть последовательной, она имеет пропуски, соответствующие отсутствующим в конкретной модели микроконтроллера таймерам. Поэтому, например, если микроконтроллер имеет таймер с максимальным номером 17 (TIM17), это ещё не означает, что всего имеется 17 универсальных таймеров TIM1..TIM17 - таймеры с какими-то номерами будут отсутствовать.

В качестве примера приведём перечень таймеров, которые могут быть включены в микроконтроллеры из линейки STM32F100xx и укажем их типовую принадлежность.

Таблица %tbl:timers
Имя таймера Тип таймера
TIM1 Расширенный
TIM2
TIM3
TIM4
TIM5*
Общего назначения
TIM6
TIM7
Базовый
TIM12*
TIM13*
TIM14*
TIM15
TIM16
TIM17
Общего назначения

* Таймеры TIM5, TIM12, TIM13, TIM14 присутствуют не во всех микроконтроллерах линейки STM32F100xx.

Наряду с используемой нумерацией таймеров, жизнь разработчику также упрощает то, что все универсальные таймеры в STM32, несмотря на имеющиеся между ними различия, построены по единому принципу и управляются сходным образом. Более того, можно обнаружить сходство даже между таймерами в STM32 и таймерами в 8-битных микроконтроллерах семейства STM8, вплоть до одинакового именования регистров управления и битов в них.

Наиболее полным набором возможностей и функций обладает таймер с расширенным управлением. Обычно микроконтроллер STM содержит хотя бы один такой таймер, он имеет имя TIM1. Некоторые модели могут иметь два или даже три таймера с расширенным управлением (TIM1, TIM8, TIM20). Так вот, хитрость в том, что все остальные таймеры можно рассматривать как упрощённые варианты таймера TIM1, в которых исключены некоторые конструктивные элементы и не реализованы некоторые функции. С программной точки зрения работа с таймером осуществляется точно так же, как с TIM1. Естественно, с учётом того, что некоторые биты, отвечающие за нереализованные функции, переходят в число зарезервированных. Может отсутствовать целый регистр, если все его биты соответствуют нереализованным в этом таймере возможностям. Так что, изучив самый сложный таймер TIM1, можно в дальнейшем работать с любым другим таймером, уточнив лишь доступный для него набор функций.

Устройство таймера

На рисунке %img:simple_dgm изображена сильно упрощённая структурная схема таймера в микроконтроллере семейства STM32. Таймер здесь представлен состоящим из блоков: времязадающий модуль (Time-base unit); схема управления (Controller); набор каналов таймера (Channels); схема останова (схема защитного отключения выходов каналов, Break). Названные блоки тесно взаимодействуют, обмениваясь сигналами управления и событий (обозначено стрелками на схеме). Таймер подключён к шине микроконтроллера APB, через которую осуществляется доступ к его регистрам, от этой же шины таймер получает тактовый сигнал, который можно использовать как внутренний тактовый сигнал для счётчика таймера (на схеме не показано).

Упрощённая структурная схема таймера Рис. %img:simple_dgm

Таймер имеет возможность взаимодействовать с внешним окружением, проще говоря, имеет входы и выходы (входы/выходы каналов, вход ETR, вход BKIN). Некоторые таймеры микроконтроллера могут взаимодействовать между собой: для этого у них есть по одному внутреннему выходу триггерного сигнала (TRGO) и по 4 внутренних входа для триггерных сигналов ITR0, ITR1, ITR2, ITR3. Каждый триггерный вход данного таймера подключён к триггерному выходу другого определённого таймера. А триггерный выход может быть внутренне подключён к некоторому триггерному входу одного или нескольких других таймеров. Режим использования триггерных входов/выходов таймеров зависит от заданных настроек. Далее в таблице приводится схема подключения таймеров в микроконтроллерах линейки STM32F100xx.

Таблица %tbl:conn
Подчинённый таймер Подключение входов подчинённого к ведущим таймерам*
ITR0 ITR1 ITR2 ITR3
TIM1 TIM15 (TIM5)** TIM2 TIM3 TIM4
TIM2 TIM1 TIM15 TIM3 TIM4
TIM3 TIM1 TIM2 TIM15 TIM4
TIM4 TIM1 TIM2 TIM3 TIM15
TIM12 TIM4 TIM5 TIM13_OC TIM14_OC
TIM15 TIM2 TIM3 TIM16_OC TIM17_OC

Примечание.
* Если какой-то из таймеров отсутствует в данном микроконтроллере, то вход ITRx, который должен быть подключён к этому таймеру, будет недоступен.
** TIM5 присутствует не во всех микроконтроллерах линейки STM32F100xx. При наличии TIM5 выбор между TIM15/TIM5 выполняется с помощью средств AFIO.

Основа таймера - времязадающий модуль, главным элементом которого является счётчик. Счётчики универсальных таймеров в микроконтроллерах STM32 являются 16-разрядными (за немногочисленными исключениями: в некоторых линейках микроконтроллеров счётчики в TIM2, TIM5 могут быть 32-разрядными). Счётчик работает совместно с регистром автоперезагрузки, управляющим модулем пересчёта. При счёте вверх регистр определяет значение, до которого выполняется счёт, после достижения которого, происходит переполнение и сброс счётчика. При счёте вниз регистр определяет начальное значение счётчика, загружаемое при переполнении. Переполнение формирует специальный сигнал - событие обновления, по которому выполняется ряд важных действий, а также возможна генерация прерывания. Тактовый сигнал на счётчик поступает через предделитель с управляемым коэффициентом деления, который можно изменять в пределах от 1 до 65536 (построен на базе 16-разрядного счётчика). На вход предделителя тактовый сигнал поступает со схемы управления.

Схема управления даёт возможность выбрать источник тактового сигнала (это может быть внутренний тактовый сигнал с шины; внешний триггерный сигнал ETR; внутренний триггерный сигнал; сигнал от энкодер-интерфейса). Схема управления также определяет направление счёта (вверх или вниз), если в таймере реализована функция переключения направления счёта. Направление счёта выбирается с помощью конфигурирующих битов, а в некоторых режимах зависит от состояния таймера и переключается автоматически. При работе таймера в подчинённом режиме схема управления выбирает источник входного триггерного сигнала. Также схема управления генерирует выходной триггерный сигнал, который, в зависимости от настроек, может формироваться при переполнении счётчика таймера или в ответ на другие события.

Схема управления и времязадающий модуль - это минимум того, что входит в состав любого таймера (на рисунке эти блоки выделены цветом). Возможности таймера могут быть существенно расширены за счёт наличия одного или нескольких каналов. Каналы предназначены для выполнения наиболее часто встречающихся на практике задач по генерации импульсных сигналов и для измерения параметров внешних импульсных сигналов и могут, соответственно, работать в режиме выхода или входа. Теоретически, то, что выполняют каналы, можно реализовать программно, но аппаратная реализация разгружает процессор, увеличивает быстродействие и точность выполнения действий.

В режиме входа канал выполняет фиксацию текущего содержимого счётчика таймера по внешнему сигналу, т.е. сохраняет значение в регистре канала. Настройками можно задать источник сигнала и выбрать событие, по которому будет происходить фиксация (по нарастающему фронту или спаду сигнала). По зафиксированному в регистре канала значению, мы можем с высокой точностью узнать, в какой момент времени произошло событие. То же самое можно сделать программными средствами без использования каналов, а с использованием контроллера внешних прерываний, настроив его на генерацию прерывания в ответ на изменение сигнала на некотором входе. Тогда, считывая в обработчике этого прерывания содержимое счётчика таймера, мы определим момент, когда произошло интересующее нас событие. Но такая реализация имеет существенные недостатки:
лишняя вычислительная нагрузка на процессор, связанная с обработкой прерывания;
наличие задержки от момента наступления события до момента, когда внутри обработчика прерывания будет прочитано значение счётчика (составляет несколько периодов тактового сигнала и приводит к появлению систематической ошибки);
если прерывание не может быть обработано немедленно, величина задержки может возрасти на неопределённую величину;
максимальная частота выполнения фиксаций оказывается сильно ограничена быстродействием процессора.

В режиме выхода канал используется для генерации сигналов. В регистр канала записывают некоторое значение. Канал на каждом такте сравнивает текущее значение счётчика и значение в своём регистре и в зависимости от результата сравнения (и от настроек) изменяет состояние на своём выходе. Например, при равенстве значений может происходить формирование на выходе низкого или высокого уровня или переключение уровня на противоположный. Канал может иметь не один, а два комплементарных выхода, сигналы на которых изменяются в противофазе, с возможностью гибко задавать полярностью активных уровней этих сигналов и время задержки между сигналами при переключения. Это очень удобно при управлении мостовыми и полумостовыми схемами инверторов (задержка или "dead time" вводятся для предотвращения сквозных токов через управляемые ключи моста). Как и в случае режима входа, функции при работе в режиме выхода можно реализовать и программными средствами, но ценой потери быстродействия и точности.

При использовании таймера для генерации сигналов с ШИМ, полезным оказывается блок, предназначенный для защитного отключения выходов канала. Это отключение происходит в случае наличия сигнала на соответствующем входе микроконтроллера BKIN или в случае сбоев в системе генерации тактового сигнала микроконтроллера (включение схемы, контролируемые сигналы и их полярность определяются настройками). Защитное отключение предназначено для предотвращения повреждения управляемых силовых каскадов при возникновении аварийных ситуаций. При срабатывании защитного отключения, выходы канала переводятся в предопределённое безопасное состояние даже при отсутствии тактового сигнала микроконтроллера. Если система не используется, то при сбое в системе тактирования, выходы оказываются в статическом, "залипшем" состоянии. При использовании микроконтроллера, например, в схеме инвертора в системах электропитания, это приведёт к резкому росту тока через трансформатор и повреждению элементов схемы. Кроме того, внешний вход может быть подключён к детектору превышения тока и детектору перенапряжения на выходе.

Обзор таймеров STM32

Как уже говорилось, разные таймеры в микроконтроллерах STM32 имеют разные наборы доступных функций. Для того, чтобы было проще выбрать подходящий таймер, приведём таблицу с их основными характеристиками. Здесь рассмотрим таймеры в микроконтроллерах линейки STM32F100xx, но с учётом совместимости, информация будет полезна и для других линеек.

Таблица %tbl:features
Таймер Наличие входа ETR Наличие Master mode Наличие Slave mode Наличие защитного отключения Направление счёта Наличие счётчика циклов Количество каналов Каналов с компл. выходами Наличие интерфейса энкодера
TIM1 + + + + +/- + 4 3 +
TIM2 + + + - +/- - 4 0 +
TIM3
TIM4
TIM5
TIM6 - +(*) - - + - 0 0 -
TIM7
TIM12 - + + - + - 2 0
TIM13 - -(**) - - + - 1 0 -
TIM14
TIM15 - + + + + + 2 1 +
TIM16 - -(**) - + + + 1 1 -
TIM17

* TIM6, TIM7 имеют выходы TRGO, но они внутренне подключены к DAC (цифро-аналоговому преобразователю), так что эти таймеры не могут использоваться для управления другими таймерами.
** TIM13, TIM14, TIM16, TIM17 не имеют выходов TRGO и полноценного master-режима, но могут использоваться в качестве ведущих при совместной работе с TIM12 или TIM15, триггерными сигналами будут сигналы каналов TIM13_OC, TIM14_OC, TIM16_OC, TIM17_OC.

Все таймеры являются 16-разрядными (имеют 16-разрядные счётчики), за исключением небольшого количества моделей микроконтроллеров, в которых TIM2, TIM5 имеют 32 разряда. В линейке STM32F100xx таких устройств нет, в остальных случаях можно уточнить в документации.

Направление счёта для некоторых таймеров может быть задано программно (обозначено как "+/-" в таблице) с помощью бита DIR в регистре TIMx_CR1, для остальных таймеров счёт возможен только вверх.

Тактовым сигналом для таймера может быть внутренний тактовый сигнал с шины APB, к которой подключён таймер; выходной триггерный сигнал другого таймера (при работе в подчинённом режиме); входной сигнал одного из каналов (при наличии таковых); сигнал с интерфейса энкодера (один из вариантов подчинённого режима). Также некоторые таймеры имеют вход ETR для внешнего триггерного сигнала, который в определённых конфигурациях может быть тактовым.

Некоторые таймеры могут взаимодействовать между собой посредством внутренних подключений между триггерными выходами одного таймера и триггерными входами других. Для осуществления взаимодействия один из таймеров, между которыми имеется соединение, настраивается на работу в master-режиме, другой - в slave-режиме. Настройки таймера определяют, в каких случаях формируется импульс выходного триггерного сигнала (например, при переполнении) и какой будет реакция на входной триггерный сигнал. Таймер в одно и то же время может быть главным по отношению к какому-то таймеру и подчинённым по отношению к другому.

Кроме входа ETR, таймеры могут взаимодействовать с "внешним миром" с помощью каналов (количество каналов для каждого таймера указано в таблице). При работе в режиме выхода канал может иметь один выход или два комплементарных выхода, на которых можно получить два противофазных сигнала, что используется для генерации PWM сигналов, управляющих мостовыми или полумостовыми преобразователями.

Если таймер имеет хотя бы один канал с комплементарными выходами, он также имеет схему защитного отключения и счётчик циклов. Защитное отключение предназначено для того, чтобы в случае аварийной ситуации перевести выходы каналов таймера в безопасное для схемы предопределённое состояние, которое задаётся настройками таймера. В зависимости от настроек, схема может срабатывать при поступлении внешнего сигнала (на вход BKIN) или при обнаружении сбоев в системе тактирования микроконтроллера.

Счётчик циклов определяет, как часто будут обновляться теневые регистры таймера, что может быть полезным при генерации PWM сигналов - для того, чтобы сделать изменение параметров PWM сигнала более плавным.

author: hamper; date: 2017-11-28
  @Mail.ru