Skip to main content

Таймер

В системе присутствует 3 модуля таймера. Каждый таймер поддерживает 3 различных независимых режима работы. Кроме того, TIMER0 и TIMER1 дополнительно поддерживают 4-ый режим работы, в котором они взаимодействуют между собой. Каждый модуль имеет внешний вход, который, в зависимости от режима, управляет таймером.

Структурная схема

Структурная схема двух соединенных модулей таймера

Таймер состоит из следующих блоков:

  • REGISTERS – блок для хранения управляющих данных и статусов;
  • TIMER – блок управления счетом;
  • SWITCHER_CENTRE – переключатель, определяет будут ли использованы внутренние сигналы или сигналы с соседнего таймера;
  • ALLOCATOR – выделитель, выделяет фронт и спад внешнего сигнала;
  • SYNCHRONIZER – синхронизатор, синхронизирует внешний сигнал к системной частоте;
  • SWITCHER_IN – переключатель, определяет источник внешнего сигнала.

Работа в режиме «Простой таймер»

Принцип работы

В режиме «Простой таймер» модуль представляет собой 24-разрядный таймер с инкрементацией каждый такт системной частоты. Таймер считает до значения, записанного в регистры периода счета таймера TMR_PRDH, TMR_PRDM и TMR_PRDL. По достижению заданного значения таймер либо останавливается, либо начинает счет с нуля. Данная функция определяется битом CYCLES регистра TMR_CTRL. Также во время работы допускается перезапись текущего периода счета таймера. 
В результате перезаписи текущее значение таймера будет сброшено в 0 и счет начнется заново. Текущее значение таймера находится в регистрах TMR_VALH, TMR_VALM, TMR_VALL.

Значение, до которого будет считать модуль, определяется как:

Nclk=PRD+1,N_{clk} = PRD + 1,

где Nclk – количество тактов системной частоты.

Статусы и прерывания

Статусы содержаться в регистре TMR_ST. В данном режиме вырабатывается статус окончания счета периода – бит END_PRD. На основании данного статуса возможно возникновение прерывания. Прерывание разрешается путем записи «1» в соответствующий бит регистра маски прерываний TMR_MSK.

Алгоритм работы

Процедура настройки режима «Простой таймер»:

  • в регистры TMR_PRDH, TMR_PRDM и TMR_PRDL записать требуемое значение периода счета таймера;
  • в регистре TMR_MSK при необходимости разрешить прерывание;
  • в регистре TMR_CTRL:
    • установить требуемое значение бита CYCLES;
    • установить бит T/C в «0»;
    • в биты MODE необходимо записать значение 00b;
    • установить бит EN_EXT в «0»;
    • установить бит EN в «1».
  • текущее значение таймера можно вычитать из регистров TMR_VALH, TMR_VALM и TMR_VALL.

Работа в режиме «Таймер с внешней остановкой»

Принцип работы

В режиме «Таймер с внешней остановкой» модуль представляет собой 24-разрядный таймер с инкрементацией каждый такт системной частоты. При запуске таймер считает с нуля до момента возникновения заданного события на соответствующем выводе GPIO (альтернативная функция I_TIMER_EXT). Тип события остановки определяется битом STOP_TYPE регистра TMR_CFG. Текущее значение таймера находится в регистрах TMR_VALH, TMR_VALM и TMR_VALL.

Статусы и прерывания

Статусы содержатся в регистре TMR_ST. В данном режиме вырабатывается статус переполнения таймера – бит OVW и статус остановки таймера по внешнему событию – бит STOP_EVENT. На основании данных статусов возможно возникновение прерываний. Прерывание разрешается путем записи «1» в соответствующий бит регистра маски прерываний TMR_MSK.

Алгоритм работы

Процедура настройки режима «Таймер с внешней остановкой»:

  • в регистре TMR_CFG задать тип события остановки счета таймера путем записи требуемого значения в бит STOP_TYPE;
  • в регистре TMR_MSK разрешить необходимые прерывания;
  • в регистре TMR_CTRL:
    • установить бит CYCLES в «0»;
    • установить бит T/C в «0»;
    • в биты MODE необходимо записать значение 01b;
    • установить бит EN_EXT в «0»;
    • установить бит EN в «1».
  • текущее значения таймера можно вычитать из регистров TMR_VALH, TMR_VALM и TMR_VALL.

Работа в режиме «Межсобытийный таймер»

Принцип работы

В режиме «Межсобытийный таймер» модуль представляет собой 24-разрядный таймер с инкрементацией каждый такт системной частоты. После разрешения работы таймер ожидает событие старта на соответствующем выводе GPIO (альтернативная функция I_TIMER_EXT). Тип события старта определяется битом START_TYPE регистра TMR_CFG. Окончанием счета является событие остановки счета таймера на выводе GPIO. Тип события остановки определяется битом STOP_TYPE регистра TMR_CFG. Текущее значение таймера находится в регистрах TMR_VALH, TMR_VALM и TMR_VALL.

Статусы и прерывания

Статусы содержаться в регистре TMR_ST. В данном режиме вырабатывается статус переполнения таймера – бит OVW, статус запуска таймера по внешнему событию – бит START_EVENT и статус остановки таймера по внешнему событию – бит STOP_EVENT. На основании данных статусов возможно возникновение прерываний. Прерывание разрешается путем записи «1» в соответствующий бит регистра маски прерываний TMR_MSK.

Алгоритм работы

Процедура настройки режима «Межсобытийный таймер»:

  • в регистре TMR_CFG задать тип события запуска и остановки счета таймера путем записи требуемого значения в биты START_TYPE и STOP_TYPE;
  • в регистре TMR_MSK разрешить необходимые прерывания;
  • в регистре TMR_CTRL:
    • установить бит CYCLES в «0»;
    • установить бит T/C в «0»;
    • в биты MODE необходимо записать значение 10b;
    • установить бит EN_EXT в «0»;
    • установить бит EN в «1».
  • текущее значения таймера можно вычитать из регистров TMR_VALH, TMR_VALM и TMR_VALL.

Работа в режиме «Таймер-счетчик»

Примечание

Данный режим работы поддерживают модули TIMER0 и TIMER1. Модуль TIMER2 данный режим работы не поддерживает. При запуске TIMER2 в режиме «Таймер-счетчик» модуль уйдет в состояние ожидания, выход из которого возможен только по отключению модуля.

Принцип работы

В режиме «Таймер-счетчик» модули взаимодействуют между собой. Один из модулей необходимо настроить в режим таймера, а второй в режим счетчика. На вход модуля, который работает в режиме счетчика может быть подана либо частота внутреннего RC-генератора, либо сигнал с соответствующего вывода GPIO (альтернативная функция I_TIMER_EXT). Источник сигнала, события на котором будут отслеживаться, определяется битом EVENT_TYPE регистра TMR_CFG модуля счетчика. Тип события старта задается в обоих модулях битом START_TYPE регистра TMR_CFG.

После настройки модуль в режиме таймера и модуль в режиме счетчика ожидают события старта от ранее выбранного источника. Затем модуль, работающий в режиме таймера, считает до момента остановки его модулем в режиме счетчика. Модуль в режиме счетчика считает до значения, записанного в регистры периода счета TMR_PRDH, TMR_PRDM и TMR_PRDL. Счетчик увеличивается на 1 каждый раз, когда фиксирует заданное событие. Тип события определяется битом FIX_TYPE регистра TMR_CFG. По завершению счета модуль в режиме счетчика формирует событие окончания счета для модуля, работающего в режиме таймера. В результате оба модуля прекращают счет. Перезаписывать значение TMR_PRDH, TMR_PRDM и TMR_PRDL для модуля в режиме счетчика в ходе работы запрещено.

При START_TYPE = FIX_TYPE значение, до которого будет считать счетчик, определяется как:

Nevent=PRD+1,N_{event} = PRD + 1,

где Nevent – количество тактов системной частоты.

При START_TYPE != FIX_TYPE:

Nevent=PRDN_{event} = PRD

Статусы и прерывания

Статусы содержаться в регистре TMR_ST. В данном режиме, для модуля, работающего в режиме таймера, вырабатывается статус переполнения таймера – бит OVW, статус запуска таймера по внешнему событию – бит START_EVENT и статус остановки таймера по внешнему событию – бит STOP_EVENT. Для модуля, работающего в режиме счетчика, вырабатывается статус запуска таймера по внешнему событию – бит START_EVENT. На основании данных статусов возможно возникновение прерываний. Прерывание разрешается путем записи «1» в соответствующий бит регистра маски прерываний TMR_MSK.

Алгоритм работы

Процедура настройки режима «Таймер-счетчик» для модуля в режиме таймера:

  • в регистре TMR_CFG задать тип события запуска счета таймера путем записи требуемого значения в бит START_TYPE;
  • в регистре TMR_MSK разрешить необходимые прерывания;
  • в регистре TMR_CTRL:
    • установить бит CYCLES в «0»;
    • установить бит T/C в «0»;
    • в биты MODE необходимо записать значение 11b;
    • установить бит EN_EXT в «1»;
    • установить бит EN в «1».
  • текущее значения таймера можно вычитать из регистров TMR_VALH, TMR_VALM и TMR_VALL.

Бит EN_EXT разрешает соседнему модулю начать работу, таким образом синхронизируя запуск обоих модулей.

Процедура настройки режима «Таймер-счетчик» для модуля в режиме счетчика:

  • в регистре TMR_CFG:
    • задать источник сигнала битом EVENT_TYPE;
    • задать тип события счетчика битом FIX_TYPE;
    • задать тип события запуска счета битом START_TYPE.
  • в регистры TMR_PRDH, TMR_PRDM и TMR_PRDL записать требуемое значение периода счета таймера;
  • в регистре TMR_MSK при необходимости разрешить прерывание;
  • в регистре TMR_CTRL:
    • установить бит CYCLES в «0»;
    • установить бит T/C в «1»;
    • в биты MODE необходимо записать значение 11b;
    • установить бит EN_EXT в «1»;
    • установить бит EN в «1».
  • текущее значения таймера можно вычитать из регистров TMR_VALH, TMR_VALM и TMR_VALL.

Бит EN_EXT разрешает соседнему модулю начать работу, таким образом синхронизируя запуск обоих модулей.

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

АббревиатураДоступОписание
TIMER0
2D00h TMR0_CTRLRWРегистр управления
2D01h TMR0_CFGRWРегистр конфигурации
2D02h TMR0_PRDHRWПериод счета таймера, старшая часть
2D03h TMR0_PRDMRWПериод счета таймера, старшая часть
2D04h TMR0_PRDLRWПериод счета таймера, младшая часть
2D05h TMR0_VALHRТекущее значение таймера, старшая часть
2D06h TMR0_VALMRТекущее значение таймера, средняя часть
2D07h TMR0_VALLRТекущее значение таймера, младшая часть
2D08h TMR0_MSKRWРегистр маски прерываний
2D09h TMR0_STRРегистр статусов
TIMER1
2D20h TMR1_CTRLRWРегистр управления
2D21h TMR1_CFGRWРегистр конфигурации
2D22h TMR1_PRDHRWПериод счета таймера, старшая часть
2D23h TMR1_PRDMRWПериод счета таймера, старшая часть
2D24h TMR1_PRDLRWПериод счета таймера, младшая часть
2D25h TMR1_VALHRТекущее значение таймера, старшая часть
2D26h TMR1_VALMRТекущее значение таймера, средняя часть
2D27h TMR1_VALLRТекущее значение таймера, младшая часть
2D28h TMR1_MSKRWРегистр маски прерываний
2D29h TMR1_STRРегистр статусов
TIMER2
2D40h TMR2_CTRLRWРегистр управления
2D41h TMR2_CFGRWРегистр конфигурации
2D42h TMR2_PRDHRWПериод счета таймера, старшая часть
2D43h TMR2_PRDMRWПериод счета таймера, старшая часть
2D44h TMR2_PRDLRWПериод счета таймера, младшая часть
2D45h TMR2_VALHRТекущее значение таймера, старшая часть
2D46h TMR2_VALMRТекущее значение таймера, средняя часть
2D47h TMR2_VALLRТекущее значение таймера, младшая часть
2D48h TMR2_MSKRWРегистр маски прерываний
2D49h TMR2_STRРегистр статусов

TMRx_CTRL

Бит76543210
НазначениеРезервCYCLEST/CMODEEN_EXTEN
Начальное значение0

CYCLES – работа таймера по достижению значения периода:

  • 1 – повторный счет с нуля;
  • 0 – остановка счета.

T/C – работа в режиме таймера или счетчика, имеет значение только при MODE «Таймер-счетчик»:

  • 1 – режим счетчика;
  • 0 – режим таймера.

MODE – режимы работы модуля:

  • 11b – «Таймер-счетчик»;
  • 10b – «Межсобытийный таймер»;
  • 01b – «Таймер с внешней остановкой»;
  • 00b – «Простой таймер».

EN_EXT – разрешение работы соседнего модуля таймера, имеет значение только при MODE «Таймер-счетчик»:

  • 1 – работа соседнего таймера разрешена;
  • 0 – работа соседнего таймера запрещена.

При работе с регистрами модуля TIMER0 бит EN_EXT управляет модулем TIMER1. При работе 
с регистрами модуля TIMER1 бит EN_EXT управляет модулем TIMER0.

EN – разрешение работы таймера:

  • 1 – таймер включен;
  • 0 – таймер выключен.

TMRx_CFG

Бит76543210
НазначениеРезервEVENT_TYPEFIX_TYPESTOP_TYPESTART_TYPE
Начальное значение0

EVENT_TYPE – источник сигнала, на котором отслеживаются события в режиме «Таймер-счетчик»:

  • 1 – вывод GPIO;
  • 0 – внутренний RC-генератор.

FIX_TYPE – тип события, которое считается счетчиком в режиме «Таймер-счетчик»:

  • 1 – событие заднего фронта;
  • 0 – событие переднего фронта.

STOP_TYPE – тип события остановки счета таймера:

  • 1 – остановка по заднему фронту;
  • 0 – остановка по переднему фронту.

START_TYPE – тип события старта счета таймера:

  • 1 – старт по заднему фронту;
  • 0 – старт по переднему фронту.

TMRx_PRDH

Бит76543210
НазначениеPRD
Начальное значение0

PRD – период счета таймера, старшая часть.

TMRx_PRDM

Бит76543210
НазначениеPRD
Начальное значение0

PRD – период счета таймера, средняя часть.

TMRx_PRDL

Бит76543210
НазначениеPRD
Начальное значение0

PRD – период счета таймера, младшая часть.

TMRx_VALH

Бит76543210
НазначениеVAL
Начальное значение0

VAL – текущее значение таймера, старшая часть.

TMRx_VALM

Бит76543210
НазначениеVAL
Начальное значение0

VAL – текущее значение таймера, средняя часть.

TMRx_VALL

Бит76543210
НазначениеVAL
Начальное значение0

VAL – текущее значение таймера, младшая часть.

TMRx_MSK

Возможно формирование прерывания по любому биту статусного регистра TMR_ST. Расположение битов в TMR_ST и TMR_MSK аналогично.

Бит76543210
НазначениеРезервSTOP_EVENTSTART_EVENTOVWEND_PRD
Начальное значение0

Для каждого из битов справедливо:

  • 1 – данное прерывание формируется;
  • 0 – данное прерывание не формируется.

TMRx_ST

Возможно формирование прерывания по любому биту статусного регистра TMR_ST. Расположение битов в TMR_ST и TMR_MSK аналогично.

Бит76543210
НазначениеРезервSTOP_EVENTSTART_EVENTOVWEND_PRD
Тип статусаEVENT
Начальное значение0

STOP_EVENT – зафиксировано событие остановки таймера;

START_EVENT – зафиксировано событие старта таймера;

OVW – зафиксировано переполнение таймера;

END_PRD – зафиксирован конец счета периода.