RTC (Устаревшая статья)
Модуль реализует функцию часов реального времени. Основные возможности:
- 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, будет сгенерировано соответствующее прерывание.