Rtc tamper что это
STM32 RTC, Calendar.
Начнем с того, что RTC — это аббревиатура которая расшифровывается следующим образом Real-time clock или по-русски, часы реального времени. В былые времена, при использовании МК AVR в качестве RTC, использовал отдельную микросхему, общение с которой происходило по определенному протоколу. У STM32 RTC же представляет собой модуль, реализованный внутри МК.
В качестве примера предлагаю рассмотреть как запустить часы и настроить календарь, но перед этим рассмотрим внутреннюю структуру RTC.
Выбор источника тактирования настраивается битовым полем RTCSEL[1:0] в регистре RCC_BDCR
LSEON(LSE oscillator enable) — включение LSE.
LSERDY(LSE oscillator ready) — флаг готовности LSE.
LSEBYP(LSE oscillator bypass) — единица в этом бите позволяет тактировать RTC от внешнего источника. Внешний тактовый сигнал (меандр, синус или треугольник) со скважностью 50% подаётся только на вывод OSC32_IN, при этом вывод OSC32_OUT можно использовать в качестве GPIO.
BDRST(Backup domain software reset) — единица в этом бите полностью сбрасывает значение Backup domain.
После того как выбран источник тактирования необходимо позаботится о том, чтобы счетные регистры RTC тактировались с частотой один 1Hz. Для понижения частоты тактирования до 1Hz предназначены два предделителя, синхронный и асинхронный.
Для установки времени выделен один 32-x битный регистр, разбитый на битовые поля.
Данные в нем хранятся в формате BCD, при чем единицы и десятки в отдельных битовых полях. Думаю пояснения требует только бит PM, отвечающий за формат хранения часов. Если в нем установлен ноль, часы будут тикать от 0 до 24 часов, если единица – от 1 до 12.
С датой все аналогично, она хранится в 32-х битном регистре, разбитом на битовые поля.
Ниже приведен код настройки и запуска часов для STM32F303.
В случае если RTC тактируется от внешнего кварца, необходимо инициализацию LSI заменить следующим кодом.
Микроконтроллеры Процессоры, проекты, программирование
Nav view search
Навигация
Искать
STM32
Модуль часов реального времени STM32F2xx
Одной из самых полезных функций, включенных в состав микроконтроллеров STM32 стали часы реального времени (RTC). Данный модуль обладает всеми классическими возможностями подобных часов и может иметь отдельное автономное питание от батареи. Такой подход позволяет использовать область памяти часов для резервного хранения данных, а также реализовывать различные схемы энергосбережения.
Основу модуля часов реального времени составляет двоично-десятичный таймер/счетчик. Результат счета отображается в двух 32-разрядных регистрах. Первый из них RTC _ TR содержит информацию о времени, второй – RTC _ DR представляет собой календарь, включающий год, месяц, неделю и день. Все данные представлены в BCD формате, что позволяет их сразу же использовать для отображения на различных индикаторах. Модуль календаря поддерживает автоматическое определение високосных лет, а также количества дней в текущем месяце. Кроме этого доступны функции перевода на зимнее и летнее время, вызываемые программно.
Модуль часов расположен в отдельной области памяти, имеющей возможность внешнего питания от батареи. Регистры RTC оснащены дополнительной защитой от записи, что обеспечивает невозможность случайного повреждения информации в них. Кроме часовых регистров в модуле выполнены 12 регистров резервирования пользовательских данных с разрядностью 32. Эти регистры не обнуляются по сигналу «Сброс» при наличии внешнего источника напряжения, что позволяет хранить в них важную информацию. С резервными регистрами связана функция обнаружения несанкционированного доступа к устройству( Tamper ). Она подразумевает наличие внешнего контакта, подключенного к линии RTC _ AF 1 или RTC _ AF 2. Срабатывание этого контакта должно сигнализировать о вскрытии корпуса устройства, и одновременно к сбросу информации в регистрах резервного хранения.
Еще по теме:
STM32F4 и RTC. Часть 1. Часы реального времени.
Приветствую всех снова на нашем сайте!
И сегодня мы продолжим заниматься программированием STM32, а точнее STM32F4. Казалось бы, мы уже рассмотрели огромное количество различных периферийных модулей этих микроконтроллеров, но еще ни разу не использовали RTC — Real Time CLock (часы реального времени). И в этой статье мы разберемся что же это вообще такое, как и зачем эти часы можно использовать, а также напишем маленькую программу с инициализацией RTC.
Что же делают часы реального времени, встроенные в микроконтроллеры STM32? Тут все понятно, никаких неожиданностей. Они предназначены для того, чтобы вести отсчет текущего времени. То есть по большому счету модуль RTC представляет из себя таймер, но есть одно важное отличие. Часы реального времени могут продолжать работу от резервного источника питания (например, батарейки), подключенной к выводу VBAT микроконтроллера. Что нам это дает? А то, что при выключенном устройстве часы будут тикать от резервной батарейки, и время будет отсчитываться корректно. Вот структурная схемка из даташита:
Серым выделено то, что относится к области резервных данных, то есть то, что может питаться от резервного источника питания в отсутствии основного питания на контроллере.
Для того, чтобы часы реального времени начали отсчет, необходимо подключить источник тактирования. И здесь есть несколько вариантов:
Кроме того, часы реального времени в STM32 можно использовать в качестве будильника. Для этого есть специальный регистр RTCALR. Когда счетный регистр досчитывает до значения, хранящегося в этом регистре, контроллер формирует специальный сигнал, который может вызвать прерывание. Ну а уж в прерывании можно включить подвешенную к контроллеру звонилку-пищалку. Помимо этого есть также прерывание по переполнению счетного регистра.
Как видите, возможностей у RTC вполне достаточно. Минус только один — всего один счетный регистр, который считает секунды. То есть высчитывать из секунд минуты и часы нужно руками. Правда в Standard Peripheral Library разработчики засунули специальные функции для удобной работы с временем, так что при желании можно этим и воспользоваться.
Перейдем уже к написанию программы наконец! Пусть это будет простенькая инициализация. Наша сегодняшняя цель — увидеть отсчет секунд в счетном регистре RTC. Я буду использовать для этого отладочную плату STM32F4Discovery, ну а программу, как обычно, будем писать в Keil’е. Итак, для начала создадим новый проект (создание нового проекта для STM32F4).
Подключаем необходимые файлы:
Для инициализации нам понадобится переменная:
Тут надо разобраться подробнее…
Включаем тактирование (PWR — Power Control):
Теперь необходимо разрешить доступ к области резервных данных, о которой уже упоминалось в начале статьи. Для этого используется функция:
Далее выполняем Backup Domain Reset — то есть сброс RTC модуля:
Включаем внутренний низкочастотный генератор и выбираем его в качестве источника тактирования для часов реального времени:
Ну и под конец настройка RTC:
Что за волшебное число 0x7FFF? А все просто. У нас есть источник тактирования на 32768 Гц. А нам надо 1 Гц — то есть один импульс в секунду. Значит нужен предделитель, а 0x7FFF — это как раз 32767 и единичка добавляется аппаратно 🙂 Не хватает в нашей программке только функции main():
Вот и все! Давайте посмотрим на результаты. Запускаем под отладчиком программу и смотрим на счетный регистр RTC:
Значение регистра увеличивается каждую секунду, как и задумывалось! Поэтому на сегодня мы заканчиваем, скоро замутим что-нибудь еще на RTC, например, какой-нибудь будильник…
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
Со временем и календарём всё понятно. Формат 24-х часовой.
Auto Predivider Calcalation ⇨ Enabled — активирован автоматический расчёт предделителя.
Asynchronous Predivider value — предделитель часового кварца. С его помощью достигается тактирование в 1Гц (один тик в одну секунду). Если отключить автоматический режим, то нужно будет ввести число от 0 до 127.
Для F303
Если у Вас 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, то данные сохранятся, но время идти не будет.
Будильник (Alarm) для F103
Будильник сработает через пять секунд после старта.
RTC OUT ⇨ RTC Output on the Tamper pin — во время срабатывания будильника на tamper-пин (РС13) будет подан кратковременный импульс. Можно подключить светодиод и посмотреть. На плате BluePill увидеть что-либо трудно так как импульс очень уж слабенький (я подключал через транзистор).
Можно сгенерировать проект, прошить и посмотреть как мигнёт светодиод.
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() …
Структуру будильника объявим как глобальную:
Помимо прерывания от будильника, есть ещё прерывание, которое может вызываться раз в секунду.
Включите глобальное прерывание…
Добавьте ещё один колбек:
Перед бесконечным циклом добавьте функцию:
Прошейте и смотрите.
Как использовать этот функционал — например можно сделать так: в колбеке будильника запускаем это прерывание, после чего оно вызовется 10 раз и выключится. В прерывании можно делать что угодно, например подавать импульс на какой-нибудь пин с подключённой пищалкой.
Если установить RTC OUT ⇨ Disable …
Tamper для F103 и F303
В RTC OUT указывайте что хотите. Calendar можно включить, а можно и не включать.
До этого мы использовали tamper-пин для вывода сигнала, а сейчас он будет выполнять обратную функцию.
У F103 есть десять 16-ти битных регистров для хранения пользовательских данных (backup registers). Если подключена батарейка, то данные в этих регистрах не обнуляются ни при нажатии Reset, ни при выходе из спящего режима, ни при отключении основного питания.
Если в эти регистры записать какие-то данные, то их можно будет стереть подав на tamper-пин кратковременный импульс.
В Reference manual предлагается использовать этот функционал в качестве контроля несанкционированного доступа к устройству. Видимо поэтому это назвали Tamper (вмешательство).
Rising Edge — с LOW на HIGH.
Falling Edge — с HIGH на LOW.
Внутренняя подтяжка такая слабенькая, что срабатывает от прикосновения пальца, поэтому желательно подтянуть пин к «плюсу» резистором (10КОм).
Запишем в первые два регистра данные:
В бесконечном цикле читаем эти данные:
Прошейте эту программу и коротните пин на «землю» — данные обнулятся.
Теперь если нажать Reset, то по идее данные должны будут записаться заново, но этого не случится. Дело в том, что после подачи сигнала запись в эти регистры будет запрещена. Чтобы восстановить возможность записи нужно полностью обесточить плату (батарейку тоже нужно отключить). Так происходит только в режиме Tamper, если его отключить, то эти регистры можно перезаписывать как угодно.
Помимо обнуления регистров этот сигнал может вызывать прерывание…
В программе нужно добавить только колбек:
Если включено прерывание, то при нажатии Reset регистры с данными будут перезаписываться!
Для работы без прерываний можно воспользоваться функцией ожидания сигнала.
Структуру тампера объявляем глобально:
В бесконечном цикле делаем так:
Опять же, при нажатии Reset регистры с данными будут перезаписываться.
У F303 15 пользовательских регистров и три tamper-пина.
Прерывания включаются так…
У каждого пина свой колбек:
Всё остальное как у F103.
Я когда ковырялся с этим функционалом, время от времени возникало ощущение что что-то «глючит» (регистры то записываются, то не записываются, то обнуляются, то не обнуляются), но потом стало понятно что это всего лишь следствие неправильных действий. Это к тому, что нужно проявить терпение и разобраться.
Будильник (Alarm) для F303
У этого микроконтроллера два будильника А и В…
У них есть два варианта настроек:
Internal Alarm — просто будильник, может вызывать прерывание.
Настройте всё как на картинке…
Время у нас установлено 10:34:00, а будильник сработает в 10:34:10.
Sub Seconds — это миллисекунды.
Следующие пункты, это различные комбинации настроек времени/даты срабатывания будильника. Например пункт Alarm Mask Date Week day ⇨ 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. С помощью пропусков (маскировки) или добавления тактов — мягкая калибровка.
Reference clock detection — на это пин можно подать опорную частоту (50 Гц) из розетки. Проводить эксперименты я не решился
В мануале есть такая картика…
В статье не описаны некоторые функции — посмотреть их можно в файлах stm32f3xx_hal_rtc.c и stm32f3xx_hal_rtc_ex.c.
На этом всё.
Всем спасибо