TIMER может работать в двух режимах: как таймер и как счетчик.
Рис. 1. Блок/схема таймера/счетчика TIMER. Здесь n может быть от 0 до 3 или от 0 до 5, в зависимости от экземпляра TIMER (см. таблицу 1).
Примечание: непонятные термины и сокращения см. в Словарике [3].
Таймер/счетчик работает на высокой частоте тактов (HFCLK) и включает 4-разрядный прескалер (1/2X), который может делить входную частоту тактов таймера, поступающую от контроллера HFCLK. Выбор источника тактов между PCLK16M и PCLK1M автоматический, в соответствии с базовой частотой тактов TIMER, установленной прескалером. Базовая частота тактов TIMER всегда равна частоте 16 МГц, поделенной на значение прескалера.
Подсистема PPI [2] позволяет событию таймера (TIMER event) активировать задачу (trigger task) любого другого системного периферийного устройства MCU серий nRF5x. PPI также позволяет функциям TIMER task/event генерировать периодические выходные сигналы и ШИМ (PWM) на любой из ножек GPIO [4]. Количество одновременно используемых входов/выходов ограничено количеством каналов GPIOTE [5].
TIMER может работать в двух режимах, как таймер (Timer mode) и как счетчик импульсов (Counter mode). В обоих режимах TIMER начинает работать при активации задачи START, и останавливает работу при активации задачи STOP. После того, как таймер был остановлен, он может продолжить свою работу повторной активацией задачи START. Когда работа таймера/счетчика была возобновлена, таймер продолжит работу от того состояния (значения счетчика), на котором он был ранее остановлен.
Интересно отметить, что у таймера/счетчика нет прямого доступа к регистру счетчика со стороны вычислительного ядра MCU. Т. е. у него нет регистра COUNTER, доступного для программы, это отличает TIMER от RTC [6]. Кроме того, TIMER не может тактироваться от низкой тактовой частоты LFCLK, и по сравнению с RTC потребляет больше энергии.
Timer mode. В режиме таймера внутренний регистр счетчика TIMER инкрементируется каждый тик частоты fTIMER, как было показано на рис. 1. Частота таймера получается из частоты тактов PCLK16M, как показано ниже, с использованием значений, указанных в регистре PRESCALER:
fTIMER = 16 МГц / (2PRESCALER)
Когда частота fTIMER меньше или равна 1 МГц, TIMER будет использовать для тактирования внутреннюю частоту PCLK1M вместо PCLK16M с целью снижения потребления энергии.
Counter mode. В режиме счетчика внутренний регистр счетчика TIMER инкрементируется каждый раз, когда активируется задача COUNT. Таким образом, в этом режиме частота таймера и прескалер не используются. Соответственно задача COUNT не имеет никакого эффекта в режиме таймера.
Максимальное значение TIMER конфигурируется изменением битовой ширины его счетчика в регистре BITMODE.
PRESCALER и BITMODE должны обновляться только когда таймер остановлен. Если эти регистры обновляются, когда TIMER запущен, то это может привести к непредсказуемому поведению.
Когда таймер при инкрементировании дошел до своего максимального значения, регистр счетчика переполнится, и TIMER будет автоматически считать, начиная с 0.
Регистр счетчика может быть очищен, т. е. его внутреннее значение явно установится в 0, путем активации задачи CLEAR.
В TIMER реализовано несколько регистров захвата/сравнения (capture/compare).
Независимо от настройки прескалера точность TIMER (разрешающая способность по времени) эквивалентна одному тику на частоте fTIMER, как показано на рис. 1.
Capture (захват). В TIMER реализована одна задача захвата для каждого из доступных регистров capture/compare (регистры CC[n]). Каждый раз, когда активируется задача CAPTURE[n], значение счетчика копируется в регистр CC[n].
Compare (сравнение). В TIMER реализовано по одному событию COMPARE на каждый из доступных регистров capture/compare (регистры CC[n]).
Событие COMPARE генерируется, когда счетчик инкрементируется, и после этого становится равным значению, которое находится в одном из регистров CC[n]. Когда значение счетчика становится равным значению в регистре CC[n], генерируется соответствующее событие COMPARE[n].
BITMODE задает, сколько бит в регистре счетчика и регистре CC используется, когда выполняется сравнение. Другие биты будут игнорироваться.
Задержки задачи. После того, как TIMER был запущен, задача CLEAR, задача COUNT и задача STOP гарантированно вступят в действие в пределах одного периода тактов частоты PCLK16M.
Приоритет задачи. Если задача START и задача STOP активировались одновременно, т. е. в одном и том же периоде тактов PCLK16M, то приоритет получит задача STOP.
[Регистры TIMER]
Таблица 1. Экземпляры TIMER.
Баз. адрес
Периф. устройство
Экз.
Описание
Конфигурация
0x40008000
TIMER
TIMER0
Таймер/счетчик 0
У этих таймеров 4 регистра CC (CC[0..3]).
0x40009000
TIMER1
Таймер/счетчик 1
0x4000A000
TIMER2
Таймер/счетчик 2
0x4001A000
TIMER3
Таймер/счетчик 3
У этих таймеров 6 регистров CC (CC[0..5]).
0x4001B000
TIMER4
Таймер/счетчик 4
Таблица 2. Обзор регистров TIMER.
Регистр
Смещ.
Описание
TASKS_START
0x000
Задача запуска таймера.
TASKS_STOP
0x004
Задача остановки таймера.
TASKS_COUNT
0x008
Задача инкремента таймера (только для режима счетчика, Counter mode).
TASKS_CLEAR
0x00C
Задача очистки таймера.
TASKS_SUTDOWN
0x010
Задача отключения таймера.
TASKS_CAPTURE[0]
0x040
Задача захвата значения счетчика таймера в регистр CC[0].
TASKS_CAPTURE[1]
0x044
Задача захвата значения счетчика таймера в регистр CC[1].
TASKS_CAPTURE[2]
0x048
Задача захвата значения счетчика таймера в регистр CC[2].
TASKS_CAPTURE[3]
0x04C
Задача захвата значения счетчика таймера в регистр CC[3].
TASKS_CAPTURE[4]
0x050
Задача захвата значения счетчика таймера в регистр CC[4].
TASKS_CAPTURE[5]
0x054
Задача захвата значения счетчика таймера в регистр CC[5].
EVENTS_COMPARE[0]
0x140
Событие совпадения сравнения счетчика и CC[0].
EVENTS_COMPARE[1]
0x144
Событие совпадения сравнения счетчика и CC[1].
EVENTS_COMPARE[2]
0x148
Событие совпадения сравнения счетчика и CC[2].
EVENTS_COMPARE[3]
0x14C
Событие совпадения сравнения счетчика и CC[3].
EVENTS_COMPARE[4]
0x150
Событие совпадения сравнения счетчика и CC[4].
EVENTS_COMPARE[5]
0x154
Событие совпадения сравнения счетчика и CC[5].
SHORTS
0x200
Регистр шортката.
INTENSET
0x304
Разрешение прерываний.
INTENCLR
0x308
Запрет прерываний.
MODE
0x504
Выбор режима работы таймера.
BITMODE
0x508
Конфигурирование количества бит, используемого таймером.
Смещение адреса: 0x304. Запись 1 разрешает соответствующее прерывание. Запись 0 не оказывает никакого влияния. Чтение показывает состояние прерывания: 0 прерывание запрещено, 1 разрешено.
Биты регистра INTENSET:
№ бита
31
30
29
28
27
26
25
24
23
22
21
20
19
18
17
16
15
14
13
12
11
10
9
8
7
6
5
4
3
2
1
0
Id
F
E
D
C
B
A
Reset 0x00000000
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
Назначение бит:
Id
RW
Поле
Описание
A
RW
COMPARE0
Разрешение прерывания для события COMPARE[0]. См. EVENTS_COMPARE[0].
B
RW
COMPARE1
Разрешение прерывания для события COMPARE[1]. См. EVENTS_COMPARE[1].
C
RW
COMPARE2
Разрешение прерывания для события COMPARE[2]. См. EVENTS_COMPARE[2].
D
RW
COMPARE3
Разрешение прерывания для события COMPARE[3]. См. EVENTS_COMPARE[3].
E
RW
COMPARE4
Разрешение прерывания для события COMPARE[4]. См. EVENTS_COMPARE[4].
F
RW
COMPARE5
Разрешение прерывания для события COMPARE[5]. См. EVENTS_COMPARE[5].
Смещение адреса: 0x308. Запись 1 запрещает соответствующее прерывание. Запись 0 не оказывает никакого влияния. Чтение показывает состояние прерывания: 0 прерывание запрещено, 1 разрешено.
Биты регистра INTENCLR:
№ бита
31
30
29
28
27
26
25
24
23
22
21
20
19
18
17
16
15
14
13
12
11
10
9
8
7
6
5
4
3
2
1
0
Id
F
E
D
C
B
A
Reset 0x00000000
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
Назначение бит:
Id
RW
Поле
Описание
A
RW
COMPARE0
Запрет прерывания для события COMPARE[0]. См. EVENTS_COMPARE[0].
B
RW
COMPARE1
Запрет прерывания для события COMPARE[1]. См. EVENTS_COMPARE[1].
C
RW
COMPARE2
Запрет прерывания для события COMPARE[2]. См. EVENTS_COMPARE[2].
D
RW
COMPARE3
Запрет прерывания для события COMPARE[3]. См. EVENTS_COMPARE[3].
E
RW
COMPARE4
Запрет прерывания для события COMPARE[4]. См. EVENTS_COMPARE[4].
F
RW
COMPARE5
Запрет прерывания для события COMPARE[5]. См. EVENTS_COMPARE[5].
0, Timer: работа в режиме таймера. 1, Counter: работа в режиме счетчика событий, устарело. 2, LowPowerCounter: выбор режима счетчика с пониженным энергопотреблением.