Базовые таймеры TIM6 и TIM7
[Home] [< Prev: Регистры таймера TIM1] [Next: Использование базовых таймеров (TIM6, TIM7) >]

Базовые таймеры TIM6 и TIM7

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

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

Не все таймеры микроконтроллера имеют одинаковый набор выполняемых функций. Наиболее простыми в микроконтроллерах семейства STM32F100xx являются таймеры TIM6 и TIM7. Они рассчитаны на выполнение только базовых функций, тем не менее могут быть весьма полезными. Хорошо подходят для работы совместно с цифро-аналоговым преобразователем микроконтроллера (DAC).

Здесь даётся общее описание устройства и функционирования базовых таймеров. Их использование в программах будет рассмотрено в следующей статье.

Основные свойства базовых таймеров TIM6 и TIM7
Функциональное описание таймеров TIM6 и TIM7
Режим счёта
Работа в режиме отладки
Регистры таймеров TIM6, TIM7
   TIMx_CR1 (TIM6&TIM7 control register 1)
   TIMx_CR2 (TIM6&TIM7 control register 2)
   TIMx_DIER (TIM6&TIM7 DMA/Interrupt enable register)
   TIMx_SR (TIM6&TIM7 status register)
   TIMx_EGR (TIM6&TIM7 event generation register)
   TIMx_CNT (TIM6&TIM7 counter)
   TIMx_PSC (TIM6&TIM7 prescaler)
   TIMx_ARR (TIM6&TIM7 auto-reload register)



Основные свойства базовых таймеров TIM6 и TIM7

Каждый из базовых таймеров включает в себя

Базовые таймеры полностью независимы, не имеют общих ресурсов. Могут использоваться для формирования заданных интервалов времени. Оптимальны для совместной работы с DAC, так как триггерные выходы (выходы запуска) TRGO базовых таймеров внутренне подключены к DAC микроконтроллера и могут использоваться для запуска процесса преобразования в DAC.

Базовые таймеры могут работать в ведущем (master) режиме совместно с другими таймерами; работа в подчинённом режиме не поддерживается.

Функциональное описание таймеров TIM6 и TIM7

Источник сигнала для таймера. Базовые таймеры не имеют внешних входов/выходов (привязанных к выводам микроконтроллера). Поэтому они могут использовать только внутренний источник тактового сигнала.

Таймеры TIM6, TIM7 являются периферийными устройствами микроконтроллера, которые подключены к шине APB1 и получают тактовый сигнал от этой шины (тактовый сигнал с шины поступает на вход прескалера таймера). По умолчанию частота тактового сигнала на шине APB1 равна частоте ядра, которая, в свою очередь, по умолчанию равна 24 МГц для устройств серии STM32F100xx, однако, может настраиваться в очень широких пределах. С помощью настройки своего предварительного делителя, тактовая частота шины может быть уменьшена в 2, 4, 8 или 16 раз. Особенность тактирования таймеров в отличие от другой периферии состоит в том, что если коэффициент деления частоты тактового сигнала на шине, к которой таймер подключён не равен 1, то таймер тактируется сигналом с частотой вдвое больше. Это значит, что делители 1, 2, 4, 8, 16 в отношении таймеров будут эквивалентны делителям 1, 1, 2, 4, 8; таким образом, частота тактового сигнала для таймера по умолчанию составляет 24 МГц. Подробнее о тактировании рассказано в статье "Тактовые сигналы микроконтроллеров STM32F100xx".

Устройство базового таймера. Основа базового таймера - 16-битовый суммирующий счётчик и связанный с ним регистр автоматической перезагрузки. Частота поступающего на вход счётчика сигнала делится с помощью предварительного делителя частоты таймера.

Основные блоки таймера имеют соответствующие им регистры, отображаемые в память микроконтроллера (здесь и далее в статье в именах регистров используется обозначение x, x=6 или x=7 для соответствующих таймеров TIM6, TIM7):

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

Блок-схема базового таймера

Регистр ARR является регистром с предварительной загрузкой, он имеет теневой регистр. Во время операций чтения и записи осуществляется доступ непосредственно к самому регистру, в то время как работой таймера управляет теневой регистр. Содержимое регистра с предзагрузкой передаётся в теневой регистр сразу, либо по сигналу обновления, в зависимости от значения бита ARPE в регистре TIMx_CR1. Единичное значение бита включает режим предзагрузки, при нулевом значении (это значение по умолчанию) предзагрузка отключена и содержимое теневого регистра модифицируется сразу.

Событие обновления генерируется при достижении счётчиком значения переполнения (т.е. текущего значения в теневом регистре регистра ARR) если бит UDIS в регистре TIMx_CR1 сброшен в 0. Также событие обновления может генерироваться программно - установкой в 1 бита UG в регистре EGR. Подробнее генерация события в разных конфигурациях будет описана далее.

Прескалер и счётчик таймера включаются установкой в 1 бита CEN (counter enable) в регистре TIMx_CR1. Сигнал включения счётчика CNT_EN устанавливается в 1 через 1 такт после установки бита CEN.

Описание прескалера. Прескалер таймера позволяет выполнять деление частоты входного сигнала на любой целый коэффициент в пределах 1..65536. Прескалер выполнен на 16-битовом счётчике и управляется с помощью 16-битового регистра TIMx_PSC. Значение регистра можно изменять в процессе работы таймера, поскольку регистр буферизован. Переключение коэффициента деления произойдёт в момент генерации очередного события обновления.

На следующих двух рисунках приведены примеры поведения счётчика при изменении коэффициента деления прескалера в процессе работы таймера.

На данной временной диаграмме изображены процессы в таймере при переключении коэффициента деления прескалера с 1 на значение 2. Здесь значение регистра ARR равно 0xFC, так что когда счётчик достигает этого значения, следующий импульс сбрасывает счётчик в 0 и при этом формируется сигнал update event.
Диаграмма функционирования таймера при переключении коэффициента деления прескалера с 1 на 2

На этой диаграмме происходит изменение коэффициента деления прескалера таймера с 1 на значение 4.
Диаграмма функционирования таймера при переключении коэффициента деления прескалера с 1 на 4

Режим счёта

При включённом таймере, его счётчик выполняет счёт от 0 до значения авто-перезагрузки (значение в теневом регистре для TIMx_ARR), затем происходит сброс счётчика и происходит генерация сигнала переполнения. Счёт снова начинается с 0. Каждое переполнение генерирует событие обновления (update event, UEV), которое также возникает при программной установке в 1 бита UG регистра TIMx_EGR.

Достижение счётчиком значения 0xFFFF не рассматривается как переполнение и не вызывает генерацию события обновления, если TIMx_ARR (вернее его теневой регистр) не равен 0xFFFF. Мы можем программно установить значение регистра TIMx_CNT большее, чем TIMx_ARR. Счётчик, досчитав до 0xFFFF просто перейдёт в следующем такте к значению 0 - как и положено 16-битовому счётчику, выполняющему суммирование по модулю 216. Переполнение будет зафиксировано только при достижении счётчиком значения в теневом регистре для TIMx_ARR.

Генерацию события обновления можно программно отключить, установив в 1 бит UDIS в регистре TIMx_CR1. Это даёт возможность избежать обновления теневых регистров до тех пор, пока будет завершена запись новых значений в регистры с предзагрузкой. При установленном бите UDIS таймер продолжает работу с использованием значений в теневых регистрах. Интересно, что установка бита UG при установленном бите UDIS сбрасывает счётчики таймера, но не обновляет теневые регистры. Впрочем это несколько странная идея - запретить обновление и пытаться его выполнить.

Бит URS (update request selection) в регистре TIMx_CR1 определяет, в каких случаях происходит аппаратная установка в 1 флага UIF в регистре TIMx_SR (когда происходит установка флага UIF генерируется прерывание таймера или запрос DMA, если это разрешено настройками таймера). Если бит URS сброшен в 0, то флаг UIF устанавливается как в случае переполнения счётчика таймера, так и в случае программной установки бита UG регистра TIMx_EGR (UG - бит генерации сигнала обновления буферизированных регистров). Если бит URS установлен в 1, то установка флага UIF, генерация прерывания и запроса DMA происходит только в случае переполнения счётчика таймера.

Ещё раз отметим, бит URS определяет только лишь то, в каких случаях будет происходить прерывание. Событие обновления при установке бита UG произойдёт независимо от значения бита URS. Если бит URS установлен в 1, то установка бита UG генерирует событие обновления, но флаг прерывания UIF не устанавливается и не происходит ни прерывания, ни формирования DMA запроса.

Когда происходит событие обновления, все теневые регистры обновляются и устанавливается флаг UIF в регистре TIMx_SR (если это разрешает URS бит):

При генерации события обновления установкой бита UG, происходит сброс счётчиков таймера.

На следующих рисунках изображены диаграммы, поясняющие работу таймера при разных частотах тактового сигнала счётчика (при разных коэффициентах деления прескалера). Здесь TIMx_ARR=0x36.

Счёт при коэффициенте деления прескалера равном 1
Счёт при коэффициенте деления прескалера равном 1

Счёт при коэффициенте деления прескалера равном 2
Счёт при коэффициенте деления прескалера равном 2

Счёт при коэффициенте деления прескалера равном 4
Счёт при коэффициенте деления прескалера равном 4

Счёт при произвольном коэффициенте деления прескалера N
Счёт при произвольном коэффициенте деления прескалера N

В зависимости от значения бита ARPE, регистр TIMx_ARR может работать без предзагрузки (ARPE=0, при записи в регистр содержимое его теневого регистра обновляется сразу) или с предзагрузкой (ARPE=1, содержимое теневого регистра обновляется только при возникновении события обновления). На следующих рисунках изображены диаграммы работы таймера в этих двух режимах.

Работа таймера в случае, если регистр TIMx_ARR работает без предзагрузки (ARPE=0)
Работа таймера в случае, если регистр TIMx_ARR работает без предзагрузки (ARPE=0)

Работа таймера в случае предзагружаемого регистра TIMx_ARR (ARPE=1)
Работа таймера в случае предзагружаемого регистра TIMx_ARR (ARPE=1)

Далее приведён рисунок с временными диаграммами работы схемы управления таймера в нормальном режиме для случая, когда коэффициент деления прескалера равен 1.

Временные диаграммы работы схемы управления таймера в нормальном режиме

Прескалер подключается к внутреннему источнику тактового сигнала CK_INT при записи в бит CEN значения 1. Для установки сигнала CNT_EN требуется 1 такт и ещё через 1 такт начинается счёт.

Устанавливаемый программно в 1 бит UG, используемый для генерации события обновления, сбрасывается аппаратно. Следом за сбросом бита UG формируется импульс, сброса счётчика. Прескалер (счётчик прескалера) при этом также сбрасывается.

Работа в режиме отладки

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

Регистры таймеров TIM6, TIM7

Доступ к регистрам возможен как к полусловам (как к 16-битовым регистрам) или как к словам (как 32-битовым регистрам).

TIMx_CR1 (TIM6&TIM7 control register 1)
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0  
Reserved ARPE Reserved OPM URS UDIS CEN
rw rw rw rw rw

Address offset: 0x00
Reset value: 0x0000

ARPE: Auto-reload preload enable
Бит для включения режима предзагрузки регистра TIMx_ARR:
0: TIMx_ARR не буферизируется;
1: используется буферизация регистра TIMx_ARR.
Когда буферизация включена, новое значение, записанное в регистр, начинает использоваться после очередного события обновления.

OPM: One-pulse mode
Бит для включения режима одиночного импульса:
0: обычный режим работы счётчика, после события обновления счётчик не останавливается;
1: следующее событие обновления остановит счётчик (посредством аппаратного сброса бита CEN). После остановки в регистре TIMx_CNT будет значение 0.

URS: Update request source
Этот бит определяет, в каких случаях происходит установка в 1 бита UIF в регистре SR (и связанная с битом UIF генерация прерывания и запроса DMA, если это разрешено соответствующими битами):
0: любое из следующих событий генерирует прерывание или запрос DMA (если разрешено): переполнение счётчика; программная установка бита UG;
1: только переполнение счётчика может генерировать прерывание или запрос DMA (если разрешено).
Этот бит только лишь определяет, будет ли генерироваться прерывание (запрос DMA) и происходить установка бита UIF при программной установке бита UG. Он не влияет на процесс обновления теневых регистров: независимо от значения URS, при установке бита UG происходит сброс счётчика таймера, счётчика прескалера и обновление теневых регистров.

UDIS: Update disable
Бит для программного запрета/разрешения генерации события обновления.
0: Генерация события UEV разрешена. Событие обновление генерируется при переполнении счётчика таймера или при установке бита UG. Если используется буферизация регистров, происходит их обновление предзагруженными значениями (иначе говоря, управляющие работой таймера теневые регистры обновляются значениями из соответствующих регистров, доступных для программной записи и для чтения).
1: Генерация события UEV отключена. Событие обновления не генерируется, теневые регистры сохраняют свои значения (ARR, PSC). Однако, счётчик и счётчик прескалера будут сброшены при установке бита UG.

CEN: Counter enable
Бит для включения счётчика таймера. Устанавливается и сбрасывается программно; в режиме формирования одиночного импульса происходит аппаратный сброс бита, когда происходит событие обновления.
0: Счётчик отключён;
1: счётчик включён.

TIMx_CR2 (TIM6&TIM7 control register 2)
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0  
Reserved MMS[2:0] Reserved
rw rw rw

Address offset: 0x04
Reset value: 0x0000

MMS: Master mode selection
Биты используются при работе таймера в режиме ведущего устройства для выбора информации, посылаемой подчинённому устройству для синхронизации (выход таймера TRGO). Используются следующие комбинации:
000: Reset - бит UG регистра TIMx_EGR используется как триггерный (запускающий) выход TRGO.
001: Enable - сигнал включения счётчика, CNT_EN, используется как триггерный (запускающий) выход TRGO. Этот вариант может быть полезен для одновременного запуска нескольких таймеров или для того, чтобы задать временное "окно" для включения подчинённого таймера.
010: Update - событие обновления используется как выход TRGO. В этом случае ведущий таймер может использоваться, например, как прескалер для подчинённого таймера (так можно получить тактовый сигнал с очень большим периодом для формирования длительных интервалов времени).

TIMx_DIER (TIM6&TIM7 DMA/Interrupt enable register)
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0  
Reserved UDE Reserved UIE
rw rw

Address offset: 0x0C
Reset value: 0x0000

С помощью регистра можно разрешить или запретить таймеру генерацию прерываний и запросов DMA. Генерация прерывания и запроса DMA будет происходить в моменты аппаратной установки бита UIF в регистре TIMx_SR.

UDE: Update DMA request enable
Бит разрешения формирования запросов DMA в момент наступления события обновления:
0: DMA запросы отключены;
1: DMA запросы включены.

UIE: Update interrupt enable
Бит разрешения генерации прерывания от таймера по событию обновления:
0: прерывания отключены;
1: прерывания включены.

TIMx_SR (TIM6&TIM7 status register)
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0  
Reserved UIF
rc_w0

Address offset: 0x10
Reset value: 0x0000

UIF: Update interrupt flag
Бит устанавливается аппаратно, когда возникает событие обновления. Сбрасывается в 0 программно.
0: События обновления не было.
1: Отложено прерывание от таймера. Бит устанавливается:

TIMx_EGR (TIM6&TIM7 event generation register)
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0  
Reserved UG
w

Address offset: 0x14
Reset value: 0x0000

UG: Update generation
Бит устанавливается программно, сбрасывается автоматически аппаратно.
0: Не оказывает действия.
1: Перезапускает счётчик таймера, счётчик прескалера и обновляет регистры с предзагрузкой (обновляет теневые регистры значениями из соответствующих регистров). Если бит UDIS=1, счётчики сбрасываются, но теневые регистры не обновляются.

TIMx_CNT (TIM6&TIM7 counter)
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0  
CNT[15:0]
rw rw rw rw rw rw rw rw rw rw rw rw rw rw rw rw

Address offset: 0x24
Reset value: 0x0000

CNT[15:0]: Counter value
Содержимое счётчика таймера.

TIMx_PSC (TIM6&TIM7 prescaler)
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0  
PSC[15:0]
rw rw rw rw rw rw rw rw rw rw rw rw rw rw rw rw

Address offset: 0x28
Reset value: 0x0000

PSC[15:0]: Prescaler value
Значение, определяющее коэффициент деления частоты прескалера (предварительного делителя частоты).
Частота сигнала, поступающего на вход счётчика равна fCK_PSC/(PSC[15:0]+1). PSC содержит значение, которое загружается в активный регистр прескалера (теневой регистр, регистр который определяет коэффициент деления прескалера в данный момент) при каждом событии обновления.

TIMx_ARR (TIM6&TIM7 auto-reload register)
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0  
[15:0]
rw rw rw rw rw rw rw rw rw rw rw rw rw rw rw rw

Address offset: 0x2C
Reset value: 0x0000*

* Значение, указанное в Reference Manual. Как показал нехитрый эксперимент над моим живым STM32F100RB, на самом деле значение регистра после сброса 0xFFFF.

ARR[15:0]: Prescaler value
Регистр содержит значение, загружаемое в действующий регистр (теневой, содержащий то значение, которое используется таймером в данный момент). Подробнее вопросы теневых регистров и их предзагрузки рассматривались выше.
Счёт продолжается до заданного значения (включительно), после чего формируется сигнал переполнения счётчика, возникает событие обновления; счётчик сбрасывается в 0.
Значение 0 в регистре блокирует счётчик.

author: hamper; date: 2016-05-12; modified: 2016-10-18
  @Mail.ru