Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Кармин Новиелло - Освоение STM32.pdf
Скачиваний:
2754
Добавлен:
23.09.2021
Размер:
47.68 Mб
Скачать

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

Существует внушительное количество встроенных приложений, которые должны отслеживать текущие время и дату. Регистраторы данных, таймеры, бытовая техника и устройства управления – лишь ограниченный список примеров. Традиционно микроконтроллеры сопрягаются со специализированными микросхемами, которые могут обмениваться данными через SPI или шину I²C. Например, та же ST Microelectronics продает микросхему M41T811 – популярные часы реального времени (Real-Time Clock, RTC), для которых требуется пара пассивных элементов и 32 кГц генератор для отслеживания текущего времени. Кроме того, эта же микросхема также может генерировать события будильника и действовать в качестве сторожевого таймера.

Все микроконтроллеры STM32 имеют встроенный модуль RTC, который не ограничивается отслеживанием текущей даты/времени. Фактически, RTC предоставляет некоторые дополнительные и не менее важные функции, такие как обнаружение несанкционированного доступа, генерация событий будильников и возможность пробуждать микроконтроллер из глубоких режимов пониженного энергопотребления (low-power mode). В данной главе показано, как запрограммировать это периферийное устройство с помощью соответствующего модуля CubeHAL.

18.1. Введение в периферийное устройство RTC

RTC в STM32 является независимым счетчиком в двоично-десятичном коде (Binary Coded Decimal, BCD). BCD – это один из типов двоичного кодирования, где каждая цифра десятичного числа независимо представлена фиксированным числом битов. Например, таймер RTC представляет текущий час следующим образом:

два бита используются для кодирования часовых десятков;

четыре бита используются для кодирования часовых единиц;

три бита используются для кодирования минутных десятков;

четыре бита используются для кодирования минутных единиц.

Рисунок 1: Как время кодируется в формате BCD в микроконтроллере STM32

На рисунке 1 показано, как RTC в STM32 кодирует текущий час в формате BCD. Зачем использовать такой подход для кодирования даты/времени? Данный способ отслеживания текущей даты/времени типичен для небольших встроенных систем и позволяет представлять время в удобочитаемом формате без каких-либо преобразований. Традиционно операционные системы высокого уровня отслеживают время с помощью переменной типа unsigned long, которая автоматически увеличивается с каждой секундой. Например, время в UNIX представлено числом секунд, прошедших с начала эпохи

1 http://www.st.com/en/clocks-and-timers/m41t81.html

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

464

(Epoch), которая соответствует 00:00:00, четверг, 1 января 1970 года. Однако для преобразования секунд, прошедших с этой даты до текущей даты/времени, требуется много ресурсов процессора и много места для микропрограммы. Процедуры преобразования должны отслеживать несколько факторов, таких как количество дней в месяце, високосные годы и секунды и т. д. Кодирование в формате BCD позволяет мгновенно расположить текущую дату/время так, чтобы они были понятны многим людям на Земле, за счет более сложной внутренней схемы.

Периферийное устройство RTC в STM32 позволяет легко конфигурировать и отображать поля данных календаря:

Календарь:

подсекунды (не программируемые)

секунды

минуты

часы в 12-часовом или 24-часовом формате

день недели (день)

день месяца (число месяца, т.е. дата)

месяц

год

Автоматический учет 28-, 29- (учет високосного года), 30- и 31-дневных месяцев

Программная установка летнего времени (Daylight saving time)

Вотличие от большинства периферийных устройств STM32, RTC может тактироваться независимо от трех разных источников тактового сигнала: LSI-, LSE- и HSE-генераторов. Серия отдельных предделителей позволяет подавать тактовую частоту в 1 Гц на единицу календаря независимо от источника тактовой частоты. Когда источником тактовой частоты для RTC (RTCCLK) является HSE-генератор, пользователь несет ответственность за правильную конфигурацию предделителей, так чтобы RTC могла питать правильная тактовая частота. Тем не менее, CubeMX разработан так, чтобы автоматически обработать их в соответствии с заданной частотой кварцевого HSE-генератора.

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

Функциональные возможности RTC не ограничены управлением временем/датой. RTC предоставляет два независимых блока будильников (alarm unit), названных Alarm A и Alarm B, которые можно использовать для генерации событий при достижении счетчиком RTC сконфигурированного значения будильника. Единицы будильника можно настраивать: поля «подсекунды», «секунды», «минуты», «часы» и «дата» могут быть независимо выбраны или замаскированы, обеспечивая богатый выбор комбинаций будильников. Вместе с двумя блоками будильников RTC предоставляет независимый, программируемый и выделенный блок пробуждения (wakeup unit), используемый для вывода микроконтроллера из состояний глубокого сна. Фактически, в следующей главе мы увидим, что RTC является единственным периферийным устройством, способным