RTC (Устаревшая статья): различия между версиями
Андрей (обсуждение | вклад) (Новая страница: «Модуль реализует функцию часов реального времени. Основные возможности: - 24-часовой реж...») |
Андрей (обсуждение | вклад) Нет описания правки |
||
Строка 10: | Строка 10: | ||
=== Пример использования RTC === | === Пример использования RTC === | ||
В данном примере производится инициализация модуля RTC, настройка времени и даты. Затем настраивается будильник. Программа выводит время и дату по UART. При срабатывании будильника выводится сообщение "Alarm!" после чего продолжается отсчет времени. | В данном примере производится инициализация модуля RTC, настройка времени и даты. Затем настраивается будильник. Программа выводит время и дату по UART. При срабатывании будильника выводится сообщение "Alarm!", после чего продолжается отсчет времени. | ||
==== Инициализация ==== | ==== Инициализация ==== | ||
Строка 43: | Строка 43: | ||
} | } | ||
</syntaxhighlight> | </syntaxhighlight> | ||
==== Настройка времени и даты ==== | |||
Время и дата настраиваются в регистрах RRTC_TIME и RRTC_DATE соответственно. Перед изменением этих регистров необходимо сбросить бит EN в регистре RRTC_CTRL. После записи в любой регистр и пока бит FLAG в регистре RRTC_CTRL читается равным «1», запрещено выполнять любую новую запись. | |||
Время устанавливается функцией rtc_set_time<syntaxhighlight lang="c++"> | |||
void rtc_set_time(uint8_t dow, uint8_t hour, uint8_t minute, uint8_t second); | |||
</syntaxhighlight>Функция принимает следующие аргументы: | |||
- uint8_t dow - день недели: 1 - Пн; 2 - Вт; 3 - Ср; 4 - Чт; 5 - Пт; 6 - Сб; 7 - Вс | |||
- uint8_t hour - часы | |||
- uint8_t minute - минуты | |||
- uint8_t second - секунды | |||
Дата устанавливается функцией rtc_set_date.<syntaxhighlight lang="c++"> | |||
void rtc_set_date( uint8_t century, uint8_t day, uint8_t month, uint8_t year); | |||
</syntaxhighlight>Функция принимает следующие аргументы: | |||
- uint8_t century - век | |||
- uint8_t day - число | |||
- uint8_t month - месяц (Ноябрь - 11) | |||
- uint8_t year - год (2022 год - 22) | |||
Пример настройки времени/даты<syntaxhighlight lang="c++" line="1"> | |||
uint8_t dow = 2; | |||
uint8_t hour = 20; | |||
uint8_t minute = 30; | |||
uint8_t second = 00; | |||
uint8_t century = 21; | |||
uint8_t day = 19; | |||
uint8_t month = 07; | |||
uint8_t year = 22; | |||
rtc_set_time(dow, hour, minute, second); | |||
rtc_set_date(century, day, month, year); | |||
</syntaxhighlight>В данном примере время и дата устанавливается так: 21 век, 19.07.22, вторник, 20:30:00.0. | |||
==== Будильник ==== | |||
Модуль поддерживает функцию будильника по совпадению времени/даты. В качестве источника сравнения может быть выбрано одно или несколько полей. В случае выбора нескольких полей, совпадением считается равенство всех выбранных полей. | |||
Список полей, доступных для сравнения, представлен ниже: | |||
- секунды; | |||
- минуты; | |||
- часы; | |||
- дни; | |||
- день недели; | |||
- месяцы; | |||
- года; | |||
- века. | |||
Будильник имеет два регистра: | |||
- RRTC_TALRM – регистр хранит время, при совпадении которого со значением регистра RRTC_TIME, будет сгенерировано соответствующее прерывание; | |||
- RRTC_DALRM – регистр хранит дату, при совпадении которой со значением регистра RRTC_DATE, будет сгенерировано соответствующее прерывание. |
Версия от 11:20, 26 июля 2022
Модуль реализует функцию часов реального времени. Основные возможности:
- 24-часовой режим работы;
- функция календаря с корректировкой для високосного года;
- программируемый будильник с возможностью генерации прерываний;
- двоично-десятичное кодирование данных.
Пример использования RTC
В данном примере производится инициализация модуля RTC, настройка времени и даты. Затем настраивается будильник. Программа выводит время и дату по UART. При срабатывании будильника выводится сообщение "Alarm!", после чего продолжается отсчет времени.
Инициализация
Инициализация модуля RTC проводится с помощью функции rtc_init. С помощью данной функции включается тактирование необходимых блоков и выбирается внешний осцилятор OSC32K как источник тактирования RTC.
Функция rtc_init
void rtc_init() { //Включаем тактирование необходимых блоков и модуля выбора режима GPIO PM->CLK_APB_P_SET |= PM_CLOCK_GPIO_0_M | PM_CLOCK_WDT_M; PM->CLK_APB_M_SET |= PM_CLOCK_PAD_CONFIG_M | PM_CLOCK_WU_M | PM_CLOCK_PM_M | PM_CLOCK_RTC_M; for (volatile int i = 0; i < 10; i++); /* * CLOCKS_BU - Регистр управления тактированием батарейного домена * * OCS32K_en - Включение/отключение внешнего осцилятора на 32 KГц * RC32K_en - Включение/отключение LSI32К * Adj_RC32К - Поправочные коэффициенты LSI32К * RTC_Clk_Mux - Выбор источника тактирования часов реального времени: * 0 – внутренний LSI32К; * 1 – внешний осциллятор OSC32K * OSC32K_sm - Режим повышенного потребления, активный уровень “0” для OSC32K */ WU->CLOCKS_BU = WU_CLOCKS_BU_RTC_CLK_MUX_OSC32K_M; for (volatile int i = 0; i < 100; i++); WU->CLOCKS_BU = (0<<WU_CLOCKS_BU_OSC32K_PD_S) | WU_CLOCKS_BU_RTC_CLK_MUX_OSC32K_M; xprintf("Запуск с внешним осцилятором OSC32K\n"); // Сброс RTC WU->RTC_CONRTOL = WU_RTC_RESET_CLEAR_M; }
Настройка времени и даты
Время и дата настраиваются в регистрах RRTC_TIME и RRTC_DATE соответственно. Перед изменением этих регистров необходимо сбросить бит EN в регистре RRTC_CTRL. После записи в любой регистр и пока бит FLAG в регистре RRTC_CTRL читается равным «1», запрещено выполнять любую новую запись.
Время устанавливается функцией rtc_set_time
void rtc_set_time(uint8_t dow, uint8_t hour, uint8_t minute, uint8_t second);
Функция принимает следующие аргументы:
- uint8_t dow - день недели: 1 - Пн; 2 - Вт; 3 - Ср; 4 - Чт; 5 - Пт; 6 - Сб; 7 - Вс
- uint8_t hour - часы
- uint8_t minute - минуты
- uint8_t second - секунды
Дата устанавливается функцией rtc_set_date.
void rtc_set_date( uint8_t century, uint8_t day, uint8_t month, uint8_t year);
Функция принимает следующие аргументы:
- uint8_t century - век
- uint8_t day - число
- uint8_t month - месяц (Ноябрь - 11)
- uint8_t year - год (2022 год - 22)
Пример настройки времени/даты
uint8_t dow = 2; uint8_t hour = 20; uint8_t minute = 30; uint8_t second = 00; uint8_t century = 21; uint8_t day = 19; uint8_t month = 07; uint8_t year = 22; rtc_set_time(dow, hour, minute, second); rtc_set_date(century, day, month, year);
В данном примере время и дата устанавливается так: 21 век, 19.07.22, вторник, 20:30:00.0.
Будильник
Модуль поддерживает функцию будильника по совпадению времени/даты. В качестве источника сравнения может быть выбрано одно или несколько полей. В случае выбора нескольких полей, совпадением считается равенство всех выбранных полей.
Список полей, доступных для сравнения, представлен ниже:
- секунды;
- минуты;
- часы;
- дни;
- день недели;
- месяцы;
- года;
- века.
Будильник имеет два регистра:
- RRTC_TALRM – регистр хранит время, при совпадении которого со значением регистра RRTC_TIME, будет сгенерировано соответствующее прерывание;
- RRTC_DALRM – регистр хранит дату, при совпадении которой со значением регистра RRTC_DATE, будет сгенерировано соответствующее прерывание.