Запуск RTC и настройка будильника: различия между версиями
Андрей (обсуждение | вклад) Нет описания правки |
Андрей (обсуждение | вклад) Нет описания правки |
||
Строка 145: | Строка 145: | ||
} | } | ||
</syntaxhighlight> | </syntaxhighlight> | ||
[[Файл:Вывод в UART.png|мини|Вывод в UART]] | |||
В данном примере запускается RTC и выводит дату и время в UART. Через 5 секунд должен сработать будильник. При срабатывании будильника в UART отправляется сообщение "Alarm!". После этого будильник должен отключиться, а вывод времени и даты RTC продолжиться. Пример вывода UART изображен на рисунке. |
Версия от 12:39, 15 февраля 2023
В примере будут запущен таймер RTC и настроен будильник.
Работа с конфигуратором (В разработке)
Для начала настроем в конфигураторе тактирование mik32, например, от внешнего кварца 32МГц. Затем настроем делители шины. Так как RTC тактируется от шины APB_M_CLK, то зададим делители AHB_DIV и APB_M_DIV. В данном примере оставим делители по умолчанию. В итоге вкладка с тактированием должна выглядеть так:
(Картинка тактирования из конфигуратора. В работе)
Затем перейдем к настройке самого RTC. Для этого откроем вкладку RTC и нажмем включить.
Выберем тактирование от "внешнего осциллятора OSC32K". Во вкладке дата и время RTC нажмем кнопку взять дату с компьютера. Все поля автоматически заполнятся. При заполнении полей вручную следует вводить корректную дату.
Следующая вкладка "регистры RTC". Здесь задаются значения регистров общего назначения REG0-REG15. Они могут использоваться в произвольных целях. Регистры располагаются в батарейном домене и сохраняют свое значение при отключении системного питания и при внешнем сбросе. В данном примере в них ничего записываться не будет.
В самом начале настроек нажмем галочку "включить будильник". После этого появится еще одна вкладка с настройками даты и времени будильника. Запишем все поля будильника как во времени и дате RTC, но секунды напишем на 5 больше.
В итоге настройки RTC в конфигураторе должны выглядеть как на рисунках.
(Объяснение работы с конфигуратором. В разработке)
Нажимаем кнопку сохранения и генерации. В итоге у нас появится проект для PlatformIo. Далее работа идет в visual studio code.
Использование библиотеки HAL_RTC
В сгенерированном проекте в файле main.c должна быть функция RTC_Init, в которой будут заданы настройки для RTC. Выглядит она так:
static void RTC_Init(void) { RTC_TimeTypeDef sTime = {0}; RTC_DateTypeDef sDate = {0}; RTC_AlarmTypeDef sAlarm = {0}; hrtc.Instance = RTC; /* Установка даты и времени RTC */ sTime.Dow = RTC_WEEKDAY_WEDNESDAY; sTime.Hours = 14; sTime.Minutes = 54; sTime.Seconds = 15; /* Выключение RTC для записи даты и времени */ HAL_RTC_Disable(&hrtc); HAL_RTC_SetTime(&hrtc, &sTime); sDate.Century = 21; sDate.Day = 15; sDate.Month = RTC_MONTH_FEBRUARY; sDate.Year = 23; HAL_RTC_SetDate(&hrtc, &sDate); /* Включение будильника. Настройка даты и времени будильника */ sAlarm.AlarmTime.Dow = RTC_WEEKDAY_WEDNESDAY; sAlarm.AlarmTime.Hours = 14; sAlarm.AlarmTime.Minutes = 54; sAlarm.AlarmTime.Seconds = 20; sAlarm.AlarmDate.Century = 21; sAlarm.AlarmDate.Day = 15; sAlarm.AlarmDate.Month = RTC_MONTH_FEBRUARY; sAlarm.AlarmDate.Year = 23; /* Маски сравнения будильника по дате и времени */ sAlarm.MaskAlarmTime = RTC_TALRM_CDOW_M | RTC_TALRM_CH_M | RTC_TALRM_CM_M | RTC_TALRM_CS_M; sAlarm.MaskAlarmDate = RTC_DALRM_CC_M | RTC_DALRM_CD_M | RTC_DALRM_CM_M | RTC_DALRM_CY_M; HAL_RTC_SetAlarm(&hrtc, &sAlarm); HAL_RTC_Enable(&hrtc); }
Кроме этого в функции SystemClock_Config приведены настройки для тактирования. Убедитесь что в PeriphClkInit.PMClockAPB_M присутствует PM_CLOCK_RTC_M. Сама функция должна выглядеть примерно так:
void SystemClock_Config(void) { RCC_OscInitTypeDef RCC_OscInit = {0}; RCC_PeriphCLKInitTypeDef PeriphClkInit = {0}; RCC_OscInit.OscillatorEnable = RCC_OSCILLATORTYPE_OSC32K | RCC_OSCILLATORTYPE_OSC32M; RCC_OscInit.OscillatorSystem = RCC_OSCILLATORTYPE_OSC32M; RCC_OscInit.AHBDivider = 0; RCC_OscInit.APBMDivider = 0; RCC_OscInit.APBPDivider = 0; RCC_OscInit.HSI32MCalibrationValue = 0; RCC_OscInit.LSI32KCalibrationValue = 0; HAL_RCC_OscConfig(&RCC_OscInit); PeriphClkInit.PMClockAHB = PMCLOCKAHB_DEFAULT; PeriphClkInit.PMClockAPB_M = PMCLOCKAPB_M_DEFAULT | PM_CLOCK_WU_M | PM_CLOCK_RTC_M; PeriphClkInit.PMClockAPB_P = PMCLOCKAPB_P_DEFAULT | PM_CLOCK_UART_0_M; PeriphClkInit.RTCClockSelection = RCC_RTCCLKSOURCE_OSC32K; PeriphClkInit.RTCClockCPUSelection = RCC_RTCCLKCPUSOURCE_NO_CLK; HAL_RCC_ClockConfig(&PeriphClkInit); }
Для демонстрации вывода текста в PeriphClkInit.PMClockAPB_P присутствует PM_CLOCK_UART_0_M. У вас его может не быть так как UART нужно включить отдельно. В начале main.c можно видеть объявление структуры с набором настроек для RTC, которую использует функция инициализации RTC_Init.
RTC_HandleTypeDef hrtc; void SystemClock_Config(void); static void RTC_Init(void);
Для запуска RTC нужно после его инициализации воспользоваться функцией HAL_RTC_Enable.
Если у вас включен UART или присутствует #define MIK32_RTC_DEBUG в main.c или def_list.h, то с помощью функции HAL_RTC_Check можно вывести в UART дату и время RTC.
Функция HAL_RTC_GetFlagALRM возвращает значение 1 при срабатывании будильника.
HAL_RTC_AlarmDisable - сбрасывает маску сравнения будильника. Дата и время будильника не сравнивается с датой и временем RTC.
HAL_RTC_AlrmClear - очищает флаг будильника ALRM.
Функция main может выглядеть примерно так:
int main() { SystemClock_Config(); RTC_Init(); int counter = 1000000; /* Запустить RTC */ HAL_RTC_Enable(&hrtc); while (1) { if (--counter < 0) { #ifdef MIK32_RTC_DEBUG HAL_RTC_Check(&hrtc); #endif counter = 1000000; } if (HAL_RTC_GetFlagALRM(&hrtc)) { HAL_RTC_AlarmDisable(&hrtc); #ifdef MIK32_RTC_DEBUG xprintf("\nAlarm!\n"); #endif HAL_RTC_AlrmClear(&hrtc); } } }
В данном примере запускается RTC и выводит дату и время в UART. Через 5 секунд должен сработать будильник. При срабатывании будильника в UART отправляется сообщение "Alarm!". После этого будильник должен отключиться, а вывод времени и даты RTC продолжиться. Пример вывода UART изображен на рисунке.