Модуль счетчика реального времени (Real-time counter, RTC) предоставляет традиционный, экономичный таймер, работающий на низкой частоте тактов (LFCLK).
Рис. 1. Блок-схема RTC.
Модуль RTC содержит 24-разрядный счетчик COUNTER, 12-разрядный (1/X) прескалер, регистры захвата/сравнения (capture/compare) и генератор событий тика для энергоэффективной реализации поведения ОСРВ (tickless RTOS).
Поскольку RTC работает от LFCLK (т. е. 32.768 кГц), то разрешающая способность COUNTER получается 1/32768 = 30.517 мкс. В зависимости от источника, RTC может работать, когда генератор HFCLK выключен, и недоступен PCLK16M. Перед использованием RTC программа должна явно запустить генератор LFCLK. Подробнее про источники тактирования см. [2].
Когда RTC остановлен, регистр PRESCALER доступен на чтение/запись. Когда RTC запущен (была выполнена задача START), PRESCALER доступен только на чтение. Запись в регистр PRESCALER, когда RTC запущен, не дает никакого эффекта.
PRESCALER перезапускается на задачах START, CLEAR и TRIGOVRFLW, т. к. на этих задачах значение прескалера фиксируется во внутреннем регистре (<< PRESC >>).
Пример 1. Нужна частота счета COUNTER 100 Гц (период между отсчетами 10 мс)
PRESCALER = round(32768 / 100) - 1 = 327
fRTC = 99.9 Гц, период между отсчетами 10009.576 мкс.
Пример 2. Нужна частота счета COUNTER 8 Гц (период между отсчетами 125 мс)
PRESCALER = round(32768 / 8 Hz) – 1 = 4095
fRTC = 8 Гц, период между отсчетами 125 мс.
Таблица 1. Примеры разрешающей способности (интервал тика) и интервала переполнения RTC.
Прескалер
Интервал тика
Переполнение
0
30.517 мкс
512 секунд
28 - 1
7812.5 мкс
131072 секунд
212 - 1
125 мс
582.542 часа
Регистр COUNTER. Это счетчик, который инкрементируется с частотой LFCLK, когда внутренний регистр PRESCALER (<< PRESC >>) равен 0x00. << PRESC >> перезагружается из регистра PRESCALER. Если разрешено, то событие TICK происходит на каждом инкременте COUNTER. По умолчанию событие TICK запрещено.
Рис. 2. Диаграмма времени COUNTER_PRESCALER_0.
Рис. 3. Диаграмма времени COUNTER_PRESCALER_1.
Событие переполнения (OVRFLW). Задача TRIGOVRFLW установит значение COUNTER в 0xFFFFF0, чтобы можно было программно протестировать состояние переполнения. Произойдет событие OVRFLW, когда COUNTER переполнится, т. е. его значение поменяется с 0xFFFFFF на 0.
Замечание: событие OVRFLW по умолчанию запрещено.
Событие тика (TICK). TICK event позволяет реализовать энергоэффективную "tick-less" схему поведения RTOS, поскольку обеспечивается регулярно срабатывающий источник прерывания для RTOS без необходимости использовать функцию ARM® SysTick.
Использование события тика RTC вместо SysTick позволяет CPU выключаться, сохраняя при активность планировщика RTOS.
Замечание: событие TICK по умолчанию запрещено.
Управление событиями. Для оптимизации энергопотребления RTC, события RTC можно запрещать индивидуально, чтобы предотвратить запросы PCLK16M и HFCLK, когда срабатывают события. Разрешение/запрет событий управляется регистром EVTEN.
Например, если событие TICK для приложения не требуется, то это событие должно быть запрещено, поскольку оно происходит часто, и может увеличить потребление энергии, если иначе генератор HFCLK может быть выключен на долгий период времени.
Это означает, что RTC реализует несколько другую подсистему задач и событий (task и event) по сравнению со стандартной системой, описанной для интерфейса периферийного устройства [3]. RTC task и event system показана на рис. 4.
Рис. 4. Система задач (tasks), событий (events) и прерываний (interrupts) в RTC.
Функция Compare. Имеется несколько регистров сравнения CC, см. далее раздел "Регистры RTC".
Когда установлен регистр сравнения, наблюдается следующее поведение события сравнения (compare event) RTC:
• Если значение регистра CC равно 0, когда установлена задача CLEAR, то событие COMPARE не произойдет, см. рис. 5. • Если значение регистра CC равно N, и значение COUNTER равно N, когда установлена задача CLEAR, то событие COMPARE не произойдет, см. рис. 6. • Событие COMPARE произойдет, когда CC = N, и значение COUNTER перешло от N-1 к N (произошло совпадение регистров CC и COUNTER), см. рис. 7. • Если COUNTER = N, то запись N+2 в регистр CC гарантированно вызовет событие COMPARE в момент COUNTER = N+2, см. рис. 8. • Если COUNTER = N, то запись N или N+1 в регистр CC может не вызвать событие COMPARE, см. рис. 9. • Если COUNTER = N, и текущее значение регистра CC равно N+1 или N+2, когда записано новое значение CC, может сработать совпадение на предыдущем значении CC до того, как новое значение CC вступит в действие. Если текущее значение CC больше N+2, то запишется новое значение, и по старому значению CC срабатывание события совпадения не произойдет. См. рис. 10.
Рис. 5. Диаграмма времени COMPARE_CLEAR.
Рис. 6. Диаграмма времени COMPARE_START.
Рис. 7. Диаграмма времени COMPARE.
Рис. 8. Диаграмма времени COMPARE_N+2.
Рис. 9. Диаграмма времени COMPARE_N+1.
Рис. 10. Диаграмма времени COMPARE_N-1.
[Джиттер/задержка TASK и EVENT]
Существует джиттер или задержка синхронизации задач и событий RTC с другими периферийными устройствами, потому что они работают на повышенной частоте тактов PCLK16M, не синхронной с низкой частотой тактов (LFCLK).
Регистры интерфейса периферийных устройств [3], участники домена тактов PCLK16M, снабжены набором зеркальных регистров в домене тактов LFCLK. Например, значение COUNTER, доступное со стороны CPU, находится в домене PCLK16M, и при чтении защелкивается из внутреннего регистра с именем COUNTER, но находящегося в домене LFCLK. Этот COUNTER как раз тот регистр, который в действительности модифицируется на каждом тике RTC. Таким образом, эти две копии регистров должны быть синхронизированы между доменами тактов (PCLK16M и LFCLK).
Таблица 2. Величина джиттера RTC, влияющего на запуск задач.
Задача (task)
Задержка
CLEAR, STOP, START, TRIGOVRFLOW
+15 .. +45 мкс
Таблица 3. Величина джиттера RTC, влияющего на срабатывание событий.
Операция / функция
Джиттер
От START до инкремента COUNTER
±15 мкс
От COMPARE до COMPARE(1)
±62.5 нс
Примечание (1): подразумевается, что RTC постоянно считает между этими событиями. К приведенным значениям добавляется джиттер тактов 32.768 кГц.
Ниже приводится краткое описание джиттера, который существует на срабатывание задач и событий RTC, с поясняющими рисунками.
1. Задачи CLEAR и STOP (и TRIGOVRFLW, что на рис. 11 не показано) будут задержаны до момента, пока периферийное устройство не засинхронизирует свой спад тактов с фронтом LFCLK. Эта задержка будет в интервале между 15.2585 мкс и 45.7755 мкс, что в последующем описании будет для упрощения округлено до 15 мкс и 46 мкс.
Рис. 11. Диаграмма времени DELAY_CLEAR.
Рис. 12. Диаграмма времени DELAY_STOP.
2. Задача START запустит RTC. Если предположить, что такты LFCLK уже запущены и стабильны, то первый инкремент COUNTER (и событие TICK) произойдут после 30.5 +/-15 мкс. В некоторых случаях, в частности если RTC запущен задачей START перед тем, как запустились такты LFCLK, это время может быть порядка ~250 мкс. Поэтому программа должна подождать первого TICK, если необходимо обеспечить рабочее состояние RTC. Отправка задачи TRIGOVRFLW установит значение COUNTER, близкое к переполнению. Однако, поскольку момент обновления COUNTER зависит от стабильности частоты LFCLK, отправка этой задачи, когда такты LFCLK не запустились, запустит LFCLK, но обновление будет задержано на ту же величину времени до ~250 мкс. Рисунки ниже показывают самую маленькую и самую большую задержки задачи START, которая появляется с джиттером +/-15 мкс для первого инкремента COUNTER.
Рис. 13. Диаграмма времени JITTER_START-.
Рис. 14. Диаграмма времени JITTER_START+.
[Чтение регистра COUNTER]
Для чтения регистра COUNTER выполняется захват внутреннего значения << COUNTER >>.
Для гарантии, что << COUNTER >> безопасно захвачен (при чтении может произойти перепад LFCLK), CPU и шина ядра памяти приостанавливаются на 3 такта путем перевода в 0 сигнала готовности ядра (core PREADY). Чтение займет дополнительно 2 такта CPU, так что получится, что чтение COUNTER по длительности займет фиксированные 5 тактов PCLK16M.
Рис. 15. Диаграмма времени COUNTER_READ.
[Регистры RTC]
Таблица 4. Экземпляры RTC.
Баз. адрес
Периф. устройство
Экз.
Описание
Конфигурация
0x4000B000
RTC
RTC0
Счетчик реального времени 0
CC[0..2] реализованы, CC[3] не реализован
0x40011000
RTC1
Счетчик реального времени 1
Реализованы CC[0..3]
0x40024000
RTC2
Счетчик реального времени 2
Таблица 5. Обзор регистров RTC.
Регистр
Смещ.
Описание
TASKS_START
0x000
Старт RTC COUNTER.
TASKS_STOP
0x004
Стоп RTC COUNTER.
TASKS_CLEAR
0x008
Очистка RTC COUNTER.
TASKS_TRIGOVRFLW
0x00C
Установка COUNTER в значение 0xFFFFF0.
EVENTS_TICK
0x100
Событие инкремента COUNTER.
EVENTS_OVRFLV
0x104
Событие переполнения COUNTER.
EVENTS_COMPARE[0]
0x140
Событие совпадения сравнения счетчика и CC[0].
EVENTS_COMPARE[1]
0x144
Событие совпадения сравнения счетчика и CC[1].
EVENTS_COMPARE[2]
0x148
Событие совпадения сравнения счетчика и CC[2].
EVENTS_COMPARE[3]
0x14C
Событие совпадения сравнения счетчика и CC[3].
INTENSET
0x304
Разрешение прерываний.
INTENCLR
0x308
Запрет прерываний.
EVTEN
0x340
Разрешение или запрет маршрутизации событий.
EVTENSET
0x344
Разрешение маршрутизации событий.
EVTENCLR
0x348
Запрет маршрутизации событий.
COUNTER
0x504
Текущее значение счетчика.
PRESCALER
0x508
12-разрядный предделитель для частоты тактов счетчика (32768/(PRESCALER+1)). Должен записываться только при остановке счетчика.
Смещение адреса: 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
TICK
Разрешение прерывания для события TICK. См. EVENTS_TICK.
B
RW
OVRFLW
Разрешение прерывания для события переполнения. См. EVENTS_OVRFLW.
C
RW
COMPARE0
Разрешение прерывания для события совпадения COMPARE[0]. См. EVENTS_COMPARE[0].
D
RW
COMPARE1
Разрешение прерывания для события совпадения COMPARE[1]. См. EVENTS_COMPARE[1].
E
RW
COMPARE2
Разрешение прерывания для события совпадения COMPARE[2]. См. EVENTS_COMPARE[2].
F
RW
COMPARE3
Разрешение прерывания для события совпадения COMPARE[3]. См. EVENTS_COMPARE[3].
Смещение адреса: 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
TICK
Запрет прерывания для события TICK. См. EVENTS_TICK.
B
RW
OVRFLW
Запрет прерывания для события переполнения. См. EVENTS_OVRFLW.
C
RW
COMPARE0
Запрет прерывания для события совпадения COMPARE[0]. См. EVENTS_COMPARE[0].
D
RW
COMPARE1
Запрет прерывания для события совпадения COMPARE[1]. См. EVENTS_COMPARE[1].
E
RW
COMPARE2
Запрет прерывания для события совпадения COMPARE[2]. См. EVENTS_COMPARE[2].
F
RW
COMPARE3
Запрет прерывания для события совпадения COMPARE[3]. См. EVENTS_COMPARE[3].
Смещение адреса: 0x344. Запись 1 разрешает маршрутизацию соответствующего события. Запись 0 не оказывает никакого влияния. Чтение показывает состояние: 0 маршрутизация события запрещена, 1 разрешена.
Биты регистра EVTENSET:
№ бита
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
TICK
Разрешение маршрутизации события TICK. См. EVENTS_TICK.
B
RW
OVRFLW
Разрешение маршрутизации события переполнения. См. EVENTS_OVRFLW.
C
RW
COMPARE0
Разрешение маршрутизации события совпадения COMPARE[0]. См. EVENTS_COMPARE[0].
D
RW
COMPARE1
Разрешение маршрутизации события совпадения COMPARE[1]. См. EVENTS_COMPARE[1].
E
RW
COMPARE2
Разрешение маршрутизации события совпадения COMPARE[2]. См. EVENTS_COMPARE[2].
F
RW
COMPARE3
Разрешение маршрутизации события совпадения COMPARE[3]. См. EVENTS_COMPARE[3].
Смещение адреса: 0x348. Запись 1 запрещает маршрутизацию соответствующего события. Запись 0 не оказывает никакого влияния. Чтение показывает состояние: 0 маршрутизация события запрещена, 1 разрешена.
Биты регистра EVTENCLR:
№ бита
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
TICK
Запрет маршрутизации события TICK. См. EVENTS_TICK.
B
RW
OVRFLW
Запрет маршрутизации события переполнения. См. EVENTS_OVRFLW.
C
RW
COMPARE0
Запрет маршрутизации события совпадения COMPARE[0]. См. EVENTS_COMPARE[0].
D
RW
COMPARE1
Запрет маршрутизации события совпадения COMPARE[1]. См. EVENTS_COMPARE[1].
E
RW
COMPARE2
Запрет маршрутизации события совпадения COMPARE[2]. См. EVENTS_COMPARE[2].
F
RW
COMPARE3
Запрет маршрутизации события совпадения COMPARE[3]. См. EVENTS_COMPARE[3].
Смещение адреса: 0x508. 12-разрядный прескалер для частоты тактов COUNTER (частота тактов равна 32768 / (PRESCALER+1) Гц). Этот регистр должен записываться только когда счетчик остановлен.