Таймер
В системе присутствует 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 – количество тактов системной частоты.
Статусы и прерывания
Статусы содержаться в регистре 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 – количество тактов системной частоты.
При START_TYPE != FIX_TYPE:
Статусы и прерывания
Статусы содержаться в регистре 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_CTRL | RW | Регистр управления |
2D01h | TMR0_CFG | RW | Регистр конфигурации |
2D02h | TMR0_PRDH | RW | Период счета таймера, старшая часть |
2D03h | TMR0_PRDM | RW | Период счета таймера, старшая часть |
2D04h | TMR0_PRDL | RW | Период счета таймера, младшая часть |
2D05h | TMR0_VALH | R | Текущее значение таймера, старшая часть |
2D06h | TMR0_VALM | R | Текущее значение таймера, средняя часть |
2D07h | TMR0_VALL | R | Текущее значение таймера, младшая часть |
2D08h | TMR0_MSK | RW | Регистр маски прерываний |
2D09h | TMR0_ST | R | Регистр статусов |
TIMER1 | |||
2D20h | TMR1_CTRL | RW | Регистр управления |
2D21h | TMR1_CFG | RW | Регистр конфигурации |
2D22h | TMR1_PRDH | RW | Период счета таймера, старшая часть |
2D23h | TMR1_PRDM | RW | Период счета таймера, старшая часть |
2D24h | TMR1_PRDL | RW | Период счета таймера, младшая часть |
2D25h | TMR1_VALH | R | Текущее значение таймера, старшая часть |
2D26h | TMR1_VALM | R | Текущее значение таймера, средняя часть |
2D27h | TMR1_VALL | R | Текущее значение таймера, младшая часть |
2D28h | TMR1_MSK | RW | Регистр маски прерываний |
2D29h | TMR1_ST | R | Регистр статусов |
TIMER2 | |||
2D40h | TMR2_CTRL | RW | Регистр управления |
2D41h | TMR2_CFG | RW | Регистр конфигурации |
2D42h | TMR2_PRDH | RW | Период счета таймера, старшая часть |
2D43h | TMR2_PRDM | RW | Период счета таймера, старшая часть |
2D44h | TMR2_PRDL | RW | Период счета таймера, младшая часть |
2D45h | TMR2_VALH | R | Текущее значение таймера, старшая часть |
2D46h | TMR2_VALM | R | Текущее значение таймера, средняя часть |
2D47h | TMR2_VALL | R | Текущее значение таймера, младшая часть |
2D48h | TMR2_MSK | RW | Регистр маски прерываний |
2D49h | TMR2_ST | R | Регистр статусов |
TMRx_CTRL
Бит | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
---|---|---|---|---|---|---|---|---|
Назначение | Резерв | CYCLES | T/C | MODE | EN_EXT | EN | ||
Начальное значение | 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
Бит | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
---|---|---|---|---|---|---|---|---|
Назначение | Резерв | EVENT_TYPE | FIX_TYPE | STOP_TYPE | START_TYPE | |||
Начальное значение | 0 |
EVENT_TYPE – источник сигнала, на котором отслеживаются события в режиме «Таймер-счетчик»:
- 1 – вывод GPIO;
- 0 – внутренний RC-генератор.
FIX_TYPE – тип события, которое считается счетчиком в режиме «Таймер-счетчик»:
- 1 – событие заднего фронта;
- 0 – событие переднего фронта.
STOP_TYPE – тип события остановки счета таймера:
- 1 – остановка по заднему фронту;
- 0 – остановка по переднему фронту.
START_TYPE – тип события старта счета таймера:
- 1 – старт по заднему фронту;
- 0 – старт по переднему фронту.
TMRx_PRDH
Бит | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
---|---|---|---|---|---|---|---|---|
Назначение | PRD | |||||||
Начальное значение | 0 |
PRD – период счета таймера, старшая часть.
TMRx_PRDM
Бит | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
---|---|---|---|---|---|---|---|---|
Назначение | PRD | |||||||
Начальное значение | 0 |
PRD – период счета таймера, средняя часть.
TMRx_PRDL
Бит | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
---|---|---|---|---|---|---|---|---|
Назначение | PRD | |||||||
Начальное значение | 0 |
PRD – период счета таймера, младшая часть.
TMRx_VALH
Бит | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
---|---|---|---|---|---|---|---|---|
Назначение | VAL | |||||||
Начальное значение | 0 |
VAL – текущее значение таймера, старшая часть.
TMRx_VALM
Бит | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
---|---|---|---|---|---|---|---|---|
Назначение | VAL | |||||||
Начальное значение | 0 |
VAL – текущее значение таймера, средняя часть.
TMRx_VALL
Бит | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
---|---|---|---|---|---|---|---|---|
Назначение | VAL | |||||||
Начальное значение | 0 |
VAL – текущее значение таймера, младшая часть.
TMRx_MSK
Возможно формирование прерывания по любому биту статусного регистра TMR_ST. Расположение битов в TMR_ST и TMR_MSK аналогично.
Бит | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
---|---|---|---|---|---|---|---|---|
Назначение | Резерв | STOP_EVENT | START_EVENT | OVW | END_PRD | |||
Начальное значение | 0 |
Для каждого из битов справедливо:
- 1 – данное прерывание формируется;
- 0 – данное прерывание не формируется.
TMRx_ST
Возможно формирование прерывания по любому биту статусного регистра TMR_ST. Расположение битов в TMR_ST и TMR_MSK аналогично.
Бит | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
---|---|---|---|---|---|---|---|---|
Назначение | Резерв | STOP_EVENT | START_EVENT | OVW | END_PRD | |||
Тип статуса | EVENT | |||||||
Начальное значение | 0 |
STOP_EVENT – зафиксировано событие остановки таймера;
START_EVENT – зафиксировано событие старта таймера;
OVW – зафиксировано переполнение таймера;
END_PRD – зафиксирован конец счета периода.