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

Блок часов реального времени (real-time clock, RTC) это независимый двоично-десятичный (binary coded decimal, BCD) таймер/счетчик. RTC дает аппаратный функционал часов/календаря, двух программируемых прерываний будильника (alarm interrupt) и флаг периодического программируемого пробуждения (wakeup flag) с возможностью вызова прерывания. RTC также включает блок автоматического пробуждения (automatic wakeup unit) чтобы управлять режимами пониженного энергопотребления (low-power mode).

Примечание: информация в этой статье (перевод главы "26. Real-time clock (RTC)" даташита [1]) относится к MCU семейства STM32F4xx, если специально не указано нечто иное.

Два 32-битных регистра содержат информацию о секунде, минуте, часе (12-часовой или 24-часовой формат), дне (день недели), дате (день месяца), месяце, годе. Эта информация закодирована в формате binary coded decimal (BCD, двоично-десятичный формат). Также доступно значение субсекунд в двоичном формате.

Компенсация для чисел февраля 28, 29 (високосный год), 30 и 31 месяцев выполняется автоматически. Также может быть выполнен переход на летнее время и обратно (daylight saving time compensation).

Дополнительные 32-битные регистры будильника содержат программируемые значения субсекунды, секунды, минуты, часа, дня и даты.

Имеется функция цифровой калибровки для компенсации девиации частоты кварцевого генератора.

После сброса домена backup все регистры RTC защищены от возможного паразитного доступа на запись.

Пока напряжение питания остается в допустимом диапазоне, RTC никогда не останавливаются, независимо от общего состояния MCU - активный режим (Run mode), режим пониженного потребления (low-power) или во время сброса MCU.

Основные функции блока RTC следующие (см. блок-схему на рис. 237):

• Полный календарь с отсчетом субсекунд, секунд, минут, часов (в 12- или 24-часовом формате), дней (день недели), даты (день месяца), месяцев и лет.

• Программируемая возможность перехода на летнее время (daylight saving compensation).

• 2 программируемых будильника с функцией прерывания. Будильники могут сработать в соответствии с любой комбинацией полей календаря.

• Блок автоматического пробуждения, генерирующий периодический флаг, вызывающий automatic wakeup interrupt.

• Детектирование опорной тактовой частоты: для увеличения точности отсчета секунд может быть предоставлена внешняя тактовая частота (50 или 60 Гц).

• Точная синхронизация с внешними тактами, использующая функцию сдвига субсекунд.

• Маскируемые события прерывания:

   – Alarm A (будильник A).
   – Alarm B (будильник B).
   – Wakeup interrupt (прерывание пробуждения).
   – Timestamp (метка времени).
   – Tamper detection (детектирование взлома).

• Схема цифровой калибровки (периодическая коррекция счетчика):

   – Точность 5 ppm.
   – Точность 0.95 ppm, полученная в окне калибровки нескольких секунд.

• Функция метки времени для сохранения времени события (1 событие).

• Детектирование взлома:

   – 2 события tamper с конфигурируемым фильтром и внутренним подтягивающим вверх резистором (pull-up).

• 20 регистров резервного хранения данных (backup registers, 80 байт). Backup-регистры сбрасываются, когда происходит событие детектирования взлома (tamper detection event).

• Выход альтернативной функции (RTC_OUT), для которого можно выбрать один из 2 вариантов выхода (все они маршрутизируются функцией RTC_AF1 [3]):

   – RTC_CALIB: тактовый выход 512 Гц или 1 Гц (при частоте генератора LSE 32768 Гц). Этот выход разрешается установкой бита COE в регистре RTC_CR.
   – Сигнал будильника RTC_ALARM (Alarm A, Alarm B или wakeup). Этот выход выбирается конфигурированием бит OSEL[1:0] регистра RTC_CR.

• Альтернативная функция входов RTC:

   – RTC_TS: детектирование события метки времени (timestamp event detection). Маршрутизируется функциями RTC_AF1 и RTC_AF2 [3].
   – RTC_TAMP1: детектирование события взлома TAMPER1. Маршрутизируется функциями RTC_AF1 и RTC_AF2 [3].
   – RTC_TAMP2: детектирование события взлома TAMPER2.
   – RTC_REFIN: вход опорной тактовой частоты (обычно 50 или 60 Гц).

См. секцию "8.3.15: Selection of RTC_AF1 and RTC_AF2 alternate functions" даташита [1], или секцию "Выбор альтернативных функций RTC_AF1 и RTC_AF2" статьи [3].

STM32F4xx RTC block diagram fig237

Рис. 237. Блок-схема RTC.

Примечание: на устройствах STM32F4xx альтернативные функции RTC_AF1 и RTC_AF2 подключены соответственно к портам PC13 и PI8 [3].

[Функциональное описание RTC]

Тактирование и прескалеры. Тактовая частота RTC (RTCCLK) выбирается с помощью контроллера тактов среди тактов LSE, тактов генератора LSI и тактов HSE. Для дополнительной информации по выбору конфигурации тактирования RTC см. секцию "7: Reset and clock control for STM32F405xx/07xx and STM32F415xx/17xx(RCC)" и секцию "6: Reset and clock control for STM32F42xxx and STM32F43xxx (RCC)" даташита [1].

Каскад программируемого прескалера генерирует частоту 1 Гц, которая используется для обновления календаря (Calendar). Чтобы минимизировать потребление энергии, прескалер разделен на 2 программируемых прескалера (см. рис. 237):

• 7-битный прескалер, конфигурируемый битами PREDIV_A регистра RTC_PRER.
• 15-битный синхронный прескалер, конфигурируемый через биты PREDIV_S регистра RTC_PRER.

Примечание: когда используются оба прескалера, то для снижения потребления энергии рекомендуется конфигурировать асинхронный прескалер на самое высокое значение.

При частоте кварцевого генератора LSE 32.768 кГц асинхронный прескалер конфигурируется на коэффициент деления 128, а синхронный прескалер на 256, в результате получается частота тактов 1 Гц (ck_spre).

Минимальный коэффициент деления 1, и максимальный 222. Это соответствует максимальной входной тактовой частоте около 4 МГц.

fck_apre вычисляется по следующей формуле:

              fRTCCLK
fCK_APRE = --------------
            PREDIV_A + 1

Тактовая частота ck_apre используется для тактирования двоичного счетчика субсекунд RTC_SSR. Он считает вниз, и когда достигает 0, RTC_SSR перезагружается содержимым PREDIV_S.

fck_spre вычисляется по следующей формуле:

                        fRTCCLK
fCK_SPRE = ---------------------------------
            (PREDIV_S + 1) x (PREDIV_A + 1)

Тактовая частота ck_spre может использоваться либо для обновления календаря, либо как база времени для 16-битного, автоматически загружаемого таймера пробуждения (wakeup auto-reload timer). Для получения коротких периодов таймаута 16-битный wakeup auto-reload timer также может быть запущен с тактовой частотой RTCCLK, поделенной программируемым 4-битным асинхронным прескалером (см. далее раздел "Periodic auto-wakeup").

[Часы реального времени и календарь]

К регистрам времени и даты календаря RTC осуществляется доступ через теневые регистры, которые синхронизируются с частотой PCLK1 (частота шины APB1). К ним также можно обращаться напрямую, чтобы избежать задержки ожидания синхронизации. Вот эти регистры, которые хранят календарь:

• RTC_SSR для субсекунд.
• RTC_TR для времени.
• RTC_DR для даты.

Через каждые 2 периода RTCCLK текущее значение календаря копируется в теневые регистры, и устанавливается бит RSF в регистре RTC_ISR (см. описание этого регистра далее во врезке, раздел "Регистры RTC"). Это копирование не выполняется в режимах пониженного потребления Stop и Standby. При выходе из этих режимов теневые регистры обновляются после задержки до 2 периодов RTCCLK.

Когда приложение читает регистры календаря, оно обращается к содержимому теневых регистров. Можно напрямую обратиться к регистрам календаря путем установки бита управления BYPSHAD в регистре RTC_CR. По умолчанию этот бит очищен, и программа обращается к теневым регистрам.

Когда считывается RTC_SSR, RTC_TR и RTC_DR в режиме BYPSHAD=0, частота APB (fAPB) должна быть как минимум в 7 раз выше частоты тактов RTC (fRTCCLK).

Теневые регистры при системном сбросе сбрасываются.

[Программируемые будильники]

В блоке RTC есть 2 программируемых будильника, Alarm A и Alarm B. Функции программируемого будильника разрешаются битами ALRAIE и ALRBIE регистра RTC_CR. Флаги ALRAF и ALRBF устанавливаются в 1, если в календаре совпали субсекунды, минуты, часы, дата или день со значениями, запрограммированных в регистрах будильника RTC_ALRMASSR/RTC_ALRMAR и RTC_ALRMBSSR/RTC_ALRMBR соответственно. Каждое поле календаря может быть независимо выбрано битами MSKx регистров RTC_ALRMAR и RTC_ALRMBR, и битами MASKSSx регистров RTC_ALRMASSR и RTC_ALRMBSSR. Прерывания будильника разрешаются битами ALRAIE и ALRBIE регистра RTC_CR.

Alarm A и Alarm B (если это разрешено битами OSEL[1:0] в регистре RTC_CR) могут быть направлены на выход RTC_ALARM. Полярность выхода RTC_ALARM может конфигурироваться битом POL регистра RTC_CR.

Внимание: если выбрано поле секунд (сброшен бит MSK0 в регистре RTC_ALRMAR или RTC_ALRMBR), то коэффициент деления синхронного прескалера, установленного в регистре RTC_PRER, должен быть как минимум 3, чтобы гарантировать корректное поведение будильника.

[Periodic auto-wakeup]

Флаг периодического пробуждения (periodic wakeup flag) генерируется 16-битным программируемым автоматически перезагружаемым счетчиком, который считает вниз. Диапазон таймера wakeup может быть расширен до 17 бит.

Функция пробуждения (wakeup) разрешается битом WUTE в регистре RTC_CR.

Тактами для таймера wakeup могут быть:

• Такты RTC (RTCCLK), поделенные на 2, 4, 8 или 16. Когда RTCCLK генерирует LSE (32.768 кГц), это позволяет конфигурировать период прерывания wakeup от 122 мкс до 32 секунд, с разрешающей способностью до 61 мкс.
• Такты ck_spre (обычно это внутренняя частота 1 Гц). Когда частота ck_spre равна 1 Гц, это позволяет настраивать период пробуждения (wakeup time) от 1 секунды до 36 часов с точностью 1 секунда. Этот большой программируемый диапазон времени делится на 2 части:

   – от 1 секунды до 18 часов, когда WUCKSEL[2:1] = 10
   – и от 18 часов до 36 часов, когда WUCKSEL[2:1] = 11. В этом последнем случае значение 216 добавляется к текущему значению 16-битного счетчика. Когда последовательность инициализации завершена (см. далее секцию "Программирование таймера wakeup"), таймер начнет считать вниз. Когда функция wakeup разрешена, счет вниз остается активным в режимах пониженного энергопотребления. Дополнительно, когда счетчик достигнет 0, установится флаг WUTF в регистре RTC_ISR, и счетчик wakeup автоматически перезагрузит свое значение (из регистра RTC_WUTR).

Флаг WUTF должен быть очищен программой.

Когда разрешено периодическое прерывание пробуждения (wakeup interrupt) путем установки бита WUTIE в регистре RTC_CR2, это может вывести MCU из режимов пониженного энергопотребления (low-power mode).

Флаг периодического пробуждения может быть направлен на выход RTC_ALARM, что разрешается битами OSEL[1:0] регистра RTC_CR. Полярность выхода RTC_ALARM может быть сконфигурирована битом POL в регистре RTC_CR.

Системный сброс, как и режимы пониженного энергопотребления (Sleep, Stop и Standby) никак не влияют на таймер wakeup.

[Инициализация и конфигурирование RTC]

Доступ к регистру RTC. Регистры RTC 32-разрядные. Интерфейс APB вводит задержку в 2 такта ожидания при доступе к регистру RTC, за исключением чтения теневых регистров календаря, когда BYPSHAD=0.

Защита от записи в регистр RTC. После системного сброса регистры RTC защищены от случайной ошибочной записи битом DBP регистра управления питанием (PWR_CR). Бит DBP должен быть установлен, чтобы разрешить доступ на запись к регистрам RTC.

После сброса домена backup все регистры RTC оказываются защищенными от записи. Запись в регистры RTC разрешается путем записи специального ключа в регистр защиты RTC_WPR.

Нужны следующие шаги, чтобы разблокировать защиту от записи во всех регистрах RTC, кроме RTC_ISR[13:8], RTC_TAFCR и RTC_BKPxR:

1. Запишите 0xCA в регистр RTC_WPR.
2. Запишите 0x53 в регистр RTC_WPR.

Запись неправильного ключа снова активирует защиту от записи. На механизм защиты системный сброс не влияет.

Инициализация и конфигурация календаря. Чтобы запрограммировать начальное время и дату, включая формат фремени и прескалер, выполните следующую последовательность действий:

1. Установите бит INIT=1 в регистре RTC_ISR, чтобы войти в режим инициализации. В этом режиме счетчик календаря остановлен, и его значение можно обновить.
2. Опрашивайте бит INITF регистра RTC_ISR. Фаза режима инициализации достигнута, когда INITF установится в 1. На это требуется от 1 до 2 тактов RTCCLK (из-за синхронизации доменов тактирования).
3. Чтобы генерировать тактовую частоту 1 Гц для счетчика календаря, запрограммируйте коэффициент синхронного прескалера в регистре RTC_PRER, и затем запрограммируйте коэффициент асинхронного прескалера. Даже если нужно поменять только одно поле из двух, все равно должны быть выполнены 2 отдельных записи в регистр RTC_PRER.
4. Загрузите значения начального времени и даты в теневые регистры (RTC_TR и RTC_DR), и сконфигурирууйте формат времени (12-часовой или 24-часовой) биом FMT регистра RTC_CR.
5. Выйдите из режима инициализации очисткой бита INIT. После этого актуальное значение счетчика календаря автоматически загрузится, и счет перезапустится после 4 тактов RTCCLK.

Когда последовательность инициализации завершится, календарь начнет отсчет времени.

Примечание: после системного сброса приложение должно прочитать флаг INITS в регистре RTC_ISR, чтобы проверить, инициализирован календарь, или нет. Если этот флаг равен 0, то календарь не инициализирован, поскольку поле года в его домене backup сброшено в состояние по умолчанию (0x00). Для чтения календаря после инициализации программа должна сначала проверить, что установлен флаг RSF в регистре RTC_ISR.

Летнее время. Управление переходом на летнее время и обратно (daylight saving time) выполняется битами SUB1H, ADD1H и BKP регистра RTC_CR.

Используя SUB1H или ADD1H, программа может вычесть один час из календаря или добавить один час к календарю за одну операцию, без выполнения процедуры инициализации.

Дополнительно программа может использовать бит BKP, чтобы запомнить эту операцию.

Программирование будильника. Подобная процедура должна быть выполнена для программирования или обновления будильника (Alarm A или Alarm B):

1. Очистите бит ALRAE или бит ALRBIE регистра RTC_CR, чтобы запретить Alarm A или Alarm B соответственно.
2. Опрашивайте бит ALRAWF или ALRBWF регистра RTC_ISR, пока он не установится, что гарантирует разрешенный доступ к регистрам будильника. Опрос займет от 1 до 2 тактов (из-за синхронизации тактов).
3. Запрограммируйте регистры Alarm A или Alarm B (RTC_ALRMASSR/RTC_ALRMAR или RTC_ALRMBSSR/RTC_ALRMBR).
4. Установите бит ALRAE или ALRBIE регистра RTC_CR, чтобы снова разрешить Alarm A или Alarm B.

Примечание: каждое изменение регистра RTC_CR может занять по времени от 1 до 2 тактов RTCCLK из-за синхронизации доменов тактирования.

Программирование таймера wakeup. Для программирования или изменения значения автозагрузки (поле WUT[15:0] регистра RTC_WUTR) таймера пробуждения требуется следующая последовательность действий:

1. Очистите WUTE в регистре RTC_CR, чтобы запретить таймер wakeup.
2. Опрашивайте бит WUTWF регистра RTC_ISR, пока он не установится в 1. Это обеспечит разрешение записи в счетчик wakeup auto-reload и биты WUCKSEL[2:0]. Опрос займет от 1 до 2 тактов RTCCLK (из-за синхронизации доменов тактов).
3. Запрограммируйте значение wakeup auto-reload (поле WUT[15:0] регистра RTC_WUTR) и биты выбора тактов wakeup (поле WUCKSEL[2:0] регистра RTC_CR). Установите бит WUTE регистра RTC_CR, чтобы снова запустить таймер. Таймер wakeup начнет счет вниз. Бит WUTWF очистится в задержкой до 2 тактов RTCCLK после очистки WUTE, из-за синхронизации доменов тактирования.

[Чтение календаря]

BYPSHAD=0. Чтобы правильно прочитать регистры календаря (RTC_SSR, RTC_TR и RTC_DR), частота тактов шины APB1 (fPCLK1) должна быть как минимум в 7 раз выше частоты тактов RTC (fRTCCLK). Это гарантирует безопасное поведение механизма синхронизации.

Если тактовая частота APB1 меньше, чем семикратное значение тактовой частоты RTC, программа должна дважды прочитать регистры времени и даты календаря. Если второе чтение RTC_TR дает то же значение, что и первое, то это гарантирует, что данные корректные. Иначе должно быть выполнено третье чтение. В любом случае частота тактов APB1 никогда не должна быть меньше тактовой частоты RTC.

Бит RSF в регистре RTC_ISR установится всякий раз, когда регистры календаря копируются в теневые регистры RTC_SSR, RTC_TR и RTC_DR. Копирование выполняется каждые 2 такта RTCCLK. Для гарантии когерентности между этими 3 значениями, чтение значений либо RTC_SSR, либо RTC_TR блокирует значение в теневых регистрах старшего порядка до тех пор, пока не будет прочитан RTC_DR. В случае, когда программа делает доступ на чтение к календарю в интервал времени, меньший чем 2 периода RTCCLK: бит RSF должен быть очищен программой после первого чтения календаря, и затем программа должна ждать установки RSF перед тем, как снова прочитать регистры RTC_SSR, RTC_TR и RTC_DR.

После выхода из режима пониженного энергопотребления (Stop или Standby) программа должна очистить бит RSF. Затем программа должна подождать, пока этот бит не установится снова перед чтением регистров RTC_SSR, RTC_TR и RTC_DR registers.

Бит RSF должен быть очищен после пробуждения и не перед входом в режим пониженного энергопотребления.

После сброса системы программа должна подождать установки бита RSF перед чтением регистров RTC_SSR, RTC_TR и RTC_DR. Действительно, ведь системный сброс сбрасывает теневые регистры в их значения по умолчанию.

После инициализации (см. выше секцию "Инициализация и конфигурация календаря") программа должна ждать установки RSF перед чтением регистров RTC_SSR, RTC_TR и RTC_DR.

После синхронизации (см. далее раздел "Синхронизация RTC") программа должна подождать установки RSF перед чтением регистров RTC_SSR, RTC_TR и RTC_DR.

BYPSHAD=1. В этом случае чтение регистров календаря дает их непосредственное значение, это устраняет необходимость ждать установки бита RSF. Такая возможность особенно полезна после выхода из режимов пониженного энергопотребления (STOP или Standby), поскольку теневые регистры в этих режимах не обновляются.

Когда бит BYPSHAD установлен в 1, результаты чтения разных регистров могут быть не когерентны друг с другом, если перепад тактов RTCCLK произошел между двумя чтениями регистров. Кроме того, значение одного из прочитанных регистров может быть некорректным, если перепад RTCCLK произошел во время операции чтения. Программа должна прочитать все регистры дважды, и затем сравнить результаты обоих чтений для подтверждения, что данные когерентны и корректны. Альтернативно программа может просто сравнить два результата наименее значимых регистров календаря.

Примечание: когда BYPSHAD=1, инструкции чтения регистров календаря требуют для своего завершения одного дополнительного такта APB.

[Сброс RTC]

Теневые регистры календаря (RTC_SSR, RTC_TR и RTC_DR) и некоторые биты регистра статуса RTC (RTC_ISR) сбрасываются в свои состояния по умолчанию всеми доступными источниками системного сброса.

В противоположность этому, следующие регистры сбрасываются в свои значения по умолчанию от сброса домена backup, но на них не влияет системный сброс: текущие регистры календаря RTC, регистр управления RTC (RTC_CR), регистр прескалера (RTC_PRER), регистры калибровки (RTC_CALIBR или RTC_CALR), регистр сдвига RTC (RTC_SHIFTR), регистры метки времени (RTC_TSSSR, RTC_TSTR и RTC_TSDR), регистр конфигурации RTC tamper и альтернативной функции (RTC_TAFCR), регистры RTC backup (RTC_BKPxR), регистр таймера wakeup (RTC_WUTR), регистры будильников Alarm A и Alarm B (RTC_ALRMASSR/RTC_ALRMAR и RTC_ALRMBSSR/RTC_ALRMBR).

Кроме того, когда RTC тактируется от LSE (кварц 32786 Гц), он не прерывает счет во время сброса системы, если источник сброса отличается от источника сброса домена backup. См. описание тактирования RTC в разделе "Reset and clock controller" даташита [1] для подробной информации по источникам тактирования RTC, на которые не влияет системный сброс.

Когда происходит сброс домена backup, RTC останавливаются, и все регистры RTC устанавливаются в свои значения по умолчанию после сброса.

[Синхронизация RTC]

RTC могут быть синхронизированы внешней высокоточной тактовой частотой. После чтения поля субсекунд (RTC_SSR или RTC_TSSSR) может быть сделано вычисление точного смещения между временами внешних тактов и RTC. Затем RTC могут быть подстроены для устранения этого смещения путем "сдвига" своих тактов на дробную часть секунды с помощью регистра RTC_SHIFTR.

RTC_SSR содержит значение счетчика синхронного прескалера. Позволяет вычислить точное время, поддерживаемое RTC, с разрешающей способностью до 1 / (PREDIV_S + 1) секунды. Как следствие, разрешающую способность можно повысить путем увеличения значения синхронного прескалера (PREDIV_S[14:0]). Максимально достижимое разрешение (30.52 мкс на частоте тактов 32768 Гц) получается установкой PREDIV_S в значение 0x7FFF.

Однако увеличение PREDIV_S означает, что асинхронный прескалер должен быть уменьшен, чтобы выходная частота тактов оставалась равной 1 Гц. При таком способе регулирования тактов частота работы асинхронного прескалера увеличивается, что приводит к увеличению динамического энергопотребления RTC.

RTC можно точно подстроить, используя регистр управления сдвигом RTC (RTC_SHIFTR). Запись в RTC_SHIFTR может сдвинуть (задержку или опережение) тактов на значение до секунды с разрешающей способностью 1 / (PREDIV_S + 1) секунды. Операция сдвига состоит в добавлении значения SUBFS[14:0] к счетчику синхронного прескалера SS[15:0]: это задержит тактовую частоту. Если в то же самое время установлен бит ADD1S, то это приведет к добавлению одной секунды и в то же время вычитанию доли секунды, что ускорит такты.

Предупреждение: перед инициированием операции сдвига пользователь должен проверить SS[15]=0, чтобы не было переполнения.

Как только операция сдвига была инициирована записью в регистр RTC_SHIFTR, аппаратура установит флаг SHPF, чтобы показать, что идет операция сдвига. Этот бит очистится аппаратно, как только операция сдвига завершится.

Предупреждение: эта функция синхронизации несовместима с функцией детектирования опорной тактовой частоты: firmware не должна записывать в регистр RTC_SHIFTR, когда REFCKON=1.

[Детектирование опорной тактовой частоты RTC]

Обновление календаря RTC может быть синхронизировано с опорной тактовой частотой, подаваемой на RTC_REFIN, обычно совпадающей с частотой питающей сети (mains 50 или 60 Гц). Опорные такты RTC_REFIN должны быть с большей точностью, чем частота кварцевого генератора 32.768 кГц LSE. Когда разрешено детектирование RTC_REFIN (бит REFCKON регистра RTC_CR установлен в 1), календарь все еще тактируется от LSE, и RTC_REFIN используется для компенсации неточной частоты обновления календаря (1 Гц).

Каждый тактовый перепад 1 Гц сравнивается с ближайшим перепадом опорной частоты (если он найден в заданном окне времени). В большинстве случаев эти два тактовых перепада выровнены правильно. Когда тактовая частота 1 Гц становится не выровненной из-за неточности кварцевого генератора LSE, RTC сдвигает такты 1 Гц так, что следующий такт 1 становится выровненным. Благодаря этому механизму календарь становится таким же точным, как и частота опорных тактов.

RTC детектирует источник опорной частоты с использованием тактовой частоты 256 Гц (ck_apre), генерируемой от кварца 32.768 кГц. Детектирование производится в окне времени возле каждого обновления календаря (каждую 1 секунду). Окно равно 7 периодам ck_apre, когда детектируется первый перепад опорной тактовой частоты. Меньшее окно размером 3 периода ck_apre используется для последующих обновлениях календаря.

Всякий раз, когда в окне времени детектируется тактовая опорная частота, синхронный прескалер, который выводит выводит такты ck_spre, принудительно перезагружается. Это не оказывает влияния, когда опорная частота и тактовая частота 1 Гц выровнены, потому что прескалер перезагружается в тот же самый момент. Когда такты не выровнены, перезагрузка немного сдвигает будущие перепады тактов 1 Гц, так что они оказываются выровненными с опорной частотой.

Если опорные такты останавливаются (не было перепада тактов в интервале окна 3 периода ck_apre), календарь обновляется постоянно, основываясь на собственной частоте тактов LSE. Тогда RTC ждет появления опорной тактовой частоты в окне времени 7 периодов ck_apre, центрированном на перепаде ck_spre.

Когда опорная тактовая частота разрешена, PREDIV_A и PREDIV_S должны быть установлены в свои значения по умолчанию:

PREDIV_A = 0x007F
PREDIV_S = 0x00FF

Примечание: в режиме Standby детектирование опорной частоты недоступно.

Предупреждение: функция детектирования опорной частоты не может использоваться совместно с грубой цифровой калибровкой: RTC_CALIBR должен удерживаться в значении 0x00000000, когда REFCKON=1.

[Грубая цифровая калибровка RTC]

Доступны 2 метода цифровой калибровки: грубый и точный. Для выполнения грубой калибровки см. далее описание регистра во врезке "RTC calibration register (RTC_CALIBR)".

Эти 2 метода калибровки не предназначены для совместного использования, приложение должно выбрать один из них. Грубая калибровка предоставляется по соображениям совместимости. Чтобы выполнить точную калибровку, см. далее соответствующий раздел "Точная цифровая калибровка RTC" и врезку с описанием регистра калибровки "RTC calibration register (RTC_CALR)".

Грубая калибровка может использоваться для компенсации неточности кварца путем добавления (положительная калибровка) или маскирования (отрицательная калибровка) тактов на выходе асинхронного прескалера (ck_apre).

Положительная и отрицательная калибровка выбирается установкой бита DCS регистра RTC_CALIBR в 0 и 1 соответственно.

Когда разрешена положительная калибровка (DCS=0), добавляется 2 периода ck_apre на каждую минуту (около 15360 периодов ck_apre) для 2xDC минут. Это приводит к тому, что календарь обновляется раньше, что дает эффект увеличения частоты тактов RTC.

Когда разрешена отрицательная калибровка (DCS=1), удаляется 1 период ck_apre на каждую минуту (около 15360 периодов ck_apre) для 2xDC минут. Это приводит к тому, что календарь обновляется позже, что дает эффект уменьшения частоты тактов RTC.

Компенсация конфигурируется битами DC[4:0] регистра RTC_CALIBR. Это число в диапазоне от 0 до 31, соответствующее интервалу времени (2xDC) в диапазоне от 0 до 62.

Грубая цифровая калибровка может быть сконфигурирована только в режиме инициализации, и начинает работать, когда очищается бит INIT. Полный цикл калибровки длится 64 минуты. Первые 2xDC минут из этих 64 минут циклы модифицируются, как было только что описано.

Отрицательная калибровка может быть выполнена с разрешающей способностью около 2 ppm, в то время как положительная калибровка около 4 ppm. Максимальный диапазон калибровки составляет от -63 ppm до +126 ppm.

Калибровка может быть выполнена либо на тактах LSE, либо на тактах HSE.

Предупреждение: цифровая калибровка может корректно работать только если PREDIV_A < 6.

Следующее описание подразумевает, что частота ck_apre 256 Гц получена с номинальной частотой LSE 32.768 кГц, и PREDIV_A, установленный в 127 (значение по умолчанию).

Тактовая частота ck_spre модифицируется только во время первых 2xDC минут 64-минутного цикла. Например, когда DC равен 1, только первые 2 минуты происходит модификация. Это означает, что первые 2xDC минут каждого 64-минутного цикла на каждой минуте секунда будет короче на 256 тактов RTCCLK или на 128 тактов RTCCLK, при условии, что каждый такт ck_apre представляет 128 такта RTCCLK (с настройкой PREDIV_A+1=128).

Таким образом, каждый шаг калибровки дает эффект добавления 512 или вычитания 256 тактов генератора для каждых 125829120 тактов RTCCLK (64 минут x 60 сек/минута x 32768 тактов/сек). Это эквивалентно +4.069 ppm или -2.035 ppm на шаг калибровки. В результате разрешающая способность калибровки составит +10.5 или -5.27 секунд в месяц, и общий (максимальный) диапазон калибровки составит от +5.45 до -2.72 минут в месяц.

Чтобы измерить девиацию тактов, для калибровки выводится тактовая частота 512 Гц. См. далее раздел "Калибровочный выход тактов".

[Точная цифровая калибровка RTC]

Точность хода RTC может быть откалибрована с разрешающей способностью около 0.954 ppm в диапазоне от -487.1 ppm до +488.5 ppm. Коррекция частоты тактов выполняется последовательностью небольших подстроек (добавление и/или вычитание отдельных тактовых импульсов RTCCLK). Эти подстройки достаточно хорошо распределены, так что RTC хорошо калибруются даже при наблюдении в течении короткого промежутка времени.

Точная цифровая калибровка выполняется на цикле порядка 220 тактов RTCCLK, или 32 секунд, когда входная частота равна 32768 Гц. Этот цикл обслуживается 20-разрядным счетчиком cal_cnt[19:0], тактируемым от RTCCLK.

Регистр точной калибровки (RTC_CALR) задает количество тактов RTCCLK, маскируемых на 32-секундном цикле регулировки:

• Установка бита CALM[0] в 1 приведет к тому, что ровно 1 импульс RTCCLK должен быть маскирован в течение 32-секундного цикла.
• Установка бита CALM[1] в 1 приведет к тому, что дополнительно должны маскироваться 2 импульса RTCCLK.
• Установка бита CALM[2] в 1 приведет к тому, что дополнительно должны маскироваться 4 импульса RTCCLK.
• И так далее, до CALM[8], его установка в 1 приведет к тому, что дополнительно должны маскироваться 256 импульсов RTCCLK.

Примечание: CALM[8:0] (регистр RTC_CALRx) задает количество импульсов RTCCLK, которое должно быть маскировано во время 32-секундного цикла. Установка бита CALM[0] в 1 приведет к тому, что ровно 1 импульс должен маскироваться в момент, когда cal_cnt[19:0] = 0x80000; CALM[1]=1 приведет к маскированию 2 других импульсов, когда cal_cnt равен 0x40000 и 0xC0000; CALM[2]=1 приведет к маскированию 4 других импульсов, когда cal_cnt = 0x20000/0x60000/0xA00000xE0000); и так далее, до CALM[8]=1, который приведет к 256 маскируемым тактам (cal_cnt = 0xXX800).

В то время как CALM позволяет снизить частоту тактирования RTC максимум до 487.1 ppm с хорошей разрешающей способностью, бит CALP может использоваться для увеличения частоты на 488.5 ppm. Установка CALP=1 дает эффект добавления дополнительных импульсов RTCCLK каждые 211 тактов RTCCLK, что приводит к добавлению 512 тактов на каждый 32-секундный цикл.

При использовании CALM вместе с CALP в течение 32-секундного цикла можно добавить смещение в диапазоне от -511 до +512 импульсов RTCCLK, что транслируется в диапазон регулирования от -487.1 ppm до +488.5 ppm с разрешающей способностью около 0.954 ppm.

Формула для вычисления эффективной калиброванной частоты (FCAL), генерируемой из входной частоты (FRTCCLK):

FCAL = fRTCCLK x [1 + (CALP x 512 - CALM) / (220 + CALM - CALP x 512)]

Бит CALP не может быть установлен в 1, когда значение асинхронного прескалера (биты PREDIV_A регистра RTC_PRER) меньше 3. Если CALP уже был установлен в 1, и биты PREDIV_A установлены в значение, меньшее 3, то CALP игнорируется, и калибровка работает так, как если бы CALP был равен 0.

Для выполнения калибровки, когда PREDIV_A меньше 3, значение синхронного прескалера (PREDIV_S) должно быть уменьшено так, чтобы каждая секунда ускорялась на 8 импульсов RTCCLK, что эквивалентно 256 тактовых импульсов на каждые 32 секунды. В результате значение между 255 и 256 импульсами (соответствует диапазону калибровки от 243.3 до 244.1 ppm) может быть эффективно добавлено на каждом 32-секундном цикле при использовании только бит CALM.

Когда номинальная частота RTCCLK равна 32768 Гц, и PREDIV_A=1 (коэффициент деления 2), PREDIV_S должен быть установлен на 16379 вместо 16383 (меньше на 4). Еще один другой интересный случай, когда PREDIV_A=0, тогда PREDIV_S должен быть установлен в 32759 вместо 32767 (меньше на 8).

Если PREDIV_S уменьшен таким способом, то формула, дающая эффективную калиброванную частоту FCAL (генерируемую из исходной частоты тактов fRTCCLK), получается следующая:

FCAL = fRTCCLK x [1 + (256 - CALM) / (220 + CALM - 256)]

В этом случае CALM[7:0], равный 0x100 (среднее значение диапазона регулирования CALM) дает корректную настройку, если RTCCLK абсолютно точно равна 32768.00 Гц.

Проверка калибровки RTC. Точность хода RTC проверяется изменением точной частоты RTCCLK, и вычислением корректных значений CALM и CALP. Предоставляется опциональный выход 1 Гц, чтобы приложения могли измерить эту частоту и проверить точность RTC.

Измерение точной частоты RTC в течение ограниченного интервала может привести к ошибке измерения до 2 тактовых импульсов RTCCLK в течение периода измерения в зависимости от того, как цифровой калибровочный цикл выровнен относительно периода измерения.

Однако эта ошибка измерения может быть устранена, если период измерения такой же, как и период цикла калибровки. В этом случае единственная наблюдаемая ошибка это та ошибка, которая происходит из-за ограниченной разрешающей способности цифровой калибровки.

• По умолчанию длительность цикла калибровки составляет 32 секунды. Использование этого режима и измерение точность 1 Гц в течение ровно 32 секунд гарантирует, что измерение будет с точностью в пределах 0.477 ppm (0.5 такта RTCCLK на 32 секунды, из-за ограниченной разрешающей способности калибровки).
• Бит CALW16 регистра RTC_CALR может быть установлен в 1, чтобы принудительно включить 16-секундный период цикла калибровки. В этом случае точность RTC может быть измерена за 16 секунд с максимальной ошибкой 0.954 ppm (0.5 такта RTCCLK за 16 секунд). Однако, поскольку точность калибровки уменьшена, также снижается точность RTC в долгосрочной перспективе до 0.954 ppm: бит CALM[0] удерживается в 0, когда CALW16 установлен в 1.
• Бит CALW8 регистра RTC_CALR может быть установлен в 1, чтобы принудительно включить 8-секундный период цикла калибровки. В этом случае точность RTC может быть измерена за 8 секунд с максимальной ошибкой 1.907 ppm (0.5 такта RTCCLK за 8 секунд). Точность RTC в долгосрочной перспективе также снижается до 1.907 ppm: биты CALM[1:0] удерживаются в 00, когда CALW8 установлен в 1.

Перекалибровка на лету. Регистр калибровки (RTC_CALR) может быть обновлен на лету во время RTC_ISR/INITF=0, при использовании следующего процесса:

1. Опрос RTC_ISR/RECALPF (флаг ожидания перекалибровки).
2. Если это установлено в 0, запись нового значения в RTC_CALR, если это необходимо. Тогда RECALPF автоматически установится в 1.
3. В течение 3 периодов ck_apre после операции записи
RTC_CALR новая калибровочная настройка вступит в силу.

[Функция метки времени]

Функция метки времени (timestamp) разрешается установкой бита TSE=1 в регистре RTC_CR.

Календарь сохраняется в регистрах метки времени (RTC_TSSSR, RTC_TSTR, RTC_TSDR), когда было детектировано событие метки времени на ножке, которая отображена на альтернативную функцию TIMESTAMP. Когда произошло событие метки времени (timestamp event), установится флаг бита timestamp (TSF) в регистре RTC_ISR.

Если установить бит TSIE в регистре RTC_CR, то будет сгенерировано прерывание в момент события метки времени.

Если было определено новое событие метки времени, когда флаг timestamp (TSF) уже установлен, установится флаг переполнения метки времени (timestamp overflow flag, TSOVF), и регистры метки времени (RTC_TSTR и RTC_TSDR) будут хранить результаты предыдущего события.

Примечание: TSF установится на 2 такта ck_apre после возникновения события метки времени из-за процесса синхронизации. Установка TSOVF происходит без задержки. Это означает, что если 2 события метки времени близки по времени друг к другу, TSOVF может быть виден как 1, в то время как TSF все еще находится в 0. Как следствие, рекомендуется опрос бита TSOVF только после того, как установится бит TSF.

Предупреждение: если произошло событие метки времени сразу после того, как предполагается сброс бита TSF, то установятся оба бита TSF и TSOVF. Чтобы избежать маскирования события метки времени в один и тот же момент времени, приложение не должно записывать 0 в бит TSF, кроме случая, когда оно уже прочитало его как 1.

Опционально событие метки времени может вызвать запись метки времени, см. описание бита управления TAMPTS во врезке регистра "RTC tamper and alternate function configuration register (RTC_TAFCR)". Если событие метки времени находится на той же ножке, которая сконфигурирована на определение события взлома, сконфигурированного в режиме фильтрации (поле TAMPFLT установлено в ненулевое значение), должен быть выбран режим метки времени на детектировании события взлома путем установки TAMPTS=1 в регистре RTC_TAFCR.

Альтернативная функция TIMESTAMP. Эта функция (RTC_TS) может быть отображена либо на RTC_AF1, либо на RTC_AF2, в зависимости от значения бита TSINSEL в регистре RTC_TAFCR, см. описание этого регистра во врезке "RTC tamper and alternate function configuration register (RTC_TAFCR)". Отображение события метки времени на RTC_AF2 не разрешается, если используется RTC_AF1 как TAMPER в режиме фильтрации (поле TAMPFLT установлено в ненулевое значение).

[Детектирование взлома]

Имеются входы для детектирования взлома (tamper detection). Они могут быть сконфигурированы либо на детектирование перепада, либо на детектирование уровня с функцией фильтрации.

Регистры RTC backup. Регистры backup (RTC_BKPxR) это двадцать 32-битных регистров для сохранения 80 байт данных приложения пользователя. Они реализованы в домене backup, который остается запитанным от VBAT, когда питание VDD отключено. Данные в регистрах backup не сбрасываются от сброса системы, или когда устройство выходит из режима Standby. Сбрасываются данные в регистрах backup сбросом домена backup.

Регистры backup сбрасываются, когда происходит детектирование событие tamper, см. описание "RTC backup registers (RTC_BKPxR)" и следующую секцию, посвященную инициализации детектирования взлома.

Инициализация детектирования взлома. Каждый вход детектирования tamper связан с флагами TAMP1F/TAMP2F регистра RTC_ISR2. Каждый вход может быть разрешен установкой в 1 соответствующих бит TAMP1E/TAMP2E регистра RTC_TAFCR.

Как уже упоминалось, событие детектирования взлома (tamper detection event) сбросит все backup-регистры (RTC_BKPxR).

Установкой бита TAMPIE регистра RTC_TAFCR разрешается генерация прерывания, когда происходит детектирование события взлома.

Метка времени на событии взлома. Когда бит TAMPTS установлен в 1, любое событие взлома (tamper event) приведет к возникновению метки времени (timestamp). В этом случае установится либо бит TSF, либо бит TSOVF в регистре RTC_ISR, точно так же, как если бы произошло обычное событие метки времени (timestamp event). Установится соответствующий связанный флаг (TAMP1F, TAMP2F) одновременно с установкой TSF или TSOVF.

Детектирование перепада на входах tamper. Если биты TAMPFLT сброшены в 00, ножки TAMPER генерируют события детектирования взлома (RTC_TAMP[2:1]), когда наблюдался либо перепад нарастания уровня, либо перепад спада уровня на соответствующем бите TAMPxTRG. Внутренние pull-up резисторы на входах TAMPER деактивируются, когда выбрано детектирование по перепаду.

Предупреждение: чтобы избежать пропуска детектирования события взлома, используемый для детектирования сигнал логически объединяется операцией И с TAMPxE, чтобы детектировать событие взлома, когда оно произошло перед разрешением ножки TAMPERx.

• Когда TAMPxTRG = 0: если альтернативная функция TAMPERx находится уже в лог. 1 до того, как разрешено детектирование tamper (бит TAMPxE установлен в 1), то событие tamper детектируется, как только разрешено TAMPERx, даже если не было фронта нарастания уровня на TAMPERx после установки TAMPxE.
• Когда TAMPxTRG = 1: если альтернативная функция TAMPERx находится уже в лог. 0 до того, как разрешено детектирование tamper, то событие tamper детектируется, как только разрешено TAMPERx, даже если не было спада уровня на TAMPERx после установки TAMPxE.

После того, как tamper event было детектировано и очищено, альтернативная функция TAMPERx должна быть запрещена и разрешена заново (установкой в 1 бита TAMPxE) перед повторным программированием backup-регистров (RTC_BKPxR). Это предотвратит для приложения запись в backup-регистры, когда значение TAMPERx все еще показывает детектирование взлома. Это эквивалентно детектированию уровня на альтернативной функции TAMPERx.

Примечание: детектирование взлома все еще остается активным, когда питание VDD выключено. Чтобы избежать нежелательного сброса backup-регистров, ножка с привязанной альтернативной функцией TAMPER должна снаруже подтянута к корректному уровню.

Детектирование уровня с фильтрацией на входах tamper. Детектирование уровня с фильтрацией выполняется установкой поля TAMPFLT в ненулевое значение. Событие детектирования взлома (tamper detection event) генерируется, когда определено либо 2, либо 4, либо 8 (в зависимости от установки поля TAMPFLT) следующих друг за другом одинаковых наблюдаемых выборок уровня, назначенного битами TAMPxTRG (TAMP1TRG/TAMP2TRG).

Входы TAMPER получают предварительный заряд через внутренние pull-up резисторы перед тем, как из состояние анализируется, если это не запрещено установкой TAMPPUDIS=1. Длительность предзаряда определяется битами TAMPPRCH, что позволяет подключать конденсатор увеличенной емкости на входах tamper.

Компромисс между задержкой детектирования взлома и энергопотреблением, вызванным протеканием тока через резисторы pull-up, можно оптимизировать, используя TAMPFREQ, чтобы определить частоту оцифровки уровня для его детектирования.

Примечание: см. даташиты на используемый MCU для получения электрических характеристик резисторов pull-up.

Альтернативная функция детектирования TAMPER. Альтернативная функция TAMPER1 (RTC_TAMP1) может быть отображена либо на RTC_AF1(PC13), либо на RTC_AF2 (PI8), в зависимости от значения бита TAMP1INSEL регистра RTC_TAFCR, см. описание этого регистра во врезке "RTC tamper and alternate function configuration register (RTC_TAFCR)". Бит TAMPE должен быть очищен, когда модифицируется TAMP1INSEL, чтобы избежать нежелательной установки TAMPF.

Альтернативная функция TAMPER2 соответствует ножке RTC_TAMP2.

Когда установлен в 1 бит COE регистра RTC_CR, опорная частота выводится на выход RTC_CALIB. Если бит COSEL=0 в регистре RTC_CR, и PREDIV_A=0x7F, то частота на выходе RTC_CALIB будет равна fRTCCLK/64. Это соответствует выводу калибровочный частоты 512 Гц, когда частота RTCCLK равна 32.768 кГц.

На выход RTC_CALIB не влияет калибровочное значение, запрограммированное в регистре RTC_CALIBR. Скважность RTC_CALIB нерегулярная: есть небольшой джиттер на спадах уровня. Поэтому для измерения частоты рекомендуется использовать нарастания уровня.

Если COSEL установлен и (PREDIV_S+1) ненулевое, и делится на 256 (например, PREDIV_S[7:0]=0xFF), частота RTC_CALIB составит fRTCCLK/(256 * (PREDIV_A+1)). Это соответствует калибровочному выходу 1 Гц для значений прескалеров по умолчанию (PREDIV_A=0x7F, PREDIV_S=0xFF), при частоте RTCCLK 32.768 кГц. На выход 1 Гц влияет выполняющаяся операция сдвига, и переключение может происходить на операции сдвига (SHPF=1).

Альтернативная функция выхода калибровки. Когда COE=1 в регистре RTC_CR, разрешена альтернативная функция калибровки (RTC_CALIB) на RTC_AF1.

Примечание: когда выбрана функция RTC_CALIB или RTC_ALARM, на выходе альтернативной функции автоматически конфигурируется RTC_AF1.

[Выход будильника]

На выходе будильника могут быть выбраны 3 функции: ALRAF, ALRBF и WUTF. Эти функции отражают содержимое соответствующих флагов в регистре RTC_ISR.

Биты управления OSEL[1:0] регистра RTC_CR используются для активации выхода альтернативной функции (RTC_ALARM) в RTC_AF1, и для выбора функции, которая выводится на RTC_ALARM.

Полярность выхода определяется битом управления POL в регистре RTC_CR так, что выводится противоположная выбранному флагу полярность, когда POL=1.

Выход альтернативной функции будильника. RTC_ALARM можно сконфигурировать на выход с открытым стоком (open drain), или с двухтактным выходом (push-pull), используя бит управления ALARMOUTTYPE регистра RTC_TAFCR.

Примечание: как только разрешена функция RTC_ALARM, она имеет приоритет над RTC_CALIB (бит COE регистра RTC_AF1 не оказывает влияния). Когда выбрана функция RTC_CALIB или RTC_ALARM, на выходе автоматически конфигурируется альтернативная функция RTC_AF1.

[RTC и режимы пониженного энергопотребления]

Таблица 119. Как на RTC влияют режимы пониженного потребления энергии.

Режим Описание
Sleep Никакого влияния. Прерывания RTC выведут MCU из режима Sleep.
Stop Блок RTC остается активным, если для RTC источником тактирования служат генераторы LSE или LSI. События RTC alarm, RTC tamper, RTC time stamp и RTC Wakeup выведут MCU из режима Stop или Standby.
Standby

[Прерывания RTC]

Все прерывания RTC подключены к контроллеру EXTI. Чтобы разрешить прерывание RTC Alarm, требуется следующая последовательность действий:

1. Сконфигурируйте и разрешите EXTI Line 17 в режиме прерывания, и выберите чувствительность к фронту нарастания уровня.
2. Сконфигурируйте и разрешите канал RTC_Alarm IRQ в контроллере прерываний NVIC.
3. Сконфигурируйте RTC для генерации будильников RTC (Alarm A или Alarm B).

Чтобы разрешить прерывание RTC Wakeup, требуется следующая последовательность действий:

1. Сконфигурируйте и разрешите EXTI Line 22 в режиме прерывания, и выберите чувствительность к фронту нарастания уровня.
2. Сконфигурируйте и разрешите канал RTC_WKUP IRQ в контроллере прерываний NVIC.
3. Сконфигурируйте RTC для генерации события таймера пробуждения (RTC wakeup timer event).

Чтобы разрешить прерывание RTC Tamper, требуется следующая последовательность действий:

1. Сконфигурируйте и разрешите EXTI Line 21 в режиме прерывания, и выберите чувствительность к фронту нарастания уровня.
2. Сконфигурируйте и разрешите канал TAMP_STAMP IRQ в контроллере прерываний NVIC.
3. Сконфигурируйте RTC для детектирования события взлома (RTC tamper event).

Чтобы разрешить прерывание RTC TimeStamp, требуется следующая последовательность действий:

1. Сконфигурируйте и разрешите EXTI Line 21 в режиме прерывания, и выберите чувствительность к фронту нарастания уровня.
2. Сконфигурируйте и разрешите канал TAMP_STAMP IRQ в контроллере прерываний NVIC.
3. Сконфигурируйте RTC для детектирования события метки времени (RTC timestamp event).

Таблица 120. Биты управления прерываниями RTC.

Событие прерывания Флаг события Бит разрешения Выход из Sleep Выход из Stop Выход из Standby
Alarm A ALRAF ALRAIE ДА(1) ДА(1)
Alarm B ALRBF ALRBIE
Wakeup WUTF WUTIE
TimeStamp TSF TSIE
Детектирование Tamper1 TAMP1F TAMPIE
Детектирование Tamper2(2) TAMP2F

Примечания:

(1) Пробуждение из режимов STOP и Standby возможно только когда источником тактов для RTC выбран генератор LSE или LSI.
(2) Если присутствует ножка RTC_TAMPER2, она есть не на всех корпусах MCU. Обратитесь к цоколевке MCU в даташите на него.

[Регистры RTC]

К регистрам периферийного устройства RTC нужно обращаться как к словам (32-битный доступ). Смещение адреса указано относительно базового адреса RTC_BASE. Этот адрес можно узнать в файле заголовка для используемого микроконтроллера, например stm32f429xx.h для STM32F429 (RTC_BASE = APB1PERIPH_BASE + 0x2800 = 0x40002800). Для адресного пространства регистров RTC и регистров Backup зарезервированы адреса 0x40002800 .. 0x40002BFF.

В описании функций регистров используются следующие сокращения:

read/write (rw) Программа может читать и записывать эти биты.

read-only (r) Программа может только читать эти биты.

write-only (w) Программа может только записывать в этот бит. Чтение бита вернет значение сброса.

read/clear (rc_w1) Программа может прочитать бит, а также сбросить его путем записью 1. Запись 0 не дает никакого эффекта.

read/clear (rc_w0) Программа может прочитать бит, а также сбросить его путем записью 0. Запись 1 не дает никакого эффекта.

read/clear by read (rc_r) Программа может прочитать этот бит. Чтение этого бита автоматически сбросит его в 0. Запись 0 в бит не дает никакого эффекта.

read/set (rs) Программа может прочитать, а также установить этот бит. Запись 0 в бит не дает никакого эффекта.

read-only write trigger (rt_w) Программа может прочитать этот бит. Запись 0 или 1 вызовет появление события (триггер), но не окажет никакого влияния на значение бита.

toggle (t) Программа может только переключить этот бит записью 1. Запись 0 не дает никакого эффекта.

Reserved (Res.) Зарезервированный бит, его значение должно сохраняться на значении сброса.

RTC_TR это теневой регистр времени календаря. Он должен записываться только в режиме инициализации RFTC. См. выше секцию "Инициализация и конфигурация календаря" и раздел "Чтение календаря".

Смещение адреса: 0x00
Значение после сброса домена backup: 0x00000000
Значение после системного сброса, если BYPSHAD=0: 0x00000000.
Если BYPSHAD=1, то системный сброс не влияет на содержимое регистра.

   31      30       29       28       27       26       25       24       23       22       21       20       19       18       17       16   
зарезервировано
PM
rw
HT[1:0]
rw
HU[3:0]
rw
   15       14       13       12       11       10       9       8       7       6       5       4       3       2       1       0   
зарез. MNT[2:0]
rw
MNU[3:0]
rw

зарез. ST[2:0]
rw

SU[3:0]
rw

Биты 31..24 зарезервированы.

Бит 23 зарезервирован, и должен находится в состоянии сброса.

HT[1:0] (биты 21:20): Hour Tens, десятки часов в BCD-формате.

HU[3:0] (биты 19:16): Hour Units, единицы часов в BCD-формате.

Бит 15 зарезервирован, и должен находится в состоянии сброса.

MNT[2:0] (биты 14:12): MiNute Tens, десятки минут в BCD-формате.

MNU[3:0] (биты 11:8): MiNute Units, единицы минут в BCD-формате.

Бит 7 зарезервирован, и должен находится в состоянии сброса.

ST[2:0] (биты 6:4): Second Tens, десятки секунд в BCD-формате.

SU[3:0] (биты 3:0): Second Units, единицы секунд в BCD-формате.

Примечание: этот регистр снабжен защитой от записи. Процедура доступа на запись описана выше, см. секцию "Защита от записи в регистр RTC".

RTC_TR это теневой регистр даты календаря. Он должен записываться только в режиме инициализации RFTC. См. выше секцию "Инициализация и конфигурация календаря" и раздел "Чтение календаря".

Смещение адреса: 0x04
Значение после сброса домена backup: 0x00002101
Значение после системного сброса, если BYPSHAD=0: 0x00002101.
Если BYPSHAD=1, то системный сброс не влияет на содержимое регистра.

   31      30       29       28       27       26       25       24       23       22       21       20       19       18       17       16   
зарезервировано
YT[3:0]
rw

YU[3:0]
rw
   15       14       13       12       11       10       9       8       7       6       5       4       3       2       1       0   
WDU[2:0]
rw

MT
rw
MU[3:0]
rw

зарезерв. DT[1:0]
rw
DU[3:0]
rw

Биты 31..24 зарезервированы.

YT[3:0] (биты 23:20): Year Tens, десятки года в BCD-формате.

YU[3:0] (биты 19:16): Year Units, единицы кода в BCD-формате.

WDU[2:0] (биты 15:13): Week Day Units, код дня недели.

   000: запрещенное значение.
   001: Monday (понедельник).
   ...
   111: Sunday (воскресенье).

Примечание: аппаратура RTC не поддерживает автоматическую синхронизацию между днями недели и датой, программа пользователя должна это делать самостоятельно.

MT (бит 12): Month Tens, десятки месяца в BCD-формате.

MU (биты 11:8): Month Units, единицы месяца в BCD-формате.

Биты 7:6 зарезервированы, и должны находится в состоянии сброса.

DT[1:0] (биты 5:4): Date Tens, десятки дней месяца в BCD-формате.

DU[3:0] (биты 3:0): Date Units, единицы дней месяца в BCD-формате.

Примечание: этот регистр снабжен защитой от записи. Процедура доступа на запись описана выше, см. секцию "Защита от записи в регистр RTC".

Смещение адреса: 0x08
Значение после сброса домена backup: 0x00000000
Системный сброс не влияет на содержимое регистра.

   31      30       29       28       27       26       25       24       23       22       21       20       19       18       17       16   
зарезервировано
COE
rw

OSEL[1:0]
rw
POL
rw
COSEL
rw
BKP
rw
SUB1H
w
ADD1H
w
   15       14       13       12       11       10       9       8       7       6       5       4       3       2       1       0   
TSIE
rw

WUTIE
rw
ALRBIE
rw
ALRAIE
rw
TSE
rw

WUTE
rw
ALRBE
rw
ALRAE
rw
DCE
rw
FMT
rw
BYPSHAD
rw
REFCKON
rw
TSEDGE
rw

WUCKSEL[2:0]
rw

Биты 31:24 зарезервированы, и должны находится в состоянии сброса.

COE (бит 23): Calibration Output Enable (разрешение выхода калибровки). Бит разрешает выход RTC_CALIB.

0: выход калибровки запрещен.
1: выход калибровки разрешен.

OSEL[1:0] (биты 22:21): Output SELection, выбор выхода. Эти биты используются для выбора флага, который передается на выход RTC_ALARM.

00: выход запрещен.
01: разрешен выход Alarm A.
10: разрешен выход Alarm B.
11: разрешен выход Wakeup.

POL (бит 20): Output POLarity, полярность выхода. Бит используется для конфигурирования полярности выхода RTC_ALARM.

0: на выводе лог. 1, когда выставлен флаг ALRAF/ALRBF/WUTF (какой выбран флаг, зависит от значения OSEL[1:0]).
1: на выводе лог. 0, когда выставлен флаг ALRAF/ALRBF/WUTF (какой выбран флаг, зависит от значения OSEL[1:0]).

COSEL (бит 19): Calibration Output SELection, выбор выхода калибровки. Когда COE=1, этот бит выбирает, какой сигнал выводить на RTC_CALIB.

0: на выходе калибровки частота 512 Гц.
1: на выходе калибровки частота 1 Гц.

Указаны значения частот для RTCCLK = 32.768 кГц и прескалеров, установленных в свои значения по умолчанию (PREDIV_A=127 и PREDIV_S=255). См. выше раздел "Калибровочный выход тактов".

BKP (бит 18): BacKuP. Этот бит программа может использовать по своему усмотрению. Например, здесь можно запомнить, был ли переход на летнее время, или нет.

SUB1H (бит 17): SUBtract 1 Hour, вычесть 1 час (переход на зимнее время). Когда этот бит установлен вне режима инициализации, 1 час вычитается из времени календаря, если текущий час не равен 0. Этот бит всегда считывается как 0. Установка этого бита не дает никакого эффекта, если текущий час равен 0.

0: никакого эффекта.
1: из текущего времени вычитается 1 час. Это может использоваться для перехода на зимнее время.

ADD1H (бит 16): ADD 1 Hour, добавить 1 час (переход на летнее время). Когда этот бит установлен, добавится 1 час ко времени календаря. Этот бит всегда считывается как 0.

0: никакого эффекта.
1: добавляется 1 час к текущему времени. Это может использоваться для перехода на летнее время вне режима инициализации.

TSIE (бит 15): TimeStamp Interrupt Enable, разрешение прерывания метки времени.

0: прерывание метки времени запрещено.
1: прерывание метки времени разрешено.

WUTIE (бит 14): WakeUp Timer Interrupt Enable, разрешение прерывания от таймера пробуждения.

0: прерывание таймера пробуждения запрещено.
1: прерывание таймера пробуждения разрешено.

ALRBIE (бит 13): ALaRm B Interrupt Enable, разрешение прерывания будильника B.

0: прерывание запрещено.
1: прерывание разрешено.

ALRAIE (бит 12): ALaRm A Interrupt Enable, разрешение прерывания будильника A.

0: прерывание запрещено.
1: прерывание разрешено.

TSE (бит 11): Time Stamp Enable, разрешение метки времени.

0: метка времени запрещена.
1: метка времени разрешена.

WUTE (бит 10): WakeUp Timer Enable, разрешение таймера пробуждения.

0: таймер пробуждения запрещен.
1: таймер пробуждения разрешен.

Примечание: когда wakeup timer запрещен, нужно подождать WUTWF=1 перед тем, как разрешить его снова.

ALRBE (бит 9): ALaRm B Enable, разрешение будильника B.

0: Alarm B запрещен.
1: Alarm B разрешен.

ALRAE (бит 8): ALaRm A Enable, разрешение будильника A.

0: Alarm A запрещен.
1: Alarm A разрешен.

DCE (бит 7): Coarse Digital Calibration Enable, разрешение грубой цифровой калибровки.

0: цифровая калибровка запрещена.
1: цифровая калибровка разрешена.

PREDIV_A должен быть установлен в значение 6 или больше.

FMT (бит 6): Hour format, формат часа.

0: 24-часовой формат.
1: формат часа AM/PM.

BYPSHAD (бит 5): BYPass the SHADow registers, пропуск теневых регистров.

0: значения календаря (при чтении из RTC_SSR, RTC_TR и RTC_DR) берутся из теневых регистров, с обновлением каждые 2 такта RTCCLK.
1: значения календаря считываются напрямую из его регистров.

Примечание: если частота тактов APB1 меньше, чем семикратное значение RTCCLK, то BYPSHAD должен быть установлен в 1.

REFCKON (бит 4): REFerence ClocK detection enable, разрешение детектирования появления опорной частоты тактов (50 или 60 Гц).

0: детектирование опорной внешней тактовой частоты запрещено.
1: детектирование опорной внешней тактовой частоты разрешено.

Примечание: PREDIV_S должен быть установлен на 0x00FF.

TSEDGE (бит 3): TimeStamp Event active EDGE, активный перепад события метки времени.

0: фронт нарастания уровня TIMESTAMP генерирует событие метки времени.
1: спад уровня TIMESTAMP генерирует событие метки времени.

TSE должен быть сброшен, когда изменяется TSEDGE, чтобы избежать нежелательной установки TSF.

WUCKSEL[2:0] (биты 2:0): WakeUp ClocK SELection, выбор тактов таймера для пробуждения.

000: RTC/16
001: RTC/8
010: RTC/4
011: RTC/2
10x: ck_spre (обычно 1 Гц)
11x: ck_spre (обычно 1 Hz), и добавляется 216 к значению счетчика WUT, см. примечание ниже.

Примечания:

(1) WUT = значению счетчика блока пробуждения (Wakeup unit counter). WUT = (от 0x0000 до 0xFFFF) + 0x10000 добавляется, когда WUCKSEL[2:1] = 11.
(2) Биты 7, 6 и 4 этого регистра могут быть записаны только в режиме инициализации (RTC_ISR/INITF = 1).
(3) Биты 2..0 этого регистра могут быть записаны только когда бит WUTE=0 регистра RTC_CR, и бит WUTWF=1 регистра RTC_ISR.
(4) Рекомендуется не изменять значение часа во время инкремента часа календаря, поскольку такая процедура может маскировать этот инкремент.
(5) Изменения ADD1H и SUB1H вступают в силу на следующей секунде.
(6) Чтобы избежать случайной установки TSF, TSE должен быть сброшен, когда меняется TSEDGE.

Этот регистр снабжен защитой от записи. Процедура доступа на запись описана выше, см. секцию "Защита от записи в регистр RTC".

Смещение адреса: 0x0C
Значение после сброса домена backup: 0x00000007
Системный сброс не влияет на содержимое регистра, кроме бит INIT, INITF и RSF, которые системный сброс очищает в значение 0.

   31      30       29       28       27       26       25       24       23       22       21       20       19       18       17       16   
зарезервировано RECALPF
r
   15       14       13       12       11       10       9       8       7       6       5       4       3       2       1       0   
зарез. TAMP2F
rc_w0
TAMP1F
rc_w0
TSOVF
rc_w0
TSF
rc_w0
WUTF
rc_w0
ALRBF
rc_w0
ALRAF
rc_w0
INIT
rw
INITF
r
RSF
rc_w0
INITS
r
SHPF
r

WUTWF
r
ALRBWF
r
ALRAWF
r

Биты 31:17 зарезервированы.

RECALPF (бит 16): RECALibration Pending Flag, флаг ожидания перекалибровки.

Флаг статуса RECALPF автоматически установится в 1, когда программа что-то запишет в регистр RTC_CALR, показывая тем самым, что регистр RTC_CALR заблокирован. Когда новая настройка калибровки вступила в силу, бит сам вернется в состояние 0. См. выше секцию "Перекалибровка на лету".

Бит 15 зарезервирован, и должен находится в состоянии сброса.

TAMP2F (бит 14): TAMPER2 detection Flag, флаг детектирования взлома на входе 2. Этот флаг устанавливается аппаратно, когда детектировано событие взлома на входе tamper 2. Бит должна очищать программа записью в него 0.

TAMP1F (бит 13): TAMPER1 detection flag, флаг детектирования взлома на входе 1. Этот флаг устанавливается аппаратно, когда детектировано событие взлома на входе tamper 1. Бит должна очищать программа записью в него 0.

TSOVF (бит 12): TimeStamp OVerflow Flag, флаг переполнения метки времени. Этот флаг установится аппаратно, когда произойдет событие метки времени, и при этом флаг TSF уже установлен. Этот флаг очищается программой записью туда 0. Рекомендуется проверить и затем очистить TSOVF только после очистки бита TSF. Иначе о переполнении может не быть оповещения, если событие timestamp произойдет немедленно перед очисткой бита TSF.

TSF (бит 11): TimeStamp Flag, флаг метки времени. Этот флаг установится аппаратно, когда произойдет событие метки времени. Этот флаг очищает программа записью в него 0.

WUTF (бит 10): WakeUp Timer Flag, флаг таймера пробуждения. Этот флаг установится аппаратно, когда автоматически загружаемый счетчик пробуждения (wakeup auto-reload counter) при обратном счете достигнет 0. Этот флаг очищает программа записью в него 0. Этот флаг должен быть очищен программой как минимум на 1.5 периода RTCCLK до того, как WUTF снова установится в 1.

ALRBF (бит 9): ALaRm B Flag, флаг будильника B. Этот флаг установится, когда регистры времени/даты (RTC_TR и RTC_DR) совпадут с регистром будильника Alarm B (RTC_ALRMBR). Этот флаг очистит программа записью в него 0.

ALRAF (бит 8): ALaRm A Flag, флаг будильника A. Этот флаг установится, когда регистры времени/даты (RTC_TR и RTC_DR) совпадут с регистром будильника Alarm A (RTC_ALRMAR). Этот флаг очистит программа записью в него 0.

INIT (бит 7): INITialization mode, режим инициализации.

0: режим свободного счета.
1: режим инициализации, используемый для программирования регистров времени и даты (RTC_TR и RTC_DR) и регистра прескалера (RTC_PRER). Счетчики останавливаются, и запустят счет от нового значения, когда бит INIT будет снова очищен.

INITF (бит 6): INITialization Flag, флаг инициализации. Когда этот бит установится в 1, RTC находится в состоянии инициализации, и можно обновлять регистры времени, даты и прескалера.

0: обновлять регистры календаря нельзя.
1: регистры календаря и прескалера доступны для обновления.

RSF (бит 5): Registers Synchronization Flag, флаг синхронизации регистров. Этот бит установится аппаратно всякий раз, когда время регистров календаря копируется в теневые регистры (RTC_SSRx, RTC_TRx и RTC_DRx). Этот бит очищается аппаратно в режиме инициализации, когда ожидается завершение операции сдвига (SHPF=1), или когда активен режим пропуска теневых регистров (bypass shadow register mode, BYPSHAD=1). Этот бит также может очистить программа.

0: теневые регистры календаря еще не синхронизированы.
1: теневые регистры календаря еще синхронизированы.

INITS (бит 4): INITialization Status flag, флаг статуса инициализации. Этот бит установится аппаратно, когда поле года календаря отличается от 0 (состояние по умолчанию после сброса домена backup).

0: календарь не был еще инициализирован.
1: календарь был инициализирован.

SHPF (бит 3): SHift operation Pending Flag, флаг ожидания завершения операции сдвига.

0: операция сдвига не осуществляется.
1: RTC заняты операцией сдвига.

Этот флаг установится аппаратно, как только была инициирована операция сдвига путем записи в RTC_SHIFTR. Бит очистится аппаратно, когда соответствующая операция сдвига выполнится. Записьь в SHPF не дает эффекта.

WUTWF (бит 2): WakeUp Timer Write Flag, флаг записи в таймер пробуждения. Этот бит установится аппаратно через 2 периода тактов RTCCLK после того, как бит WUTE регистра RTC_CR был установлен в 0, и очистится через 2 периода тактов RTCCLK после тиго, как бит WUTE был установлен в 1. Значения таймера wakeup может быть изменены, когда бит WUTE очищен, и установлен бит WUTWF.

0: обновление конфигурации таймера пробуждения не разрешена.
1: обновление конфигурации таймера пробуждения разрешена.

ALRBWF (бит 1): ALaRm B Write Flag, флаг записи в будильник B. Этот бит установится аппаратно, когда значение будильника B может быть изменено, после того, как бит ALRBIE регистра RTC_CR был сброшен в 0. Бит ALRBWF очищается аппаратно в режиме инициализации.

0: обновление Alarm B не разрешено.
1: обновление Alarm B разрешено.

ALRAWF (бит 0): ALaRm A Write Flag, флаг записи в будильник A. Этот бит установится аппаратно, когда значение будильника A может быть изменено, после того, как бит ALRAIE регистра RTC_CR был сброшен в 0. Бит ALRAWF очищается аппаратно в режиме инициализации.

0: обновление Alarm A не разрешено.
1: обновление Alarm A разрешено.

Примечание: биты ALRAF, ALRBF, WUTF и TSF очищаются на 2 периода тактов APB после программирования их в 0.

Регистр RTC_ISR защищен от записи (кроме бит RTC_ISR[13:8]). Процедура доступа на запись описана выше, см. секцию "Защита от записи в регистр RTC".

Смещение адреса: 0x10
Значение после сброса домена backup: 0x007F00FF
Системный сброс не влияет на содержимое регистра.

   31      30       29       28       27       26       25       24       23       22       21       20       19       18       17       16   
зарезервировано
PREDIV_A[6:0]
rw

   15       14       13       12       11       10       9       8       7       6       5       4       3       2       1       0   
зарез. PREDIV_S[14:0]
rw

Биты 31:24 зарезервированы.

Бит 23 зарезервирован, и должен находится в состоянии сброса.

PREDIV_A[6:0] (биты 22:16): коэффициент деления асинхронного прескалера:

Частота ck_apre = частота RTCCLK / (PREDIV_A+1)

Бит 15 зарезервирован, и должен находится в состоянии сброса.

PREDIV_S[14:0] (биты 14:0): коэффициент деления синхронного прескалера:

Частота ck_spre = частота ck_apre / (PREDIV_S+1)

Примечание: этот регистр должен быть записан только во время режима инициализации. Инициализация должна быть выполнена двумя отдельными операциями записи. См. выше секцию "Инициализация и конфигурация календаря".

Регистр RTC_PRER защищен от записи. Процедура доступа на запись описана выше, см. секцию "Защита от записи в регистр RTC".

Смещение адреса: 0x14
Значение после сброса домена backup: 0x0000FFFF
Системный сброс не влияет на содержимое регистра.

   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   
WUT[15:0]
rw

Биты 31:16 зарезервированы.

WUT[15:0] (биты 15:0): WakeUp auto-reload Timer value bits, биты для значения автозагрузки таймера пробуждения.

Кода wakeup timer разрешен (WUTE=1), флаг WUTF установится каждые (WUT[15:0] + 1) периодов ck_wut. Период ck_wut выбирается битами WUCKSEL[2:0] регистра RTC_CR. Когда WUCKSEL[2]=1, таймер wakeup становится 17-битным, и WUCKSEL[1] эффективно становится WUT[16], самым значащим битом для перезагрузки в таймер.

Примечание: первая установка WUTF произойдет через (WUT+1) тактов ck_wut после установки WUTE. Запрещена установка WUT[15:0] в 0x0000 с установкой WUCKSEL[2:0]=011 (RTCCLK/2).

Этот регистр может быть записан только когда WUTWF=1 в регистре RTC_ISR. Регистр RTC_WUTR защищен от записи. Процедура доступа на запись описана выше, см. секцию "Защита от записи в регистр RTC".

Смещение адреса: 0x18
Значение после сброса домена backup: 0x00000000
Системный сброс не влияет на содержимое регистра.

   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   
зарезервировано
DCS
rw
зарезерв. DC[4:0]
rw

Биты 31:8 зарезервированы.

DCS (бит 7): Digital Calibration Sign, знак цифровой калибровки.

0: положительная калибровка, частота обновления календаря увеличивается.
1: отрицательная калибровка, частота обновления календаря уменьшается.

Биты 6:5 зарезервированы, и должны находится в состоянии сброса.

DC[4:0] (биты 4:0): Digital Calibration, цифровая калибровка.

DCS = 0 (положительная калибровка)

00000: + 0 ppm
00001: + 4 ppm (округленное значение)
00010: + 8 ppm (округленное значение)
..
11111: + 126 ppm (округленное значение)

DCS = 1 (отрицательная калибровка)

00000: - 0 ppm
00001: - 2 ppm (округленное значение)
00010: - 4 ppm (округленное значение)
..
11111: - 63 ppm (округленное значение)

См. выше описание случая RTCCLK=32.768 кГц и PREDIV_A+1=128 для точного значения шага.

Примечание: регистр RTC_CALIBR может быть записан только в режиме инициализации когда (INITF=1 в регистре RTC_ISR). Регистр RTC_CALIBR защищен от записи. Процедура доступа на запись описана выше, см. секцию "Защита от записи в регистр RTC".

Смещение адреса: 0x1C
Значение после сброса домена backup: 0x00000000
Системный сброс не влияет на содержимое регистра.

   31      30       29       28       27       26       25       24       23       22       21       20       19       18       17       16   
MSK4
rw

WDSEL
rw
DT[1:0]
rw
DU[3:0]
rw
MSK3
rw
PM
rw
HT[1:0]
rw
HU[3:0]
rw
   15       14       13       12       11       10       9       8       7       6       5       4       3       2       1       0   
MSK2
rw
MNT[2:0]
rw
MNU[3:0]
rw

MSK1
rw
ST[2:0]
rw

SU[3:0]
rw

MSK4 (бит 31): Alarm A date mask, маска даты будильника A.

0: Alarm A установится, если совпадут дата/день.
1: дата/день не влияют на результат сравнения Alarm A.

WDSEL (бит 30): Week Day SELection, выбор дня недели.

0: DU[3:0] представляют единицы даты.
1: DU[3:0] представляют день недели, при этом DT[1:0] не имеют значения.

DT[1:0] (биты 29:28): десятки даты в BCD-формате.

DU[3:0] (биты 27:24): единицы даты или дня в BCD-формате.

MSK3 (бит 23): Alarm A hours mask, маска часов будильника A.

0: Alarm A установится, если совпадет час.
1: час не влияет на результат сравнения Alarm A.

PM (бит 22): AM/PM notation, формат представления часа времени суток.

0: AM (ante meridiem, до полудня), или 24-часовой формат.
1: PM (post meridiem, после полудня).

HT[1:0] (биты 21:20): Hour Tens, десятки часов в BCD-формате.

HU[3:0] (биты 19:16): Hour Units, единицы часов в BCD-формате.

MSK2 (бит 15): Alarm A minutes mask, маска минут будильника A.

0: Alarm A установится, если совпадет минута.
1: минута не влияет на результат сравнения Alarm A.

MNT[2:0] (биты 14:12): MiNute Tens, десятки минут в BCD-формате.

MNU[3:0] (биты 11:8): MiNute Units, единицы минут в BCD-формате.

MSK1 (бит 7): Alarm A seconds mask, маска секунд будильника A.

0: Alarm A установится, если совпадет секунда.
1: секунда не влияет на результат сравнения Alarm A.

ST[2:0] (биты 6:4): Second Tens, десятки секунд в BCD-формате.

SU[3:0] (биты 3:0): Second Units, единицы секунд в BCD-формате.

Примечание: регистр RTC_ALRMAR может быть записан только когда в регистре RTC_ISR установлен в 1 бит ALRAWF, или в режиме инициализации. Регистр RTC_ALRMAR защищен от записи. Процедура доступа на запись описана выше, см. секцию "Защита от записи в регистр RTC".

Смещение адреса: 0x20
Значение после сброса домена backup: 0x00000000
Системный сброс не влияет на содержимое регистра.

   31      30       29       28       27       26       25       24       23       22       21       20       19       18       17       16   
MSK4
rw

WDSEL
rw
DT[1:0]
rw
DU[3:0]
rw
MSK3
rw
PM
rw
HT[1:0]
rw
HU[3:0]
rw
   15       14       13       12       11       10       9       8       7       6       5       4       3       2       1       0   
MSK2
rw
MNT[2:0]
rw
MNU[3:0]
rw

MSK1
rw
ST[2:0]
rw

SU[3:0]
rw

MSK4 (бит 31): Alarm B date mask, маска даты будильника B.

0: Alarm B установится, если совпадут дата/день.
1: дата/день не влияют на результат сравнения Alarm B.

WDSEL (бит 30): Week Day SELection, выбор дня недели.

0: DU[3:0] представляют единицы даты.
1: DU[3:0] представляют день недели, при этом DT[1:0] не имеют значения.

DT[1:0] (биты 29:28): десятки даты в BCD-формате.

DU[3:0] (биты 27:24): единицы даты или дня в BCD-формате.

MSK3 (бит 23): Alarm B hours mask, маска часов будильника B.

0: Alarm B установится, если совпадет час.
1: час не влияет на результат сравнения Alarm B.

PM (бит 22): AM/PM notation, формат представления часа времени суток.

0: AM (ante meridiem, до полудня), или 24-часовой формат.
1: PM (post meridiem, после полудня).

HT[1:0] (биты 21:20): Hour Tens, десятки часов в BCD-формате.

HU[3:0] (биты 19:16): Hour Units, единицы часов в BCD-формате.

MSK2 (бит 15): Alarm B minutes mask, маска минут будильника B.

0: Alarm B установится, если совпадет минута.
1: минута не влияет на результат сравнения Alarm B.

MNT[2:0] (биты 14:12): MiNute Tens, десятки минут в BCD-формате.

MNU[3:0] (биты 11:8): MiNute Units, единицы минут в BCD-формате.

MSK1 (бит 7): Alarm B seconds mask, маска секунд будильника B.

0: Alarm B установится, если совпадет секунда.
1: секунда не влияет на результат сравнения Alarm B.

ST[2:0] (биты 6:4): Second Tens, десятки секунд в BCD-формате.

SU[3:0] (биты 3:0): Second Units, единицы секунд в BCD-формате.

Примечание: регистр RTC_ALRMBR может быть записан только когда в регистре RTC_ISR установлен в 1 бит ALRBWF, или в режиме инициализации. Регистр RTC_ALRMBR защищен от записи. Процедура доступа на запись описана выше, см. секцию "Защита от записи в регистр RTC".

Смещение адреса: 0x24
Значение после сброса домена backup: 0x00000000

   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   
зарезервировано
KEY
w

Биты 31:8 зарезервированы, и должны находится в состоянии сброса.

KEY (биты 7:0): Write protection key, ключ снятия защиты от записи. Этот байт записывается программой, его чтение всегда вернет 0x00. См. выше описание защиты от записи регистров RTC и о том, как снимается эта защита (секция "Защита от записи в регистр RTC").

Смещение адреса: 0x28
Значение после сброса домена backup: 0x00000000
Значение после системного сброса, если BYPSHAD=0: 0x00000000.
Если BYPSHAD=1, то системный сброс не влияет на содержимое регистра.

   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   
SS[15:0]
r

Биты 31:16 зарезервированы.

SS[15:0] (биты [15:0]): Sub Second value, значение счетчика субсекунд. Это значение в счетчике синхронного прескалера, дробная часть секунды, вычисляемая по формуле:

Дробная часть секунды = ( PREDIV_S - SS ) / ( PREDIV_S + 1 )

Примечание: SS может быть больше, чем PREDIV_S только после операции сдвига. В этом случае корректные время/дата на 1 секунду меньше, чем показывают регистры RTC_TR/RTC_DR.

Смещение адреса: 0x2C
Значение после сброса домена backup: 0x00000000
Системный сброс не влияет на содержимое регистра.

   31      30       29       28       27       26       25       24       23       22       21       20       19       18       17       16   
ADD1S
w
зарезервировано
   15       14       13       12       11       10       9       8       7       6       5       4       3       2       1       0   
зарез. SUBFS[14:0]
w

ADD1S (бит 31): ADD 1 Second, добавление одной секунды.

0: Никакого эффекта.
1: Добавляется 1 секунда к тактам/календарю.

Этот бит предназначен только для чтения, и всегда считывается как 0. Запись в этот бит не дает эффекта, когда ожидает завершения операция сдвига (когда SHPF=1 в регистре in RTC_ISR). Эта функция предназначена для использования вместе с SUBFS (см. описание ниже), чтобы эффективно добавить дробную часть секунды к тактам атомарной операцией.

Биты 30:15 зарезервированы.

SUBFS[14:0] (биты 14:0): SUBtract a Fraction of a Second, вычитаемая дробная часть секунды. Эти биты предназначены только для чтения, и всегда они считываются как 0. Запись в эти биты не дает эффекта, когда ожидается завершение операции сдвига (когда SHPF=1 в регистре RTC_ISR). Значение, записанное в SUBFS, добавляется к счетчику синхронного прескалера. Поскольку этот счетчик считает вниз, то эта операция вычитает импульсы тактов (задерживает их):

Задержка (в секундах) = SUBFS / (PREDIV_S + 1)

Дробная часть секунды может быть эффективно добавлена к тактам (ускорение тактирования), когда используется функция ADD1S вместе с SUBFS. Эффективное ускорение тактов:

Ускорение (в секундах) = ( 1 - ( SUBFS / (PREDIV_S + 1) ) )

Примечание: запись в SUBFS приводит к очистке RSF. Программа может затем подождать RSF=1, чтобы гарантировать, что теневые регистры были обновлены сдвинутым временем. См. выше раздел "Синхронизация RTC".

Регистр RTC_SHIFTR защищен от записи. Процедура доступа на запись описана выше, см. секцию "Защита от записи в регистр RTC".

Смещение адреса: 0x30
Значение после сброса домена backup: 0x00000000
Системный сброс не влияет на содержимое регистра.

   31      30       29       28       27       26       25       24       23       22       21       20       19       18       17       16   
зарерервировано PM
r
HT[1:0]
r
HU[3:0]
r
   15       14       13       12       11       10       9       8       7       6       5       4       3       2       1       0   
зарез. MNT[2:0]
r
MNU[3:0]
r

зарез. ST[2:0]
r

SU[3:0]
r

Биты 31:23 зарезервированы, и должны находится в состоянии сброса.

PM (бит 22): AM/PM notation, формат представления часа времени суток.

0: AM (ante meridiem, до полудня), или 24-часовой формат.
1: PM (post meridiem, после полудня).

HT[1:0] (биты 21:20): Hour Tens, десятки часов в BCD-формате.

HU[3:0] (биты 19:16): Hour Units, единицы часов в BCD-формате.

Бит 15 зарезервирован, и должен находится в состоянии сброса.

MNT[2:0] (биты 14:12): MiNute Tens, десятки минут в BCD-формате.

MNU[3:0] (биты 11:8): MiNute Units, единицы минут в BCD-формате.

Бит 7 зарезервирован, и должен находится в состоянии сброса.

ST[2:0] (биты 6:4): Second Tens, десятки секунд в BCD-формате.

SU[3:0] (биты 3:0): Second Units, единицы секунд в BCD-формате.

Примечание: содержимое этого регистра достоверно только когда TSF=1 в регистре RTC_ISR. Оно очищается, когда бит TSF сбрасывается.

Смещение адреса: 0x34
Значение после сброса домена backup: 0x00000000
Системный сброс не влияет на содержимое регистра.

   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   
WDU[2:0]
r

MT
r
MU[3:0]
r

зарезерв. DT[1:0]
r
DU[3:0]
r

Биты 31:16 зарезервированы, и должны находится в состоянии сброса.

WDU[2:0] (биты 15:13): Week Day Units, день недели.

MT (бит 12): десятки месяцев в BCD-формате.

MU[3:0] (биты 11:8): единицы месяцев в BCD-формате.

Биты 7:6 зарезервированы, и должны находится в состоянии сброса.

DT[1:0] (биты 5:4): десятки даты в BCD-формате.

DU[3:0] (биты 3:0): единицы даты в BCD-формате.

Примечание: содержимое этого регистра достоверно только когда TSF=1 в регистре RTC_ISR. Оно очищается, когда бит TSF сбрасывается.

Смещение адреса: 0x38
Значение после сброса домена backup: 0x00000000
Системный сброс не влияет на содержимое регистра.

   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   
SS[15:0]
r

Биты 31:16 зарезервированы.

SS[15:0] (биты [15:0]): Sub Second value, значение счетчика субсекунд. Это значение счетчика синхронного прескалера, когда произошло событие метки времени.

Примечание: содержимое этого регистра достоверно только когда TSF=1 в регистре RTC_ISR. Оно очищается, когда бит TSF сбрасывается.

Смещение адреса: 0x3C
Значение после сброса домена backup: 0x00000000
Системный сброс не влияет на содержимое регистра.

   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   
CALP
rw

CALW8
rw
CALW16
rw
зарезервировано CALM[8:0]
rw

Биты 31:16 зарезервированы.

CALP (бит 15): CALibration Plus, увеличение частоты RTC на 488.5 ppm.

0: импульсы RTCCLK не добавляются.
1: добавляется 1 импульс RTCCLK на каждые 211 импульсов (частота увеличивается на 488.5 ppm).

Эта функция предназначена для использования совместно с функцией CALM, которая понижает частоту календаря с хорошей разрешающей способностью. Если входная частота 32768 Гц, количеств импульсов RTCCLK, добавляемое во время 32-секундного окна, вычисляется следующим образом: (512 * CALP) - CALM. См. раздел "Точная цифровая калибровка RTC".

CALW8 (бит 14): использование 8-секундного периода калибровочного цикла. Когда CALW8=1, выбран 8-секундный период калибровки. Биты CALM[1:0] удерживаются в состоянии 00, когда CALW8=1. См. раздел "Точная цифровая калибровка RTC".

CALW16 (бит 13): использование 16-секундного периода калибровочного цикла. Когда CALW16=1, выбран 15-секундный период калибровки. Этот бит не должен устанавливаться в 1, если CALW8=1. Бит CALM[0] удерживаются в состоянии 0, когда CALW16=1. См. раздел "Точная цифровая калибровка RTC".

Биты 12:9 зарезервированы.

CALM[8:0] (биты 8:0): CALibration Minus, уменьшение частоты тактирования. Частота календаря уменьшается маскированием CALM на 220 тактовых импульсов RTCCLK (32 секунды, если входная частота 32768 Гц). Частота тактирования календаря уменьшается с разрешающей способностью 0.9537 ppm. Чтобы увеличить частоту календаря, эта функция должна использоваться вместе с функцией CALP. См. раздел "Точная цифровая калибровка RTC".

Примечание: этот регистр защищен от записи. Процедура доступа на запись описана выше, см. секцию "Защита от записи в регистр RTC".

Смещение адреса: 0x40
Значение после сброса домена backup: 0x00000000
Системный сброс не влияет на содержимое регистра.

   31      30       29       28       27       26       25       24       23       22       21       20       19       18       17       16   
зарезервировано ALARMOUTTYPE
rw
TSINSEL
rw
TAMP1INSEL
rw
   15       14       13       12       11       10       9       8       7       6       5       4       3       2       1       0   
TAMPPUDIS
rw
TAMPPRCH[1:0]
rw

TAMPFLT[1:0]
rw

TAMPFREQ[2:0]
rw
TAMPTS
rw
зарезерв.
TAMP2TRG
rw
TAMP2E
rw

TAMPIE
rw
TAMP1TRG
rw
TAMP1E
rw

Биты 31:19 зарезервированы, и всегда считываются как 0.

ALARMOUTTYPE (бит 18): тип выхода RTC_ALARM.

0: RTC_ALARM имеет выход с открытым стоком (open-drain).
1: RTC_ALARM имеет выход с двухтактным драйвером (push-pull).

TSINSEL (бит 17): отображение TIMESTAMP.

0: RTC_AF1 используется как TIMESTAMP.
1: RTC_AF2 используется как TIMESTAMP.

TAMP1INSEL (бит 16): отображение TAMPER1.

0: RTC_AF1 используется как TAMPER1.
1: RTC_AF2 используется как TAMPER1.

Примечание: TAMP1E должен быть сброшен, когда изменяется TAMP1INSEL, чтобы избежать нежелательной установки TAMP1F.

TAMPPUDIS (бит 15): TAMPER Pull-Up DISable, запрет верхнего подтягивающего резистора на входе детектирования взлома.

0: предзаряд ножек tamper перед тем, как считать на них уровень (разрешение внутреннего pull-up).
1: запрет предзаряда на ножках tamper.

TAMPPRCH[1:0] (биты 14:13): TAMPer PReCHarge duration, длительность предзаряда входов взлома. Эти биты определяют время, в течение которого активируется pull-up перед каждым считыванием уровня. TAMPPRCH влияет на каждый вход tamper.

0x0: 1 такт RTCCLK.
0x1: 2 такта RTCCLK.
0x2: 4 такта RTCCLK.
0x3: 8 тактов RTCCLK.

TAMPFLT[1:0] (биты 12:11): TAMPer FiLTer count, счетчик фильтра входа взлома. Эти биты определяют количество следующих друг за другом выборок на указанном уровне (TAMP*TRG), необходимое для активации события взлома (tamper event). TAMPFLT действует для каждого входа tamper.

0x0: Tamper активируется на переходе уровня входа в активное состояние (на входе tamper нет внутреннего pull-up).
0x1: Tamper активируется после 2 следующих друг за другом выборок на активном уровне.
0x2: Tamper активируется после 4 следующих друг за другом выборок на активном уровне.
0x3: Tamper активируется после 8 следующих друг за другом выборок на активном уровне.

TAMPFREQ[2:0] (биты 10:8): TAMPer sampling FREQuency, частота оцифровки уровня на входе взлома.

0x0: RTCCLK / 32768 (1 Гц, когда RTCCLK = 32768 Гц)
0x1: RTCCLK / 16384 (2 Гц, когда RTCCLK = 32768 Гц)
0x2: RTCCLK / 8192 (4 Гц, когда RTCCLK = 32768 Гц)
0x3: RTCCLK / 4096 (8 Гц, когда RTCCLK = 32768 Гц)
0x4: RTCCLK / 2048 (16 Гц, когда RTCCLK = 32768 Гц)
0x5: RTCCLK / 1024 (32 Гц, когда RTCCLK = 32768 Гц)
0x6: RTCCLK / 512 (64 Гц, когда RTCCLK = 32768 Гц)
0x7: RTCCLK / 256 (128 Гц, когда RTCCLK = 32768 Гц)

TAMPTS (бит 7): активация метки времени (timestamp) на детектировании события взлома (tamper detection event).

0: событие детектирования уровня не приводит к сохранению метки времени.
1: сохранение метки времени на событии детектирования взлома.

TAMPTS действует даже если TSE=0 в регистре RTC_CR.

Биты 6:5 зарезервированы, и всегда считываются как 0.

TAMP2TRG (бит 4): активный уровень для входа 2 детектирования взлома (tamper 2).

Если TAMPFLT != 00:

0: если на TAMPER2 лог. 0, то это вызывает срабатывание детектирования события взлома.
1: если на TAMPER2 лог. 1, то это вызывает срабатывание детектирования события взлома.

Если TAMPFLT = 00:

0: фронт нарастания уровня на TAMPER2 вызывает срабатывание детектирования события взлома.
1: спад уровня на TAMPER2 вызывает срабатывание детектирования события взлома.

TAMP2E (бит 3): TAMPer 2 detection Enable, разрешение детектирования взлома на входе 2.

0: детектирование Tamper 2 запрещено.
1: детектирование Tamper 2 разрешено.

TAMPIE (бит 2): TAMPer Interrupt Enable, разрешение прерывания на событии взлома.

0: прерывание Tamper запрещено.
1: прерывание Tamper разрешено.

TAMP1TRG (бит 1): активный уровень для входа 1 детектирования взлома (tamper 1).

Если TAMPFLT != 00:

0: если на TAMPER1 лог. 0, то это вызывает срабатывание детектирования события взлома.
1: если на TAMPER1 лог. 1, то это вызывает срабатывание детектирования события взлома.

Если TAMPFLT = 00:

0: фронт нарастания уровня на TAMPER1 вызывает срабатывание детектирования события взлома.
1: спад уровня на TAMPER1 вызывает срабатывание детектирования события взлома.

Внимание: когда TAMPFLT=0, TAMPxE должен быть сброшен при изменении TAMPxTRG, чтобы избежать случайной установки TAMPxF.

TAMP1E (бит 0): TAMPer 1 detection Enable, разрешение детектирования взлома на входе 1.

0: детектирование Tamper 1 запрещено.
1: детектирование Tamper 1 разрешено.

Смещение адреса: 0x44
Значение после сброса домена backup: 0x00000000
Системный сброс не влияет на содержимое регистра.

   31      30       29       28       27       26       25       24       23       22       21       20       19       18       17       16   
зарезервировано
MASKSS[3:0]
rw
зарезервировано
   15       14       13       12       11       10       9       8       7       6       5       4       3       2       1       0   
зарез. SS[14:0]
rw

Биты 31:28 зарезервированы.

MASKSS[3:0] (биты 27:24): маска старших бит, начиная с этого бита.

0: нет сравнения на субсекундах для Alarm A. Будильник устанавливается, когда инкрементируется единица секунд (подразумевая, что остальные поля совпали).
1: SS[14:1] не используются для сравнения Alarm A, сравнивается только SS[0].

2: SS[14:2] не используются для сравнения Alarm A, сравниваются только SS[1:0].
3: SS[14:3] не используются для сравнения Alarm A, сравниваются только SS[2:0].
...
12: SS[14:12] не используются для сравнения Alarm A, сравниваются только SS[11:0].
13: SS[14:13] не используются для сравнения Alarm A, сравниваются только SS[12:0].
14: SS[14] не используется для сравнения Alarm A, сравниваются только SS[13:0].
15: все 15 бит SS сравниваются, и должны совпасть для активации будильника.

Биты переполнения синхронного счетчика (биты 15) никогда не сравниваются. Этот бит может отличаться от 0 только после операции сдвига.

Биты 23:15 зарезервированы.

SS[14:0] (биты 14:0): Sub Seconds value, значение субсекунд. Это значение сравнивается с содержимым счетчика синхронного прескалера, чтобы определить срабатывание будильника Alarm A. Сравниваются только бит от 0 до MASKSS-1.

Примечание: регистр RTC_ALRMASSR может быть записан только когда сброшен бит ALRAE в регистре RTC_CR, или в режиме инициализации. Регистр RTC_ALRMASSR защищен от записи. Процедура доступа на запись описана выше, см. секцию "Защита от записи в регистр RTC".

Смещение адреса: 0x48
Значение после сброса домена backup: 0x00000000
Системный сброс не влияет на содержимое регистра.

   31      30       29       28       27       26       25       24       23       22       21       20       19       18       17       16   
зарезервировано
MASKSS[3:0]
rw
зарезервировано
   15       14       13       12       11       10       9       8       7       6       5       4       3       2       1       0   
зарез. SS[14:0]
rw

Биты 31:28 зарезервированы.

MASKSS[3:0] (биты 27:24): маска старших бит, начиная с этого бита.

0: нет сравнения на субсекундах для Alarm B. Будильник устанавливается, когда инкрементируется единица секунд (подразумевая, что остальные поля совпали).
1: SS[14:1] не используются для сравнения Alarm B, сравнивается только SS[0].
2: SS[14:2] не используются для сравнения Alarm B, сравниваются только SS[1:0].
3: SS[14:3] не используются для сравнения Alarm B, сравниваются только SS[2:0].
...
12: SS[14:12] не используются для сравнения Alarm B, сравниваются только SS[11:0].
13: SS[14:13] не используются для сравнения Alarm B, сравниваются только SS[12:0].
14: SS[14] не используется для сравнения Alarm B, сравниваются только SS[13:0].
15: все 15 бит SS сравниваются, и должны совпасть для активации будильника.

Биты переполнения синхронного счетчика (биты 15) никогда не сравниваются. Этот бит может отличаться от 0 только после операции сдвига.

Биты 23:15 зарезервированы.

SS[14:0] (биты 14:0): Sub Seconds value, значение субсекунд. Это значение сравнивается с содержимым счетчика синхронного прескалера, чтобы определить срабатывание будильника Alarm B. Сравниваются только бит от 0 до MASKSS-1.

Примечание: регистр RTC_ALRMBSSR может быть записан только когда сброшен бит ALRAE в регистре RTC_CR, или в режиме инициализации. Регистр RTC_ALRMBSSR защищен от записи. Процедура доступа на запись описана выше, см. секцию "Защита от записи в регистр RTC".

Смещение адреса: от 0x50 до 0x9C
Значение после сброса домена backup: 0x00000000
Системный сброс не влияет на содержимое регистров.

   31      30       29       28       27       26       25       24       23       22       21       20       19       18       17       16   
BKP[31:16]
rw
   15       14       13       12       11       10       9       8       7       6       5       4       3       2       1       0   
BKP[15:0]
rw

BKP[31:0]: приложение может записать данные в эти регистры или прочитать их. Когда подано питание от VBAT, напряжение VDD может быть выключено, и данные при этом сохранятся. Системный сброс не влияет на состояние данных в регистрах RTC backup, и данные сохраняются, когда MCU переведен в один и режимов пониженного энергопотребления.

Эти регистры сбрасываются на при событии детектирования взлома (tamper detection event), пока TAMPxF=1.

[VBAT и потребление тока от батарейки]

Чтобы не сбросились данные часов и они работали при отключении основного питания VDD, на ножку VBAT микроконтроллера подается резервное питание (это может быть внешний источник напряжения от 1.65V до 3.6V, обычно литиевая батарейка). Потребляемый от VBAT ток зависит от наличия напряжения питания VDD, от работы генератора LSE (кварцевый генератор 32768 Гц), от активации Backup SRAM (4 килобайта). Вот какая информация по току потребления приведена в даташите [2]:

Таблица 29. Типовой и максимальный ток потребления в режиме питания от VBAT, мкА.

Условия измерения(1)
NOM, мкА
MAX(2)
TA=25°C TA=85°C TA=105°C
VBAT=1.7V VBAT=2.4V VBAT=3.3V VBAT=3.6V
Backup SRAM ON, LSE ON, RTC ON 1.28 1.40 1.62 6 11
Backup SRAM OFF, LSE ON, RTC ON 0.66 0.76 0.97 3 5
Backup SRAM ON, LSE OFF, RTC OFF 0.70 0.72 0.74 5 10
Backup SRAM OFF, LSE OFF, RTC OFF 0.10 0.10 0.10 2 4

Примечания:

(1) Использовался кварц Abracon ABS07-120-32.768 kHz-T и нагрузочные конденсаторы CL типового значения 6 пФ.
(2) Гарантируется результатами испытаний.

Попробовал измерить ток потребления от VBAT на плате 32F429IDISCAVERY, когда запущена в работу память Backup SRAM и работает генератор LSE 32.768 кГц. У меня почему-то получились другие значения:

Условия измерения Ток от VBAT, мкА
VBAT=3.29V, VDD=3.3V 0
VBAT=2.69V, VDD выключено 2
VBAT=3.07V, VDD выключено 11
VBAT=3.29V, VDD выключено 43

По этой причине батарейка CR2016 быстро разряжается, за сутки от 3.3V до 2.7V.

Если генератор LSE не инициализирован и память Backup SRAM не активирована, то при отключенном VDD ток потребления от VBAT мультиметром не регистрируется (практически нулевой).

Этот код тестировался на плате 32F429IDISCAVERY. Не забудьте припаять кварц 32768 Гц (X2), резисторы 0 Ом (R53 и R54) и снять перемычки SB16 и SB17.

[stm32f4xx_hal_msp.c]

/**  * @brief Инициализация RTC, переопределение weak-функции.
  *        HAL_RTC_MspInit вызывается из HAL_RTC_Init.
  * @param hrtc: указатель на дескриптор RTC
  *
  * @note  Следует быть внимательным, когда HAL_RCCEx_PeriphCLKConfig()
  *        используется для выбора источника тактов RTC. В этом случае
  *        Backup domain будет сброшен для модификации источника тактов
  *        RTC, и как следствие регистры RTC (включая backup-регистры)
  *        и регистр RCC_BDCR установятся в их состояние сброса. */
void HAL_RTC_MspInit(RTC_HandleTypeDef *hrtc)
{
   RCC_OscInitTypeDef        RCC_OscInitStruct;
   RCC_PeriphCLKInitTypeDef  PeriphClkInitStruct;
  
   /*##-2- В качестве тактов для RTC используется LSE #####################*/
   RCC_OscInitStruct.OscillatorType =  RCC_OSCILLATORTYPE_LSE;
   RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE;
   RCC_OscInitStruct.LSEState = RCC_LSE_ON;
   if(HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
   { 
      HALerrorHandler(__FILE__, __LINE__);
   }
  
   PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_RTC;
   PeriphClkInitStruct.RTCClockSelection = RCC_RTCCLKSOURCE_LSE;
   if(HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK)
   { 
      HALerrorHandler(__FILE__, __LINE__);
   }
  
   /*##-3- Разрешение тактирования RTC ####################################*/
   __HAL_RCC_RTC_ENABLE();
}
 
/**
  * @brief Отмена инициализации RTC
  * @param hrtc: указатель на дескриптор RTC */
void HAL_RTC_MspDeInit(RTC_HandleTypeDef *hrtc)
{
  /*##-1- Сброс периферии #################################################*/
  __HAL_RCC_RTC_DISABLE();
  /*##-2- Запрет тактов PWR и доступа к домену backup #####################*/
  HAL_PWR_DisableBkUpAccess();
  __HAL_RCC_PWR_CLK_DISABLE();  
}

[rtcapp.h]

#pragma once#include "stm32f4xx_hal.h"
#include "stm32f4xx_ll_rtc.h"
#include "stm32f4xx_ll_rcc.h"
 
extern RTC_HandleTypeDef RtcHandle;
 
HAL_StatusTypeDef RTC_Init (void);
void RTC_CalendarShow (void);
bool GetTimeFromString (RTC_TimeTypeDef *pt, char *st);
bool GetDateFromString (RTC_DateTypeDef *pd, char *st);
void Fix_Date(RTC_DateTypeDef* date, bool set_max);
int dow (int year, int month, int day);

[rtcapp.c]

#include < stdbool.h>
#include "rtcapp.h"
#include "errors.h"
#include "umsg.h"
 
#define RTC_ASYNCH_PREDIV  0x7F   /* LSE в качестве тактов RTC */
#define RTC_SYNCH_PREDIV   0x00FF /* LSE в качестве тактов RTC */
 
RTC_HandleTypeDef RtcHandle;
 
////////////////////////////////////////////////////////////////////////////
// Блок вычисление дня недели из года, месяца и дня. Взято отсюда:
// How to calculate day of the week for RTC?
// https://electronics.stackexchange.com/questions/66285/how-to-calculate-day-of-the-week-for-rtc
 
/* Возвратит количество дней до начала указанного года, с учетом
 * високосных годов, но без смещения от Юлианского календаря
 * к Грегорианскому. Вместо этого Григореанский календарь
 * экстраполируется обратно во времени к гипотетическому
 * "нулевому" году. */
static int leap (int year)
{
  return year*365 + (year/4) - (year/100) + (year/400);
}
 
/* Вернет количество дней от 1 марта гипотетического года 0, без учета перехода
 * от Юлианского календаря к Грегорианскому, произошедщему в 16 веке. Алгоритм
 * основан на функции, известной как "Zeller's Congruence".
 * MOD 7 дает день недели, где 0 = понедельник и 6 = воскресенье. */
static int zeller (int year, int month, int day)
{
  year += ((month+9)/12) - 1;
  month = (month+9) % 12;
  return leap (year) + month*30 + ((6*month+5)/10) + day + 1;
}
 
/* Вернет день недели (1=понедельник, 7=воскресенье) от указанной даты. */
int dow (int year, int month, int day)
{
  return (zeller (year, month, day) % 7) + 1;
}
// Конец блока
////////////////////////////////////////////////////////////////////////////
 
static const char* DowToText (uint8_t dowval)
{
   switch(dowval)
   {
   case 1:
      return "Понедельник";
   case 2:
      return "Вторник";
   case 3:
      return "Среда";
   case 4:
      return "Четверг";
   case 5:
      return "Пятница";
   case 6:
      return "Суббота";
   case 7:
      return "Воскресенье";
   default:
      return "???";
   }
}
 
// Исправляет значение даты, ориентируясь на месяц и год.
// Флажок set_max выбирает тип исправления, если дата неправильная:
// set_max = 0: дата установится равной 1
// set_max = 1: дата установится равной максимальному числу месяца
// Идея взята отсюда: https://github.com/afiskon/stm32-rtc-example
void Fix_Date(RTC_DateTypeDef* date, bool set_max)
{
   uint8_t days_in_month;
   
   if(date->Date == 0)
   {
      date->Date = 1;
      return; // другие проверки не нужны
   }
   if(date->Date < 29)
   {
      return; // в этом случае дата всегда правильная
   }
   // Проверка года на високосность.
   // Поскольку Year всегда в пределах 0..99, не нужно проверять
   // случаи (Year % 100) и (Year % 400):
   bool is_leap = (date->Year % 4) == 0;
   // Получение количества дней в месяце:
   switch(date->Month)
   {
   case RTC_MONTH_FEBRUARY:
      // В феврале может быть 29 (високосный год) или 28 дней:
      days_in_month = is_leap ? 29 : 28;
      break;
   case RTC_MONTH_APRIL:
   case RTC_MONTH_JUNE:
   case RTC_MONTH_SEPTEMBER:
   case RTC_MONTH_NOVEMBER:
      // В апреле, июне, сентябре и ноябре 30 дней:
      days_in_month = 30;
      break;
   default:
      // В других месяцах 31 день:
      days_in_month = 31;
   }
   // Корректировка даты:
   if(date->Date > days_in_month)
      date->Date = set_max ? days_in_month : 1;
}
 
/**
  * @brief  Конфигурирование времени и даты.  */
static void RTC_CalendarConfig(void)
{
   RTC_DateTypeDef sdatestructure;
   RTC_TimeTypeDef stimestructure;
   /*##-1- Конфигурирование даты ##########################################*/
   /* Дата: вторник, 18 февраля 2014 года */
   sdatestructure.Year = 0x14;
   sdatestructure.Month = RTC_MONTH_FEBRUARY;
   sdatestructure.Date = 0x18;
   sdatestructure.WeekDay = RTC_WEEKDAY_TUESDAY;
  
   if(HAL_RTC_SetDate(&RtcHandle,&sdatestructure,RTC_FORMAT_BCD) != HAL_OK)
   {
      /* Ошибка инициализации */
      HALerrorHandler(__FILE__, __LINE__);
   }
   /*##-2- Конфигурирование времени #######################################*/
   /* Время: 02:00:00 */
   stimestructure.Hours = 0x02;
   stimestructure.Minutes = 0x00;
   stimestructure.Seconds = 0x00;
   stimestructure.TimeFormat = RTC_HOURFORMAT12_AM;
   stimestructure.DayLightSaving = RTC_DAYLIGHTSAVING_NONE ;
   stimestructure.StoreOperation = RTC_STOREOPERATION_RESET;
   if (HAL_RTC_SetTime(&RtcHandle, &stimestructure, RTC_FORMAT_BCD) != HAL_OK)
   {
      /* Ошибка инициализации */
      HALerrorHandler(__FILE__, __LINE__);
   }
   /*##-3- Тестовая запись в RTC Backup data Register1 ####################*/
   //HAL_RTCEx_BKUPWrite(&RtcHandle, RTC_BKP_DR1, 0x32F2);
}
 
HAL_StatusTypeDef RTC_Init (void)
{
   HAL_StatusTypeDef status;
   __HAL_RTC_RESET_HANDLE_STATE(&RtcHandle);
   do
   {
      /*##-1- Конфигурирование периферийного устройства RTC ###############*/
      /* Конфигурирование прескалера RTC и регистров данных RTC
         следующим образом:
         - Формат часа    = 24 часа в сутках
         - Asynch Prediv  = значение в соответствии с источником тактов
         - Synch Prediv   = значение в соответствии с источником тактов
         - OutPut         = выход запрещен
         - OutPutPolarity = положительная полярность
         - OutPutType     = открытый сток (Open Drain) */
      RtcHandle.Instance = RTC; 
      RtcHandle.Init.HourFormat = RTC_HOURFORMAT_24;
      RtcHandle.Init.AsynchPrediv = RTC_ASYNCH_PREDIV;
      RtcHandle.Init.SynchPrediv = RTC_SYNCH_PREDIV;
      RtcHandle.Init.OutPut = RTC_OUTPUT_DISABLE;
      RtcHandle.Init.OutPutPolarity = RTC_OUTPUT_POLARITY_HIGH;
      RtcHandle.Init.OutPutType = RTC_OUTPUT_TYPE_OPENDRAIN;
      status = HAL_RTC_Init(&RtcHandle);
      if (HAL_OK != status)
      {
         umsg("Ошибка HAL_RTC_Init\n");
         break;
      }
      if (0 == LL_RTC_IsActiveFlag_INITS(RtcHandle.Instance))
      {
         umsg("RTC еще не сконфигурированы\n");
         RTC_CalendarConfig();
      }
   }
   while(false);
   return status;
}
 
void RTC_CalendarShow (void)
{
   RTC_DateTypeDef sdatestructureget;
   RTC_TimeTypeDef stimestructureget;
   /* Получение текущего времени: */
   HAL_RTC_GetTime(&RtcHandle, &stimestructureget, RTC_FORMAT_BIN);
   /* Получение текущей даты. Внимание: функции HAL_RTC_GetTime и
      HAL_RTC_GetDate всегда должны вызываться парами, именно
      в таком порядке! */
   HAL_RTC_GetDate(&RtcHandle, &sdatestructureget, RTC_FORMAT_BIN);
   /* Формат отображения времени: hh:mm:ss */
   umsg("%02d:%02d:%02d\n", stimestructureget.Hours,
                            stimestructureget.Minutes,
                            stimestructureget.Seconds);
   /* Формат отображения даты: dd-mm-yyyy */
   int day_of_week = dow(sdatestructureget.Year,
                         sdatestructureget.Month,
                         sdatestructureget.Date);
   umsg("%02d-%02d-%02d, %s\n", sdatestructureget.Date,
                                sdatestructureget.Month,
                                2000 + sdatestructureget.Year,
                                DowToText(day_of_week));
}
 
//////////////////////////////////////////////////////////////////////////
// Считывает информацию времени из строки, и если считывание было
// удачным, то заполнит *pt и вернет true.
// Формат строки источника hh:mm:ss || hh:mm || hh
bool GetTimeFromString (RTC_TimeTypeDef *pt, char *st)
{
   RTC_TimeTypeDef stimestructure;
   RTC_DateTypeDef sdatestructure;
   uint8_t valH, valM, valS;
   
   /* Получение текущего времени: */
   HAL_RTC_GetTime(&RtcHandle, &stimestructure, RTC_FORMAT_BIN);
   HAL_RTC_GetDate(&RtcHandle, &sdatestructure, RTC_FORMAT_BIN);
   /* Внимание: функции HAL_RTC_GetTime и HAL_RTC_GetDate всегда
      должны вызываться парами, именно  в таком порядке! */
   bool result = false;
   switch(strlen(st))
   {
   case 2:
      // hh
      if (1 == sscanf(st, "%hhu", &valH))
      {
         if (valH < 24)
         {
            stimestructure.Hours = valH;
            result = true;
         }
      }
      break;
   case 5:
      // hh:mm
      if (2 == sscanf(st, "%hhu:%hhu", &valH, &valM))
      {
         if ((valH < 24) && (valM < 59))
         {
            stimestructure.Hours   = valH;
            stimestructure.Minutes = valM;
            result = true;
         }
      }
      break;
   case 8:
      // hh:mm:ss
      if (3 == sscanf(st, "%hhu:%hhu:%hhu", &valH, &valM, &valS))
      {
         if ((valH < 24) && (valM < 59) && (valS < 59))
         {
            stimestructure.Hours   = valH;
            stimestructure.Minutes = valM;
            stimestructure.Seconds = valS;
            result = true;
         }
      }
      break;
   }
   if (result)
      *pt = stimestructure;
   return result;
}
 
//////////////////////////////////////////////////////////////////////////
// Считывает информацию даты из строки, и если считывание было удачным,
// то заполнит *pd и вернет true.
// Формат строки источника DD-MM-YY || DD-MM || DD
bool GetDateFromString (RTC_DateTypeDef *pd, char *st)
{
   RTC_TimeTypeDef stimestructure;
   RTC_DateTypeDef sdatestructure;
   uint8_t valY, valM, valD;
   
   /* Получение текущей даты: */
   HAL_RTC_GetTime(&RtcHandle, &stimestructure, RTC_FORMAT_BIN);
   HAL_RTC_GetDate(&RtcHandle, &sdatestructure, RTC_FORMAT_BIN);
   /* Внимание: функции HAL_RTC_GetTime и HAL_RTC_GetDate всегда
      должны вызываться парами, именно  в таком порядке! */
   bool result = false;
   switch(strlen(st))
   {
   case 2:
      // DD
      if (1 == sscanf(st, "%hhu", &valD))
      {
         if ((valD < 32) && (valD > 0))
         {
            sdatestructure.Date = valD;
            result = true;
         }
      }
      break;
   case 5:
      // DD-MM
      if (2 == sscanf(st, "%hhu-%hhu", &valD, &valM))
      {
         if ((valD < 32) && (valD > 0) && (valM < 13) && (valM > 0))
         {
            sdatestructure.Date  = valD;
            sdatestructure.Month = valM;
            result = true;
         }
      }
      break;
   case 8:
      // DD-MM-YY
      if (3 == sscanf(st, "%hhu-%hhu-%hhu", &valD, &valM, &valY))
      {
         if ((valD < 32) && (valD > 0) && (valM < 13) && (valM > 0) && (valY < 100))
         {
            sdatestructure.Date  = valD;
            sdatestructure.Month = valM;
            sdatestructure.Year  = valY;
            result = true;
         }
      }
      break;
   }
   if (result)
      *pd = sdatestructure;
   return result;
}

Пример запуска часов из функции main:

int main(void)
{
   /* Конфигурация MCU -------------------------------------------------------*/
   /* Сброс всех периферийных устройств, инициализация интерфейса Flash и Systick. */
   HAL_Init();
   /* Конфигурирование системных тактов: */
   SystemClock_Config();
   MX_GPIO_Init();
   ConfigureOutput();
   /* Инициализация SDRAM перед портом USART: */
   BSP_SDRAM_Init();
   MX_USART1_Init();
   // Инициализация энергонезависимой памяти:
   TM_BKPSRAM_Init();
   // Инициализация RTC:
   RTC_Init();
   ...

Функция RTC_Init проверяет с помощью проверки флага INITS определяет, был ли инициализирован блок RTC. Если нет, то производится начальная установка часов произвольной датой с помощью функции RTC_CalendarConfig. Текущие время и дата часов могут быть считаны и отображены с помощью фунции RTC_CalendarShow.

Время и дата устанавливаются с помощью функций HAL_RTC_SetTime и HAL_RTC_SetDate соответственно. Пример кода обработчика команд CMD_RTC_TIME и CMD_RTC_DATE, который берет из строк данные времени и даты и соответствующим образом перенастраивает RTC:

      ...
      else if (CmdOK(cmd, CMD_RTC_TIME))
      {
         umsg("\n");
         if (strlen(CMD_RTC_TIME) != strlen(cmd))
         {
            result = false;
            do
            {
               if(!GetTimeFromString(&stimestructure, cmd+strlen(CMD_RTC_TIME)+1))
                  break;
               if (HAL_RTC_SetTime(&RtcHandle, &stimestructure, RTC_FORMAT_BIN) != HAL_OK)
                  break;
               result = true;
            }
            while(false);
            if (!result)
            {
               umsg("Ошибка установки времени\n");
            }
         }
         else
         {
            RTC_CalendarShow();
         }
         prompt();
      }
      else if (CmdOK(cmd, CMD_RTC_DATE))
      {
         umsg("\n");
         if (strlen(CMD_RTC_DATE) != strlen(cmd))
         {
            result = false;
            do
            {
               if(!GetDateFromString(&sdatestructure, cmd+strlen(CMD_RTC_DATE)+1))
                  break;
               Fix_Date(&sdatestructure, true);
               if (HAL_RTC_SetDate(&RtcHandle, &sdatestructure, RTC_FORMAT_BIN) != HAL_OK)
                  break;
               sdatestructure.WeekDay = dow(sdatestructure.Year,
                                            sdatestructure.Month,
                                            sdatestructure.Date);
               result = true;
            }
            while(false);
            if (!result)
            {
               umsg("Ошибка установки даты\n");
            }
         }
         else
         {
            RTC_CalendarShow();
         }
         prompt();
      }
      ...

[Ссылки]

1. RM0090 Reference manual STM32F405/415, STM32F407/417, STM32F427/437 and STM32F429/439 advanced Arm®-based 32-bit MCUs site:st.com.
2. STM32F427xx STM32F429xx Arm® Cortex®-M4 MCU+FPU site:st.com.
3. STM32F429: GPIO и альтернативные функции.
4. The Doomsday Algorithm - Calculating the Weekday of any given Date site:timeanddate.com.