В процессор BlackfinADSP-BF538 встроен аппаратный узел часов реального времени (real-time clock, RTC). Он предоставляет функции цифровых часов, такие как время дня, будильник, обратный отсчет времени. Обычно блок RTC используется в системе либо просто как часы (например для поддержки файловой системы), либо как счетчик времени жизни устройства.
Часы RTC тактируются от внешнего кварца с частотой 32.768 кГц. Также RTC использует отдельный источник питания (маломощная батарейка), для чего есть отдельные выводы на корпусе процессора. На RTC не влияет никакой сброс, что позволяет сохранить правильный отсчет времени, даже когда остальная часть процессора сбрасывается, перезагружается или даже у неё выключается питание.
Тактовый вход RTC делится прескалером до частоты 1 Гц, однако прескалер можно пропустить, т. е. выключить деление частоты. Когда делитель частоты отключен, RTC получает такты с частотой 32.768 кГц. В нормальной ситуации прескалер разрешен, и RTC тактируется от частоты 1 Гц.
Основная функция RTC - поддерживать точный отсчет дней и времени дня. Это осуществляется с помощью 4 счетчиков:
• Счетчик секунд (считает в диапазоне 0..59). • Счетчик минут (считает в диапазоне 0..59). • Счетчик часов (считает в диапазоне 0..23). • Счетчик дней (считает в диапазоне 0..32767).
60-секундный счетчик инкрементируется каждую секунду, и по его переполнению соответственно будут инкрементироваться остальные счетчики. 32768-дневной счетчик инкрементируется каждые сутки в полночь (0 часов, 0 минут, 0 секунд). Могут быть настроены периодические прерывания - либо каждую секунду, либо каждую минуту, либо каждый час, либо каждые сутки. Каждое из этих прерываний управляется индивидуально.
RTC предоставляет две функции будильника, программируемые через регистр будильника (RTC alarm register, RTC_ALARM). Первая функция это обычный будильник, настраиваемый на определенное время суток (time of day alarm) - час, минута и секунда. Когда настроено прерывание будильника, то RTC будет генерировать прерывание каждые сутки в указанное время. Вторая функция будильника позволяет приложению указать не только время, но и день, когда будильник сработает. Прерывания каждой из этих двух функций будильника можно разрешить и запретить независимо друг от друга.
В RTC также есть функция обратного отсчета времени (stopwatch). Приложение может запрограммировать счетчик секунд в регистре RTC stopwatch count (RTC_SWCNT). Когда разрешено прерывание stopwatch, и истекло указанное количество секунд, RTC генерирует прерывание.
[Интерфейс]
Внешний интерфейс RTC состоит из двух выводов тактов, предназначенных для подключения кварцевого резонатора, корректирующих конденсаторов и одного резистора на 10 МОм. Эти выводы предназначены для формирования тактовой частоты RTC. Внутренний интерфейс, через который RTC подключен к процессору, это шина периферийных устройств (peripheral access bus, PAB), и интерфейс прерываний, связанный с системными контроллерами прерываний SICx [2].
Примечание: без резистора R1 на 10 МОм генератор RTC не запускается. Кроме того, резистор меньшего номинала ставить нельзя. У меня не было такого резистора, поэтому попробовал поставить резистор на 1 МОм, и генератор RTC начал работать с частотой в несколько раз больше. Также следует иметь в виду, что батарейка с резистором меньшего номинала быстрее разрядится. Например, от батарейки 3.09V ток потребления с резистоом 10 МОм составляет 12.3 мкА, а с резистором 1 МОм 43 мкА.
У RTC есть выделенный вывод питания, который делает возможным непрерывное питание RTC от отдельного маломощного источника (литиевой батарейки 3V). Это обеспечивает стабильную работу часов, когда основное питание ядра (VDDINT и VDDEXT) выключается.
Рис. 17-1. Блок-схема RTC.
Независимое тактирование RTC. Как уже упоминалось, у RTC есть свой источник тактов, для которого обычно используют кварц 32768 Гц. Системные регистры RTC (memory-mapped register, MMR) тактируются от этого кварца. Если прескалер разрешен, то регистры MMR RTC тактируются с частотой 1 Гц, а если запрещен, то с частотой 32768 Гц.
Нет никакого способа программно запретить счетчики RTC. Если система не требует функционала RTC, то это можно запретить только аппаратно. Подключите вывод RTXI к GND, вывод RTCVDD к VDDEXT, и оставьте вывод RTXO не подключенным.
[Программирование]
Модель программирования RTC заключается в установке и чтении значений MMR. Программа может конфигурировать RTC, и может определять состояние RTC с помощью записи и чтения этих регистров. Регистр управления прерываниями RTC (RTC_ICTL) и регистр состояния прерываний RTC (RTC_ISTAT) предоставляет возможность обслуживания прерываний RTC.
Обратите внимание, что ПО процессора не может запретить функцию счета RTC. Однако все прерывания RTC можно запретить (маскировать). В момент сброса все прерывания запрещаются. Состояние RTC можно прочитать в любой момент через регистры MMR.
Основная функциональность часов реального времени, показанная на рис. 17-1, состоит из регистров и счетчиков, которые получают независимое питание от вывода VDDRTC. Эта логика никогда не сбрасывается; при первой подаче питания на VDDRTC логика RTC переходит в неопределенное состояние.
Примечание: номинальное напряжение для VDDRTC составляет 3.3V. Допустимый по даташиту ADSP-BF538 диапазон VDDRTC от 2.25V до 3.6V. Однако на практике часы работают даже от разряженной батарейки с напряжением 1.4V.
RTC также содержит согласующую логику, которая получает то же самое питание, что и процессорное ядро и его периферийные устройства (VDDINT и VDDEXT). Эта логика содержит некоторый управляющий функционал - здесь содержатся регистры для записи данных через PAB, а также буферные регистры, предназначенные для чтения регистров RTC, которые питаются от VDDRTC. Эта логика сбрасывается тем же самым системным сбросом, что и процессор, и тактируется теми же тактами SCLK, что и другие периферийные устройства.
Рис. 17-2 показывает соединения между регистрами RTC, получающими питание от VDDRTC, и соответствующими им регистрами MMR, которые питаются от напряжений ядра и периферии. На этом рисунке REG означает каждый из регистров RTC_STAT, RTC_ALARM, RTC_SWCNT, RTC_ICTL и RTC_PREN. Регистр RTC_ISTAT подключен только к PAB.
Рис. 17-2. Регистровая архитектура RTC.
Фронт нарастания частоты тактов 1 Гц RTC называется тиком "1 Hz tick". Программа может синхронизироваться с этим тиком путем ожидания установки флага события секунды, или путем обработки прерывания секунд (если это прерывание разрешено).
Запись в регистры. Запись во все регистры MMR RTC, кроме регистра состояния прерываний RTC (RTC_ISTAT), сохраняются в специальные регистры удержания записи, и затем синхронизируются с частотой RTC 1 Гц. Бит ожидающей записи (pending status bit) в регистре RTC_ISTAT показывает активный процесс записи. Бит ожидающей записи установится, когда была инициирована запись, и очистится, когда все записи завершены. Момент установки в 0 бита ожидающей записи приводит к установке флага завершения записи в регистре RTC_ISTAT. Этот флаг может быть сконфигурирован в RTC_ICTL для генерации прерывания. Программа не должна ждать завершения записи в один MMR RTC, чтобы после этого начать запись в другой MMR MMR. Бит ожидающей записи установится, если запрограммирована запись в любые несколько регистров, и флаг завершения записи установится только тогда, когда завершатся все записи MMR RTC.
Когда периферийные устройства сброшены, любые ожидающие завершения записи отменяются. Не останавливайте SCLK (не входите в режим глубокого сна deep sleep mode) и также не отключайте питание, пока не завершатся все записи в регистры RTC.
Не пытайтесь делать повторные записи в один и тот же регистр без ожидания завершения предыдущей записи. Повторные записи в тот же регистр будут игнорироваться, если предыдущая запись не была полностью завершена.
Чтение регистра, который был записан, до завершения записи вернет старое значение, которое было до записи. Всегда проверяйте бит ожидающей записи перед попыткой чтения или записи.
Латентность записи. Операции записи в MMR RTC синхронизируются с частотой тактов 1 Гц RTC. При установке времени дня не учитывается фактор задержки записи MMR RTC. Самый точный метод установки часов - отслеживать изменения секунд (которые происходят с частотой 1 Гц) опросом флага события секунд в регистре состояния (RTC_STAT), или программированием прерывания на это событие и обработки его в ISR. Новое значение вставляется с учетом инкремента секунд. Аппаратура добавит одну секунду в записываемое значение (инкремент автоматически перенесется в счетчики минут, часов и дней), и загрузит инкрементированное значение на следующем тике 1 Гц.
Записи, осуществляемые в любой момент времени, будут корректно синхронизированы с частотой тактов 1 Гц RTC. Записи завершаются на фронте нарастания уровня тактов 1 Гц RTC. Запись, которая осуществилась непосредственно перед тиком 1 Гц, может не завершиться на этом тике, и может сработать на секунду позже. Любая запись, которая выполнена через 990 мс после тика 1 Гц, будет завершена на следующем тике 1 Гц. Однако рекомендуется простейшая, наиболее предсказуемая по поведению техника записи - запись в RTC_STAT, RTC_ALARM, RTC_SWCNT, RTC_ICTL или RTC_PREN должна выполняться немедленно после прерывания или события изменения секунд. Все эти 5 регистров могут быть записаны в одну и ту же секунду. Биты W1C (W1C означает write-1-to-clear, т. е. для сброса бита надо записать в его единицу) в регистре RTC_ISTAT немедленно отразят состояние RTC.
Чтение регистров. При чтении MMR RTC нет задержки, поскольку значения поступают из буферных согласующих регистров. Эти согласующие регистры обновляются и готовы для чтения нового значения на любом прерывании RTC, или когда устанавливаются флаги события секунд. Как только внутренняя логика VDD завершает последовательность инициализации после того, как запускаются такты SCLK, нет никакого момента времени, когда нельзя безопасно прочитать MMR RTC с целью синхронизации. Чтение всегда вернет когерентные текущие значения, хотя эти значения могут быть в некоторых случаях не определенными.
Deep Sleep. Когда контроллер управления питанием (dynamic power management controller, DPMC [3]) находится в состоянии глубокого сна (deep sleep), все такты системы (кроме RTXI и тика 1 Гц RTC) останавливаются. В этом состоянии счетчики, получающие питание от VDDRTC, продолжают инкрементироваться. Внутренние буферные согласующие регистры не обновляются, и при этом они не могут быть прочитаны.
В состоянии глубокого сна (deep sleep) все биты RTC_ISTAT очищаются. События, которые произошли во время глубокого сна, не будут записаны RTC_ISTAT. Внутренняя логика, питающаяся от VDDRTC, генерирует виртуальный 1 Гц тик каждый период RTXI (30.52 мкс) после того, как снова стартуют такты SCLK. Это загрузит все буферные согласующие регистры свежими значениями, и установит флаг события секунд. Могут также установиться и другие флаги событий. Когда система выходит из глубокого сна - либо по событию RTC, либо по аппаратному сбросу, либо от прерывания NMI - все события RTC, которые произошли в течение этой секунды (и только этой секунды), будут отражены в RTC_ISTAT.
Когда система просыпается и выходит из состояния deep sleep, программе не нужно очистить операцией W1C биты в RTC_ISTAT. Все W1C-биты уже были очищены аппаратно. Флаг события секунды установится, когда внутренняя логика VDDRTC завершит свою последовательность перезапуска. Программа должна ждать момента, когда установится флаг события секунд, и после этого она может начинать операции чтения или записи любого регистра RTC.
Разрешение работы прескалера. Один активный бит регистра разрешения прескалера RTC (prescaler enable register, RTC_PREN) записывается с использованием пути синхронизации. Очистка этого бита синхронизирована с частотой тактов 32.768 кГц. Эта ускоренная синхронизация позволяет перевести модуль RTC в режим тактирования на высокой частоте (high-speed mode, когда прескалер пропускается, входная частота напрямую проходит на его выход без деления) без ожидания полной секунды для завершения записи. Это может понадобиться, когда модуль уже работает с разрешенным прескалером.
Когда устанавливается бит RTC_PREN, первый положительный перепад тактов 1 Гц произойдет на 1 или 2 такта частоты 32.768 кГц после разрешения прескалера. Статус завершения записи/прерывания работает как обычно, когда счетчик прескалера разрешается или запрещается. Новая частота тактов RTC вступает в действие перед тем, как установится бит завершения записи.
Флаги событий.
Неизвестные значения регистров во время включения питания могут привести к установке флагов событий до того, как в эти регистры запишутся корректные значения. Путем захвата перепада тактов 1 Гц запись в RTC_STAT может произойти перед записью в RTC_ALARM. Это вызвало бы дополнительную секунду задержки перед тем, как станут достоверными (актуальными) RTC_STAT и RTC_ALARM, если значение RTC_ALARM при выходе из сброса такое же, как значение, записанное в RTC_STAT. Подождите завершения записи в эти регистры перед использованием флагов и прерываний, связанных с их значениями.
Ниже представлен список флагов и условия, при которых эти флаги достоверны:
• Флаг события секунды (1 Гц). Всегда установится на положительном перепаде тактов 1 Гц, и после того как обновятся буферные согласующие регистры при выходе из deep sleep. Флаг достоверен, пока активна частота тактов RTC 1 Гц. Используйте этот флаг или его прерывание для проверки других флагов. • Флаг завершения записи. Достоверен всегда. • Флаг ожидания завершения записи. Достоверен всегда. • Флаг событий минуты. Достоверен только после того, как станет достоверным поле секунд в RTC_STAT. Используйте флаг завершения записи и флаг ожидания завершения записи, или прерывания, чтобы проверить значение RTC_STAT перед тем использованием значения этого флага или разрешением прерывания. • Флаг событий часа. Достоверен только после того, как станет достоверным поле минут в RTC_STAT. Используйте флаг завершения записи и флаг ожидания завершения записи, или прерывания, чтобы проверить значение RTC_STAT перед тем использованием значения этого флага или разрешением прерывания. • Флаг суток (истечения 24 часов). Достоверен только после того, как станет достоверным поле часов в RTC_STAT. Используйте флаг завершения записи и флаг ожидания завершения записи, или прерывания, чтобы проверить значение RTC_STAT перед тем использованием значения этого флага или разрешением прерывания. • Флаг события обратного отсчета секунд. Достоверен только после того, как станет достоверным значение регистра RTC_SWCNT. Используйте флаг завершения записи и флаг ожидания завершения записи, или прерывания, чтобы проверить значение RTC_SWCNT перед тем использованием значения этого флага или разрешением прерывания. • Флаг события обычного будильника. Достоверен только после того, как станут достоверными регистры RTC_STAT и RTC_ALARM. Используйте флаг завершения записи и флаг ожидания завершения записи, или прерывания, чтобы проверить значение RTC_STAT и RTC_ALARM перед тем использованием значения этого флага или разрешением его прерывания. • Флаг события будильника с учетом дня. То же самое, что и у обычного будильника.
Записи, которые осуществляются в начале той же секунды, вступят в действие на следующем тике 1 Гц. Ниже показана безопасная последовательность действий, которая не приводит к случайным прерываниям, связанным с предыдущим состоянием.
1. Подождите момента возникновения тика 1 Гц (по флагу события секунды или по его прерыванию). 2. Запишите единички в флаги RTC_ISTAT для будильников, обратного отсчета времени и/или интервала. 3. Запишите новые значения для RTC_STAT, RTC_ALARM и/или RTC_SWCNT. 4. Запишите новое значение для RTC_ICTL с разрешенными прерываниями будильников, обратного отсчета времени и/или интервалов. 5. Подождите возникновения тика 1 Гц. 6. После этого новые значения немедленно войдут в действие.
Прерывания. RTC может предоставить прерывания в некоторых программируемых интервалах, включая:
• Каждую секунду. • Каждую минуту. • Каждый час. • Каждые сутки. • Когда считающий вниз секундный счетчик достигнет 0. • В определенное время суток (будильник). • В определенный день и время (будильник с учетом дня).
RTC может быть запрограммирован для предоставления прерывания по завершению всех ожидающих записей в любые из 1 Гц регистров (RTC_STAT, RTC_ALARM, RTC_SWCNT, RTC_ICTL и RTC_PREN). Прерывания можно индивидуально разрешить или запретить с помощью регистра управления прерываниями RTC (RTC_ICTL). Состояние прерываний можно определить путем чтения регистра состояния RTC (RTC_ISTAT).
Прерывание RTC устанавливается всякий раз при захвате события в регистр RTC_ISTAT, когда прерывание разрешено регистром RTC_ICTL. Ожидающее прерывание RTC очищается каждый раз, когда все разрешенные и установленные биты RTC_ISTAT очищаются, или когда очищаются все соответствующие биты ожидающих событий RTC_ICTL.
Как показано на рис. 17-3, RTC генерирует для ядра процессора запрос на прерывание (IRQ), чтобы прерывание было обработано, и для его вывода из состояния сна. RTC генерирует отдельный сигнал пробуждения из режима глубокого сна (deep sleep) или состояния выключения внутреннего питания. Сигнал вывода из deep sleep (сигнал пробуждения) выставляется на тике 1 Гц, когда произойдет любое разрешенное в регистре RTC_ICTL событие интервала RTC. Выставленный сигнал пробуждения приводит к перезапуску тактовой частоты процессора (CCLK) и системной тактовой частоты (SCLK, тактирование периферийных устройств). Любое разрешенное событие, которое выставляет сигнал пробуждения, также приводит к выставлению запроса RTC IRQ, как только перезапустится SCLK.
Рис. 17-3. Структура прерываний RTC.
[Регистры RTC]
Ниже приведена таблица MMR-адресов регистров RTC и их краткое описание. Во врезках регистры описаны более подробно.
Регистр
MMR-адрес
Функция
Значение после сброса(1)
RTC_STAT
0xFFC00300
Значение счетчиков времени и даты
Не определено
RTC_ICTL
0xFFC00304
Управление прерываниями от RTC
b000000000xxxxxx
RTC_ISTAT
0xFFC00308
Состояние событий RTC (флаги прерываний)
Все биты равны 0
RTC_SWCNT
0xFFC0030C
Регистр счетчика обратного отсчета
Не определено
RTC_ALARM
0xFFC00310
Регистр установки будильников
Не определено
RTC_PREN
0xFFC00314
Регистр разрешения работы прескалера
b000000000000000x
Примечание (1): x означает неопределенное состояние бита после сброса.
Регистр состояния RTC (RTC_STAT), показанный на рис. 17-4, используется для чтения или записи текущего времени. Чтение вернет 32-битное значение, которое отражает текущее состояние счетчиков дней, часов, минут, секунд. Чтения и записи должны осуществляться как 32-битные транзакции; попытка 16-битных транзакций приведет к ошибке MMR. Чтения всегда возвратят когерентное 32-битное значение. Поля часов, минут и секунд обычно устанавливаются так, чтобы соответствовать реальному времени суток. Значение счетчика суток инкрементируется каждую полночь, регистрируя количество прошедших дней с с момента последней модифицирующей записи. Это значение не соответствует определенному дню календаря. 15-разрядный счетчик дня позволяет без переполнения отсчитывать диапазон времени 89 лет, 260 или 261 дней (в зависимости от високосных лет).
Рис. 17-4. RTC Status Register.
Программируйте RTC_STAT текущим временем после каждого тика 1 Гц. На следующем тике 1 Гц, RTC_STAT обновится новым, инкрементированным значением. Пример безопасной записи RTC_STAT:
1. Подождите момента возникновения тика 1 Гц. 2. Прочитайте RTC_STAT. Например, было прочитано 10:45:30. 3. Запишите текущее время в RTC_STAT, например 13:10:59. 4. Если сразу прочитать RTC_STAT, то будет прочитано старое время: 10:45:30. 5. Подождите момента возникновения тика 1 Гц. 6. Почитайте RTC_STAT, получите новое текущее время 13:11:00.
8 событий прерывания RTC (см. рис. 17-5) можно индивидуально маскировать или разрешать путем программирования значения регистра управления прерываниями RTC (RTC_ICTL). Прерывание секунд генерируется каждый тик 1 Гц, если это прерывание разрешено. Прерывание минут генерируется на каждом тике 1 Гц, когда счетчик секунд меняется значение с 59 на 0. The hour interrupt is generated at the 1 Hz clock tick that advances the minute counter from 59 to 0. 24-часовое прерывание произойдет раз в 24-часовой период на каждом тике 1 Гц, который возникает в момент полночи (00:00:00). Любое из этих прерываний, если разрешено, может генерировать запрос на вывод процессора из сна. Все реализованные биты могут читаться и записываться.
Рис. 17-5. RTC Interrupt Control Register (0 в бите означает, что прерывание запрещено, 1 разрешено).
Этот регистр при сбросе очищается только частично, так что некоторые события могут появиться разрешенными изначально. Однако прерывание RTC и пробуждение RTC для PLL обрабатывается специально, и маскируется (принудительным лог. 0) до момента завершения первой записи в регистр RTC_ICTL. Таким образом, все прерывания действуют как если бы они были запрещены системным сбросом (как если бы все биты RTC_ICTL были обнулены), даже если некоторые биты RTC_ICTL могут быть прочитаны как не нулевые. Если сразу после сброса не нужны прерывания RTC, то рекомендуется записать в RTC_ICTL значение 0x0000, чтобы гарантировать корректное выполнение всех последующих операций (read-modify-write).
Регистр статуса прерываний RTC (RTC_ISTAT) предоставляет состояние всех прерываний RTC (см. рис. 17-6). Биты этого регистра так называемые sticky-биты, т. е. они очищаются операцией W1C. Как только бит был установлен соответствующим событием, он остается установленным до тех пор, программа не запишет в этот бит единицу. Флаги события всегда устанавливаются аппаратно; они не маскируются битами разрешения прерываний RTC_ICTL. Все позиции бит очищаются операцией записи 1 в соответствующую позицию бита (запись лог. 0 не производит никаких действий), кроме бита состояния ожидания записи, который работает только на чтение. Регистр RTC_ISTAT очищается при сбросе и при состоянии глубокого сна (deep sleep).
Рис. 17-6. RTC Interrupt Status Register (все биты типа W1C, кроме бита 14, показывающего состояние ожидания записи в регистр RTC).
Счетчик обратного отсчета RTC (RTC_SWCNT) содержит счетчик, который считает вниз (см. рис. 17-7). Этот счетчик декрементируется на 1 каждую секунду, и когда достигнет 0, сгенерирует прерывание (если это прерывание разрешено). При достижении 0 счетчик останавливается, и счет не возобновляется до тех пор, пока в RTC_SWCNT не будет записано новое значение. Во время своего счета stopwatch-счетчик может быть перезаписан новым значением. Это позволяет использовать stopwatch-счетчик как сторожевой таймер, который работает с точностью 1 секунда. Запись 0 в работающий счетчик позволяет его заранее остановить и заранее сгенерировать его прерывание. Флаг события stopwatch установится каждый тик 1 Гц, когда происходит одно из следующих событий:
• Декременты счетчика достигли его значения 0x0000. • Запись 0x0000 в RTC_SWCNT завершилась, когда счетчик работал (текущее значение stopwatch-счетчика было больше 0). • Запись 0x0000 в RTC_SWCNT завершилась, когда счетчик был остановлен (текущее значение stopwatch-счетчика было равно 0).
Этот регистр можно запрограммировать любым значением в диапазоне от 0 до (216 – 1) секунд. Этот диапазон соответствует 18 часам, 12 минутам и 15 секундам.
Обычно программа должна подождать момента возникновения тика 1 Гц, и после этого записывать RTC_SWCNT. Через одну секунду (на следующем тике 1 Гц) RTC_SWCNT поменяется на новое значение и начнет декрементироваться. Из-за того, что такая процедура записи занимает около 1 секунды, время от момента записи нового значения N до момента возникновения прерывания stopwatch составит около N + 1 секунд. Чтобы получить точную задержку, программа должна записать в регистр RTC_SWCNT компенсированное значение N – 1, чтобы получить задержку около N секунд. Это подразумевает, что Вы не можете достичь таким способом задержки 1 секунды с помощью stopwatch-счетчика, потому что запись 1 в RTC_SWCNT сразу после тика 1 Гц приведет к генерации прерывания stopwatch примерно через 2 секунды. Чтобы подождать 1 секунду, программа просто должна дождаться следующего тика 1 Гц.
Stopwatch-счетчик RTC не сбрасывается. После включения питания он может быть находится в состоянии счета. Когда stopwatch не используется, запишите в него 0, чтобы остановить счет и немного сэкономить на токе потребления.
Регистр будильников RTC (RTC_ALARM) программируется на определенное время (час, минута, секунда) возникновения прерывания (см. рис. 17-8). Чтение и запись этого регистра можно производить в любой момент времени. Прерывание будильника произойдет всякий раз, когда текущий час, минута и секунда в регистре состояния RTC (RTC_STAT) совпадут со значением регистра RTC_ALARM. Прерывание будильника с учетом суток возникнет тогда, когда поля дня, часа, минуты и секунды регистра RTC_ALARM совпадут с соответствующими значениями регистра состояния RTC (RTC_STAT).
Регистр разрешения прескалера RTC (RTC_PREN) имеет только один активный бит (см. рис. 17-9). Когда этот бит установлен, прескалер разрешен, и RTC работает от частоты RTXI/32768 (обычно 1 Гц). Когда этот бит очищен, прескалер запрещен, и RTC работает на частоте RTXI (обычно частота кварца 32.768 кГц).
Рис. 17-9. Prescaler Enable Register.
Чтобы RTC работал с правильной скоростью, программа должна установить бит разрешения прескалера после первоначального включения питания. Запишите RTC_PREN и затем подождите события завершения записи - это надо сделать перед программированием других регистров. Безопасно записать 1 в RTC_PREN всякий раз, когда процессор загрузит свою программу. Первая запись установит бит, и последующие записи не дадут эффекта, так как состояние не поменяется.
Не запрещайте прескалер очисткой бита в RTC_PREN, если не убедились, что в настоящий момент нет ожидающих записей в регистры MMR RTC. Не переключайтесь между быстрым и медленным режимом во время обычного функционирования системы путем очистки и установки этого бита, так как это нарушает точный отсчет реального времени счетчиками RTC. Чтобы избежать этих потенциальных ошибок, инициализируйте RTC при запуске процессора (в коде startup) записью 1 в RTC_PREN, и не меняйте динамически состояние прескалера во время обычной работы приложения.
Работа RTC без разрешенного прескалера предоставлена главным образом как тестовый режим. Весь функционал RTC работает, только работает в 32768 раз быстрее. Обычно программа никогда не должна записывать 0 в RTC_PREN. Единственная причина, по которой это может понадобиться - синхронизация тика 1 Гц с более точным внешним событием, так как тик 1 Гц предсказуемо произойдет через несколько циклов RTXI после перехода 0 -> 1 значения RTC_PREN. Используйте следующую последовательность синхронизации времени с внешним событием в пределах точности 100 мкс:
1. Запишите 0 в RTC_PREN. 2. Подождите момента завершения записи. 3. Подождите внешнего события синхронизации. 4. Запишите 1 в RTC_PREN. 5. Подождите момента завершения записи. 6. Перепрограммируйте текущее время в RTC_STAT.
[Переходы между состояниями]
Таблица 17-1 показывает каждый RTC MMR, на который влияют события системы. Состояния петли ФАПЧ блока формирования тактовых частот (phase-locked loop, PLL, состояния reset, full on, active, sleep и deep sleep) определены в Главе 8, "Dynamic Power Management" (также см. [3]). "No Power" означает, что выводы питания процессора не подключены к источнику энергии. "Off" означает, что ядро процессора, его периферийные устройства, внешняя память не получает питание (VDDINT выключено), в то время как на RTC подается питание и он работает (напряжение VDDRTC присутствует). При этом питание VDDEXT может присутствовать. Регистры, обозначенные "Как было записано", хранят последнее значение, которое программа в них записала. Если этот регистр не был записан с момента подачи питания VDDRTC, то его состояние неопределенное (это справедливо для всех бит регистров RTC_STAT, RTC_ALARM и RTC_SWCNT, а также для некоторых бит регистров RTC_ISTAT, RTC_PREN и RTC_ICTL).
Таблица 17-1. Эффекты состояний MMR RTC.
VDDRTC
VDDEXT
Сост. системы
RTC_ICTL
RTC_ISTAT
RTC_STAT RTC_SWCNT
RTC_ALARM RTC_PREN
Off
Off
No Power
X
X
X
X
On
On
Reset
Как записано
0
Счет
Как записано
On
On
Full On
Как записано
События
Счет
Как записано
On
On
Sleep
Как записано
События
Счет
Как записано
On
On
Active
Как записано
События
Счет
Как записано
On
On
Deep Sleep
Как записано
0
Счет
Как записано
On
Off
Off
Как записано
X
Счет
Как записано
В таблице 17-2 суммарно описывает ответ программного обеспечения на различные события переходов между состояниями системы.
Таблица 17-2. События переходов состояний системы RTC.
При этом событии:
Выполнить следующую последовательность:
Переход от состояния No Power к состоянию Power On
1. Записать RTC_PREN = 1. 2. Подождать завершения записи. 3. Записать в RTC_STAT текущее время. 4. Записать, если необходимо, RTC_ALARM. 5. Записать RTC_SWCNT. 6. Записать RTC_ISTAT, чтобы очистить любые ожидающие обработки события RTC. 7. Записать RTC_ICTL, чтобы разрешить любые нужные прерывания RTC, или для запрета всех прерываний RTC.
Full On после Reset или Full On после Power On (выход из Power Off)
1. Подождать события секунды или записать RTC_PREN = 1 и ждать завершения записи. 2. Записать RTC_ISTAT, чтобы очистить любые ожидающие обработки события RTC. 3. Записать RTC_ICTL, чтобы разрешить любые желаемые прерывания RTC, или чтобы запретить все прерывания RTC. 4. Читать MMR RTC, если это необходимо.
Пробуждение с выходом из состояния Deep Sleep
1. Подождать установи флага события секунды. 2. Записать RTC_ISTAT, чтобы подтвердить для RTC выход из состояния Deep Sleep. 3. Читать MMR RTC при необходимости. 4. PLL теперь находится в состоянии Active. Переведите PLL в состояние Full On, если это необходимо.
Выход из состояния Sleep
Если пробуждение было вызвано сигналом от RTC, то будет установлен флаг события секунд. В этом случае запишите RTC_ISTAT, чтобы подтвердить прерывание пробуждения RTC. Всегда читайте MMR RTC, если это необходимо.
Перед входом в Sleep
Если нужно пробуждение от RTC: 1. Запишите RTC_ALARM и/или RTC_SWCNT, как это необходимо для планирования возникновения события пробуждения. 2. Запишите RTC_ICTL, чтобы разрешить пробуждение от желаемых источников прерывания RTC. 3. Подождите завершения записи. 4. Разрешите пробуждение от RTC в регистре System interrupt Wake-up Enable (SIC_IWRx).
Перед входом в Deep Sleep
1. Запишите RTC_ALARM и/или RTC_SWCNT, как это необходимо для планирования возникновения события пробуждения. 2. Запишите RTC_ICTL, чтобы разрешить пробуждение от желаемых источников прерывания RTC. 3. Подождите завершения записи.
Перед переходом в Off
1. Запишите RTC_ALARM и/или RTC_SWCNT, как это необходимо для планирования возникновения события пробуждения. 2. Запишите RTC_ICTL, чтобы разрешить пробуждение с включением от желаемых источников прерывания RTC. 3. Подождите завершения записи. 4. Установите бит пробуждения (Wake) в регистре управления регулятором напряжения (VR_CTL).