Программирование ARM nRF52: счетчик реального времени RTC Thu, April 18 2024  

Поделиться

Нашли опечатку?

Пожалуйста, сообщите об этом - просто выделите ошибочное слово или фразу и нажмите Shift Enter.

nRF52: счетчик реального времени RTC Печать
Добавил(а) microsin   

Модуль счетчика реального времени (Real-time counter, RTC) предоставляет традиционный, экономичный таймер, работающий на низкой частоте тактов (LFCLK).

nRF52 RTC block diagram fig01

Рис. 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].

Разрешающая способность, переполнение счетчика. Частота инкремента COUNTER равна:

fRTC [кГц] = 32.768 / (PRESCALER + 1 )

Когда 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 запрещено.

nRF52 RTC timing COUNTER PRESCALER 0 fig02

Рис. 2. Диаграмма времени COUNTER_PRESCALER_0.

nRF52 RTC timing COUNTER PRESCALER 1 fig03

Рис. 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.

nRF52 RTC tasks events interrupts fig04

Рис. 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.

nRF52 RTC timing COMPARE CLEAR fig05

Рис. 5. Диаграмма времени COMPARE_CLEAR.

nRF52 RTC timing COMPARE START fig06

Рис. 6. Диаграмма времени COMPARE_START.

nRF52 RTC timing COMPARE fig07

Рис. 7. Диаграмма времени COMPARE.

nRF52 RTC timing COMPARE N plus 2 fig08

Рис. 8. Диаграмма времени COMPARE_N+2.

nRF52 RTC timing COMPARE N plus 1 fig09

Рис. 9. Диаграмма времени COMPARE_N+1.

nRF52 RTC timing COMPARE N minus 1 fig10

Рис. 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 мкс.

nRF52 RTC timing DELAY CLEAR fig11

Рис. 11. Диаграмма времени DELAY_CLEAR.

nRF52 RTC timing DELAY STOP fig12

Рис. 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.

nRF52 RTC timing JITTER START minus fig13

Рис. 13. Диаграмма времени JITTER_START-.

nRF52 RTC timing JITTER START plus fig14

Рис. 14. Диаграмма времени JITTER_START+.

[Чтение регистра COUNTER]

Для чтения регистра COUNTER выполняется захват внутреннего значения << COUNTER >>.

Для гарантии, что << COUNTER >> безопасно захвачен (при чтении может произойти перепад LFCLK), CPU и шина ядра памяти приостанавливаются на 3 такта путем перевода в 0 сигнала готовности ядра (core PREADY). Чтение займет дополнительно 2 такта CPU, так что получится, что чтение COUNTER по длительности займет фиксированные 5 тактов PCLK16M.

nRF52 RTC timing COUNTER READ fig15

Рис. 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)). Должен записываться только при остановке счетчика.
CC[0] 0x540 Регистр сравнения 0.
CC[1] 0x544 Регистр сравнения 1.
CC[2] 0x548 Регистр сравнения 2.
CC[3] 0x54C Регистр сравнения 3.

Смещение адреса: 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].

Смещение адреса: 0x340. Запись 1 разрешает маршрутизацию соответствующего события, запись 0 запрещает. Чтение показывает состояние: 0 маршрутизация события запрещена, 1 разрешена.

Биты регистра EVTEN:

№ бита 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].

Смещение адреса: 0x504. Текущее значение счетчика.

Биты регистра COUNTER:

№ бита 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                 A A A A A A A A A A A A A A A A A A A A A A A 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 R COUNTER Значение счетчика.

Смещение адреса: 0x508. 12-разрядный прескалер для частоты тактов COUNTER (частота тактов равна 32768 / (PRESCALER+1) Гц). Этот регистр должен записываться только когда счетчик остановлен.

Биты регистра PRESCALER:

№ бита 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                                         A A A A A A A A A A A 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 PRESCALER Значение прескалера.

Смещение адреса: 0x540 + 4*x, где x = 0 .. 3.

Биты регистра CC[x]:

№ бита 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                 A A A A A A A A A A A A A A A A A A A A A A A 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 COMPARE Значение для сравнения со счетчиком.

[Электрические параметры RTC]

Символ Описание min Typ MAX Ед.
IRTC Ток потребления в рабочем режиме (источник тактирования LFCLK)   0.1   мкА

[Ссылки]

1. RTC Real-time counter nRF52832 site:nordicsemi.com.
2. CLOCK Clock control nRF52832 site:nordicsemi.com.
3. nRF52: интерфейс периферийного устройства.
4nRF52 TIMER.

 

Добавить комментарий


Защитный код
Обновить

Top of Page