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