Часы реального времени

Для работы с временем используют специальный таймер — часы реального времени (англ. real time clock). Очень часто это отдельная микросхема с резервным источником питания, однако в stm32 данный таймер уже встроен. Детальное описание блока, а так же пример работы с ним можно найти в документе AN2811.1

Блок RTC работает от Vdd, если достаточное напряжение на нём присутствует. В противном случае блок переключается на ножку Vbat, к которой в нашем случае подключена батарейка CR2032. Регистр настроек RTC находится в back-up области, которая так же подключена к резервному источнику питания. По этой причине когда основное питание пропадает, таймер не сбрасывается и продолжает работать.

Тактирование может поступать от одного из трёх источников: внутреннего низкоскоростного RC-резонатора (LSI); внешнего низкоскоростного кварцевого резонатора (LSE); или внешнего высокоскоростного резонатора с делителем (HSE/128).

Внешний низкоскоростной резонатор, с частотой 32768 Гц, предпочтительнее, так как обеспечивает большую точность хода часов. В нашей плате стоит именно такой.

Почему именно 32768 Гц?

В момент, когда цифровая электроника только зарождалась в том виде, в котором мы привыкли видеть её сейчас, не было таких микроконтроллеров, как stm32f103c8, но были двоичные счетчики. 32768 = 215, легко делится на 2, что в свою очередь делало удобным получать дробные значения секунды. Так и появился кварц с частотой колебаний 32768 Гц.

Кстати говоря, встречаются случаи, когда часы тактируют с частотой 50-60Гц от электросети.

Диаграмма блока приведена ниже.

Структура часов реального времени, изображение из Reference Manual

Блок RTC работает независимо от шины APB1, и использует специальный интерфейс для общения с остальной частью микроконтроллера.

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

Перед любой записью в регистры нужно войти в режим настройки, записав единицу в бит CNF нижнего регистра настроек. При этом любая запись в регистры RTC возможна только, если предыдущая операция была завершена, о чём сигнализирует флаг RTOFF (там должна быть записана 1).

Алгоритм настройки часов в общем виде:

  1. опрос бита RTOFF до тех пор пока там не появится 1;
  2. установка бита CNF;
  3. Запись значений в регистры;
  4. сброс бита CNF;
  5. опрос бита RTOFF, чтобы удостовериться, что данные успешно записаны.

Запись в регистры производится только после сброса флага CNF, и занимает минимум 3 такта RTC.

Тактовый сигнал пропускается через предделитель, для того чтобы задать временное разрешение таймера. Например чтобы получить разрешение в 1 секунду с LSE, в регистр PRLL нужно записать 32768 - 1.

Часы могут генерировать три прерывания: по истечению секунды (SECIE); по достижению определённого времени (будильник, ALRIE); и по переполнению счётчика (OWIE). Запретить (0) или разрешить (1) их можно через верхний регистр настроекCRH.

Счётчик разбит на два регистра по 16 бит RTC_CNTH и RTC_CNTL.

Будильник можно настроить через регистры RTC_ALRH и RTC_ALRL.

Согласно документу AN2821, алгоритм работы с часами будет следующим:

Время храниться ввиде секунд. Для удобства создадим структуру.

Счётчик часов реального времени 32-разрядный, поэтому туда можно записывать не просто количество секунд от начала дня (или брать модуль по остатку от 86400 секунд), а использовать UNIX-время. Мы однако не будем рассматривать такую реализацию.

Напишем функции установки и считывания времени.

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

Наш светодиод должен мигать с частотой 0,5 Гц.

Код урока можно найти на GitHub: SPL.


Назад | Оглавление | Дальше


1 Блок RTC в микроконтроллерах серии F1 отличаются от блоков в других сериях, см. документ AN3371