RTC HAL stm32
Речь пойдёт о программировании RTC (встроенных часов) в микроконтроллере stm32.
Описание сделано для F103 и F303, но так как у них много общих функций, то читать нужно всё.
Первым делом нужно указать источник тактирования для часов. Указываем внешний кварцевый резонатор, он есть на многих платах…
В CubeMX выбираем RCC и указываем — Low Speed External (LSE) ⇨ Crystal/Ceramic Resonator
В мультиплексоре RTC Clock Mux нужно указать источник LSE…
Если внешнего кварца нет, тогда в мультиплексоре укажите LSI, а Low Speed External (LSE) ⇨ Disable.
Переходим в раздел RTC и делаем так…
Для F103
Data Format ⇨ Binary data format .
Со временем и календарём всё понятно. Формат 24-х часовой.
Auto Predivider Calcalation ⇨ Enabled — активирован автоматический расчёт предделителя.
Asynchronous Predivider value — предделитель часового кварца. С его помощью достигается тактирование в 1Гц (один тик в одну секунду). Если отключить автоматический режим, то нужно будет ввести число от 0 до 127.
Для F303
Здесь два предделителя для настройки частоты — Asynchronous Predivider value и Synchronous Predivider value . Для внешнего кварца укажите 127 и 255.
Если у Вас LSI 40kHz, тогда во втором предделителе укажите 311. Если частота другая, тогда смотрите ниже.
Настройка предделителей для разных источников тактирования…
У нас тактируется от LSE = 32.768кГц, тогда исходя из формулы получается следующее: 128 * 256 = 32768 / 32.768кГц = 1Гц (один тик в секунду). Если уменьшить или увеличить какое-нибудь значение, то часы пойдут быстрее или медленнее.
Hour Format — можно изменить формат времени 12/24.
Day Light Saving: value of hour adjustment — зимнее/летнее время (добавляет/вычитает один час из текущего времени).
Пишем код. В функции static void MX_RTC_Init(void) есть две структуры, их надо объявить как глобальные…
И заодно объявим массив для вывода данных в UART.
У F303 структура даты называется sDate.
В бесконечном цикле будем читать дату и время:
Если на пин Vbat подключить батерейку или просто подать 3 вольта, тогда после ресета данные будут сохраняться. Предварительно нужно в функции static void MX_RTC_Init(void) закомментировать установку времени и даты…
Эти же функции можно использовать где-нибудь в программе для изменения времени/даты на лету.
Теперь можно прошить ещё раз и понажимать ресет. Данные должны сохраняться.
Помните о том, что при повторной генерации проекта в CubeMX комментарии удалятся!
У микроконтроллера F103, дата не сохраняется. Это связано с тем, что F103 всего один 32-х битный регистр, см. спойлер…
Вот так выглядит схема RTC в F103…
От батарейки работает только регистр со временем и будильником, ну и ещё предделитель. То есть дату сохранить нельзя.
Но, дату сохранить нельзя только если пользоваться HAL, если же написать свой костыль, тогда в RTC_CNT можно сохранять дату/время в UNIX-формате, то есть количество секунд прошедшее с 1970 года. А потом средствами СИ вытаскивать из этого числа дату и время.
У более «жирных» камней сохраняется и дата и время.
Если используется LSI, то данные сохранятся, но время идти не будет.
Если у вас микроконтроллер F4xx или F7xx, и вы хотите считывать только время (без даты), то в любом случае нужно после функции HAL_RTC_GetTime(. ) вызывать HAL_RTC_GetDate(. ) , в противном случае время не будет обновляться.
Будильник (Alarm) для F103
Будильник сработает через пять секунд после старта.
RTC OUT ⇨ RTC Output on the Tamper pin — во время срабатывания будильника на tamper-пин (РС13) будет подан кратковременный импульс. Можно подключить светодиод и посмотреть. На плате BluePill увидеть что-либо трудно так как импульс очень уж слабенький (я подключал через транзистор).
Output ⇨ Alarm pulse signal on the TAMPER pin — во время срабатывания будильника подаётся импульс. При выборе этого режима появляется пункт с настройкой будильника — Alarm A .
Можно сгенерировать проект, прошить и посмотреть как мигнёт светодиод.
Output ⇨ RTC clock with a frequency divided by 64 on the TAMPER pin — на tamper-пин будет подана частота с часового кварца поделённая на 64. Можно осциллографом проверять точность кварца.
Output ⇨ Second pulse signal on the TAMPER pin — на tamper-пин будет подаваться импульс раз в секунду.
После того как попробуете эти режимы верните всё как на картинке.
Включите прерывание от будильника…
Будильник соединён с линией EXTI17 – RTC Alert event.
Добавьте колбек будильника:
Прошивайте и смотрите результат.
Чтобы посмотреть настройки будильника из программы, нужно вызвать функцию HAL_RTC_GetAlarm() …
Структуру будильника объявим как глобальную:
Для программной установки будильника нужно воспользоваться функцией HAL_RTC_SetAlarm_IT() , она есть в функции инициализации — static void MX_RTC_Init(void) .
Помимо прерывания от будильника, есть ещё прерывание, которое может вызываться раз в секунду.
Включите глобальное прерывание…
Добавьте ещё один колбек:
Перед бесконечным циклом добавьте функцию:
Прошейте и смотрите.
Как использовать этот функционал — например можно сделать так: в колбеке будильника запускаем это прерывание, после чего оно вызовется 10 раз и выключится. В прерывании можно делать что угодно, например подавать импульс на какой-нибудь пин с подключённой пищалкой.
Если установить RTC OUT ⇨ Disable …
… то режимы Output ⇨ RTC clock with a frequency divided by 64 on the TAMPER pin и Output ⇨ Second pulse signal on the TAMPER pin будут работать, а если RTC OUT ⇨ No RTC Output , то на tamper-пин ничего нельзя подать.
Tamper для F103 и F303
В RTC OUT указывайте что хотите. Calendar можно включить, а можно и не включать.
До этого мы использовали tamper-пин для вывода сигнала, а сейчас он будет выполнять обратную функцию.
У F103 есть десять 16-ти битных регистров для хранения пользовательских данных (backup registers). Если подключена батарейка, то данные в этих регистрах не обнуляются ни при нажатии Reset, ни при выходе из спящего режима, ни при отключении основного питания.
Если в эти регистры записать какие-то данные, то их можно будет стереть подав на tamper-пин кратковременный импульс.
В Reference manual предлагается использовать этот функционал в качестве контроля несанкционированного доступа к устройству. Видимо поэтому это назвали Tamper (вмешательство).
Какой именно сигнал послужит триггером, настраивается в пункте Tamper Trigger .
Rising Edge — с LOW на HIGH.
Falling Edge — с HIGH на LOW.
Внутренняя подтяжка такая слабенькая, что срабатывает от прикосновения пальца, поэтому желательно подтянуть пин к «плюсу» резистором (10КОм).
Запишем в первые два регистра данные:
В бесконечном цикле читаем эти данные:
Прошейте эту программу и коротните пин на «землю» — данные обнулятся.
Теперь если нажать Reset, то по идее данные должны будут записаться заново, но этого не случится. Дело в том, что после подачи сигнала запись в эти регистры будет запрещена. Чтобы восстановить возможность записи нужно полностью обесточить плату (батарейку тоже нужно отключить). Так происходит только в режиме Tamper, если его отключить, то эти регистры можно перезаписывать как угодно.
Помимо обнуления регистров этот сигнал может вызывать прерывание…
В программе нужно добавить только колбек:
Если включено прерывание, то при нажатии Reset регистры с данными будут перезаписываться!
Для работы без прерываний можно воспользоваться функцией ожидания сигнала.
Структуру тампера объявляем глобально:
В бесконечном цикле делаем так:
Опять же, при нажатии Reset регистры с данными будут перезаписываться.
У F303 15 пользовательских регистров и три tamper-пина.
Прерывания включаются так…
У каждого пина свой колбек:
Всё остальное как у F103.
Я когда ковырялся с этим функционалом, время от времени возникало ощущение что что-то «глючит» (регистры то записываются, то не записываются, то обнуляются, то не обнуляются), но потом стало понятно что это всего лишь следствие неправильных действий. Это к тому, что нужно проявить терпение и разобраться.
Будильник (Alarm) для F303
У этого микроконтроллера два будильника А и В…
У них есть два варианта настроек:
Internal Alarm — просто будильник, может вызывать прерывание.
Routed to OUT — во время срабатывания будильника можно вызвать прерывание и/или подать кратковременный импульс на пин РС13 .
Сейчас укажите Internal Alarm А .
Настройте всё как на картинке…
Время у нас установлено 10:34:00, а будильник сработает в 10:34:10.
Sub Seconds — это миллисекунды.
Следующие пункты, это различные комбинации настроек времени/даты срабатывания будильника. Например пункт Alarm Mask Date Week day ⇨ Enable говорит о том, что будильник должен срабатывать каждый день.
Если активировать пункт Alarm Mask Minutes ⇨ Enable , то будильник будет срабатывать каждую минуту в течении часа. Срабатывания будут происходить не ровно в минуту, а минута + 10сек.
Если активировать пункт Alarm Mask Seconds ⇨ Enable , то срабатывать будет каждую секунду в течении минуты.
Этих комбинаций достаточно много, поэтому надеюсь что вы разберётесь самостоятельно.
Активируйте прерывание от будильника…
В код добавьте колбек:
У Alarm B свой колбек:
В бесконечном цикле будем выводить инфу:
Чтобы будильник подавал импульс на пин РС13, надо указать Routed to OUT …
В настройках появятся два дополнительных пункта…
Output Polarity — на ножку будет подаваться «плюс».
Output Type — почитайте здесь.
Делайте как на картинке и не забудьте будильник настроить, он сбивается при изменении режима.
Подключите светодиод к пину РС13 и смотрите как он мигнёт во время срабатывания будильника.
WakeUp
WakeUp может выводить МК из спящего режима, вызывать прерывание и подавать сигнал на пин РС13.
WakeUp это простой 16-ти битный (от 0 до 65535) счётчик. Тактирование можно настроить с помощью предделителей часового генератора.
Например если сделать так…
Тогда счётчик будет увеличиваться со скоростью 2048 единиц в секунду и достигнет 10000 примерно через 5 секунд (32.768кГц / 16 = 2048, 10000 / 2048 = 4.88 сек). То есть WakeUp будет срабатывать каждые
Можно не заморачиваться с предделителями, а просто указать 1Hz…
Счётчик будет увеличиваться со скоростью 1 единица в секунду и срабатывать через каждые 5 сек.
Таким образом можно настроить пробуждение МК на достаточно большой интервал. Например если указать 65000, то WakeUp будет срабатывать каждые 18 часов.
Если включено прерывание, то на пин РС13 подаётся кратковременный импульс, а если отключено, то подаётся постоянный сигнал.
И добавьте соответствующий колбек:
Прошивайте и смотрите что получилось.
Посмотреть значение счётчика можно так:
TimeStamp
Прикольная функция. Если на пин РС13 подать внешний импульс, тогда в специальные регистры будут записаны текущие время и дата. Настройка только одна и она ничем не отличается от того, что написано в главе «Tamper для F103 и F303». То есть нужно указать фронт сигнала и подтянуть пин.
В бесконечном цикле сделайте так:
Прошейте МК и коротните РС13 на «землю».
Данные из регистров записываются в структуры времени и даты (чтоб не создавать дополнительные структуры).
Обратите внимание на то, что регистры обнуляются после чтения.
Прерывание то же что и у Tamper…
Calibration
В мануале про этот выход сказано так:
«Выход RTC_CALIB используется для генерации сигнала переменной частоты. В зависимости от пожелания пользователя этот сигнал может играть роль опорной частоты для внешнего устройства или его можно подключить к зуммеру для генерации звука.»
Есть два варианты частоты — 1Гц и 512Гц…
Запускается и останавливается этот сигнал функциями…
Можно помигать или попищать при срабатывании будильника.
Для калибровки часов этот выход нужно подключить к осциллографу и добиваться необходимой частоты двумя способами:
1. Манипулировать предделителями — грубая калибровка.
2. С помощью пропусков (маскировки) или добавления тактов — мягкая калибровка.
Осциллографа у меня нет поэтому я особо в этом не разбирался. За мягкую калибровку отвечает функция HAL_RTCEx_SetSmoothCalib() . Все подробности смотрите в AN3371, глава 1.4, стр. 17.
Reference clock detection — на это пин можно подать опорную частоту (50 Гц) из розетки. Проводить эксперименты я не решился
В мануале есть такая картика…
В статье не описаны некоторые функции — посмотреть их можно в файлах stm32f3xx_hal_rtc.c и stm32f3xx_hal_rtc_ex.c.
На этом всё.
Всем спасибо
Tamper rtc что это
Блок часов реального времени (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].
Рис. 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, и максимальный 2 22 . Это соответствует максимальной входной тактовой частоте около 4 МГц.
fck_apre вычисляется по следующей формуле:
Тактовая частота ck_apre используется для тактирования двоичного счетчика субсекунд RTC_SSR. Он считает вниз, и когда достигает 0, RTC_SSR перезагружается содержимым PREDIV_S.
fck_spre вычисляется по следующей формуле:
Тактовая частота 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. В этом последнем случае значение 2 16 добавляется к текущему значению 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) / (2 20 + 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) / (2 20 + 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.
STM32 RTC, Calendar.
Начнем с того, что RTC — это аббревиатура которая расшифровывается следующим образом Real-time clock или по-русски, часы реального времени. В былые времена, при использовании МК AVR в качестве RTC, использовал отдельную микросхему, общение с которой происходило по определенному протоколу. У STM32 RTC же представляет собой модуль, реализованный внутри МК.
- Автоматическое пробуждение во всех режимах энергосбережения
- Независимый BCD таймер счетчик. Отсчет времени и календарь реализованы аппаратно, с возможностью настройки сигнализирующих прерываний.
- Программный флаг пробуждения с возможностью вызова прерывания.
- Два 32-х разрядных регистра, в которых хранятся секунды, минуты, часы(в 12 часовом или 24 часовом формате), день недели, день месяца, месяц и год. Секунды хранятся в двоичном формате, все остальное в двоично-десятичном.
- Компенсация длинны месяца(а также високосного года) выполняется автоматически. Также возможна компенсация летнего времени.
- Два 32-х разрядных регистра программируемых сигнализирующих прерываний.
- Наличие калибровки для компенсации отклонения кварцевого резонатора.
- После сброса область RTC защищена от случайной записи.
- До тех пор пока напряжение питания RTC остается в рабочем диапазоне, он будет работать в не зависимости от режима работы(Run mode, low-power mode or under reset).
- Для повышения точности, можно синхронизировать часы с сетью 50 или 60Hz.
- Возможно записывать время возникновения события, так называемый Time-stamp.
- Определение вмешательства(tamper), при этом сбрасываются все backup регистры.
- Alarm A
- Alarm B
- Wakeup interrupt
- Time-stamp
- Tamper detection
В качестве примера предлагаю рассмотреть как запустить часы и настроить календарь, но перед этим рассмотрим внутреннюю структуру RTC.
- LSI — низкочастотный внутренний RC-генератор на 40 KHz.
- LSE — внешний, «часовой» кварцевый резонатор на 32 768 Hz.
- HSE/32 — внешний высокочастотный кварцевый резонатор с предделителем 32.
LSEON(LSE oscillator enable) — включение LSE.
LSERDY(LSE oscillator ready) — флаг готовности LSE.
LSEBYP(LSE oscillator bypass) — единица в этом бите позволяет тактировать RTC от внешнего источника. Внешний тактовый сигнал (меандр, синус или треугольник) со скважностью 50% подаётся только на вывод OSC32_IN, при этом вывод OSC32_OUT можно использовать в качестве GPIO.
- 00: нижний
- 01: между нижним и средним
- 10: между средним и высоким
- 11: высокий, значение по умолчанию
- 01: LSE выступает в качестве источника.
- 10: LSI выступает в качестве источника.
- 11: HSE/32 выступает в качестве источника.
BDRST(Backup domain software reset) — единица в этом бите полностью сбрасывает значение Backup domain.
После того как выбран источник тактирования необходимо позаботится о том, чтобы счетные регистры RTC тактировались с частотой один 1Hz. Для понижения частоты тактирования до 1Hz предназначены два предделителя, синхронный и асинхронный.
Изначально значения PREDIV_A = 127, PREDIV_S = 255, что позволяет из 32768 Hz получить 1 Hz .
Для установки времени выделен один 32-x битный регистр, разбитый на битовые поля.
Данные в нем хранятся в формате BCD, при чем единицы и десятки в отдельных битовых полях. Думаю пояснения требует только бит PM, отвечающий за формат хранения часов. Если в нем установлен ноль, часы будут тикать от 0 до 24 часов, если единица – от 1 до 12.
С датой все аналогично, она хранится в 32-х битном регистре, разбитом на битовые поля.
Ниже приведен код настройки и запуска часов для STM32F303.
В случае если RTC тактируется от внешнего кварца, необходимо инициализацию LSI заменить следующим кодом.
STM32
Регистры часов реального времени в микроконтроллерах STM32F2xx
Регистры часов реального времени используются для настройки и работы модуля RTC . Для доступа к регистрам необходимо установить бит разрешения записи PWR_CR.DBP и разрешить запись путем последовательного занесения в регистр RTC_WPR чисел 0xCA и 0x53.
Регистр времени RTC _ TR
Регистр времени содержит значение текущего времени в BCD -формате. Доступен для записи только в режиме инициализации
Бит 22. PM: AM/PM – значение (0: AM или 24-часовой формат, 1:PM)
Биты 21:20 HT [1:0] Десятки часов в BCD формате
Биты 19:16 HU [3:0] Единицы часов в BCD формате
Биты 14:12 MNT [2:0] Десятки минут в BCD формате
Биты 11:8 MNU [3:0] Единицы минут в BCD формате
Биты 6:4 ST [2:0] Десятки секунд в BCD формате
Биты 3:0 SU [3:0] Единицы секунд в BCD формате
Регистр даты RTC _ DR
Регистр времени содержит значение текущей даты в BCD -формате. Доступен для записи только в режиме инициализации
Биты 23:20 YT[3:0] Десятки лет в BCD формате
Биты 19:16 YU [3:0] Единицы лет в BCD формате
Биты 15:13 WDU [2:0] День недели
— 000: не используется
Бит 12 MT Десятки месяца в BCD формате
Биты 11:8 MU [3:0] Единицы месяца в BCD формате
Биты 5:4 DT [1:0] Десятки даты в BCD формате
Биты 3:0 DU [3:0] Единицы даты в BCD формате
Регистр управления часами RTC _ CR
Бит 23 COE Разрешение подачи сигнала калибровки на выход. Данный бит включает выход AFO _ CALIB RTC . (0: не разрешено, 1: разрешено)
Биты 22:21 OSEL [1:0] Выбор функции выхода для AFO _ CALIB RTC .
11: Сигнал выхода из спящего режима
Бит 20 POL Полярность выхода AFO _ CALIB RTC (0: положительная, 1: отрицательная)
Бит 18 BKP Сохранение. При записи единицы сохраняет переход на летнее или зимнее время
Бит 17 SUB 1 H Вычитание 1 часа. При установке в 1 производится вычитание одного часа для перевода на зимнее время. Если текущий час равен 0, то установка бита не даст результата.
Бит 16 ADD 1 H Добавление 1 часа. Перевод на летнее время производится при установке бита в 1.
Бит 15 TSIE Разрешение прерывания по внешнему событию. (0: не разрешено, 1: разрешено)
Бит 14 WUTIE Разрешение прерывания по событию выхода из спящего режима. (0: не разрешено, 1: разрешено)
Бит 13 ALRBIE Разрешение прерывания по событию B . (0: не разрешено, 1: разрешено)
Бит 12 ALRAIE Разрешение прерывания по событию A . (0: не разрешено, 1: разрешено)
Бит 11 TSE Разрешение сохранения времени по внешнему событию. (0: не разрешено, 1: разрешено)
Бит 10 WUTE Разрешение выхода из спящего режима по результатам счета. (0: не разрешено, 1: разрешено)
Бит 9 ALRBE Разрешение события B . (0: не разрешено, 1: разрешено)
Бит 8 ALRAE Разрешение события A . (0: не разрешено, 1: разрешено)
Бит 7 DCE Разрешение калибровки. Значение предделителя PREDIV _ A должно быть больше 6.
Бит 6 FMT Формат времени (0: 24 часовой, 1: 12 часовой)
Бит 4 REFCKON Разрешение определения опорной частоты. (0: не разрешено, 1: разрешено)
Бит 3 TSEDGE Установка фронта срабатывания для внешнего события. (0: передний, 1: задний). При смене фронта, TSE должен быть сброшен.
Биты 2:0 WUCKSEL [2:0] Источник частоты для счетчика выхода из спящего режима.
10 x : ck _ spre (обычно 1 Гц)
11 x : ck _ spre (обычно 1 Гц) и добавление одного бита в счетчик WUT
Биты 7,6,4 регистра управления доступны для записи только в режиме инициализации. Биты 2:0 могут быть изменены при RTC_CR WUTE = 0 и RTC_ISR WUTWF = 1
Регистр инициализации и состояния часов RTC _ ISR
Бит 13 TAMP 1 F Флаг обнаружения несанкционированного доступа
Бит 12 TSOVF Переполнение буфера внешних событий. Флаг устанавливается, когда TSF уже установлен. Рекомендуется проверять и очищать данный флаг одновременно с TSF .
Бит 11 TSF Флаг внешнего события.
Бит 10 WUTF Флаг выхода из спящего режима.
Бит 9 ALRBF Флаг события B . Устанавливается, когда значение счетного регистра совпадает с R TC_ALRMBR
Бит 8 ALRAF Флаг события A . Устанавливается, когда значение счетного регистра совпадает с R TC_ALRM A R
Бит 7 INIT Режим инициализации (0: рабочий режим, 1: режим инициализации). При установке 1, счетчик времени останавливается, доступна запись в счетные регистры и предделитель. Счет возобновляется после сброса данного бита.
Бит 6 INITF Флаг инициализации. (0: рабочий режим, 1: режим инициализации)
Бит 5 RSF Флаг синхронизации. Устанавливается аппаратно, когда счетные регистры копируется в теневые регистры (RTC_TRx и RTC_DRx). (0: регистры не синхронизированы, 1: регистры синхронизированы)
Бит 4 INITS Флаг состояния инициализации. Устанавливается аппаратно, когда происходит инициализация счетного регистра. (0: счетный регистр не инициализирован, 1: счетный регистр инициализирован)
Бит 2 WUTWF Флаг установки значения таймера пробуждения (0: рабочий режим , 1: режим установки)
Бит 1 ALRBWF Флаг установки времени события B (0: рабочий режим, 1: режим установки)
Бит 0 ALRAWF Флаг установки времени события A (0: рабочий режим, 1: режим установки)