RTC (Устаревшая статья)

Материал из MIK32 микроконтроллер

Модуль реализует функцию часов реального времени. Основные возможности:

- 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, будет сгенерировано соответствующее прерывание.