Для начала работы с модулем часов реального времени (RTC) на микроконтроллерах STM32, убедитесь, что в проекте активирован источник тактирования LSE (Low Speed External) или LSI (Low Speed Internal). LSE, подключенный к кварцевому резонатору 32.768 кГц, обеспечивает высокую точность, в то время как LSI подходит для менее требовательных задач.
После настройки источника тактирования, инициализируйте модуль через регистры или HAL-библиотеку. Для CMSIS используйте структуру RTC_InitTypeDef, где задайте формат времени (12- или 24-часовой), предделитель для тактового сигнала и другие параметры. Например, для 24-часового формата установите поле HourFormat в значение RTC_HOURFORMAT_24.
Для чтения и записи времени используйте функции HAL_RTC_GetTime и HAL_RTC_SetTime. Убедитесь, что перед записью данных вы вызвали функцию HAL_RTC_EnterInitMode, а после завершения – HAL_RTC_ExitInitMode. Это предотвратит конфликты при обновлении регистров.
Для работы с календарем активируйте функцию HAL_RTC_SetDate, указав день, месяц, год и день недели. Учтите, что модуль поддерживает только двухзначный год, поэтому для корректной работы с датами после 2099 года потребуется дополнительная логика.
Для обработки прерываний, таких как секундные тики или сигналы будильника, настройте соответствующие биты в регистре RTC_CR и активируйте прерывания через NVIC. Например, для секундного прерывания установите бит RTC_CR_SECIE и настройте приоритет в NVIC.
При отладке используйте отладочные регистры, такие как RTC_BKPxR, для хранения пользовательских данных. Это может быть полезно для сохранения состояния системы при сбое питания.
Работа с часами реального времени на микроконтроллерах
Для активации модуля часов реального времени в микроконтроллере, сначала включите тактирование через регистр RCC_BDCR. Установите бит RTCEN для запуска модуля. Если требуется внешний кварцевый резонатор, убедитесь, что бит LSEON в регистре RCC_BDCR включен, а флаг LSERDY подтверждает готовность.
Для инициализации календаря, переведите модуль в режим конфигурации, установив бит INIT в регистре RTC_ISR. Дождитесь флага INITF, указывающего на готовность к записи. Установите значения для часов, минут, секунд и даты через регистры RTC_TR и RTC_DR. После завершения, сбросьте бит INIT для выхода из режима конфигурации.
Для работы с прерываниями, настройте регистр RTC_CR. Например, включите прерывание по секундам, установив бит SECIE. Не забудьте активировать соответствующий канал прерывания в NVIC через вызов функции NVIC_EnableIRQ с параметром RTC_IRQn.
Для чтения текущего времени, используйте регистры RTC_TR и RTC_DR. Убедитесь, что данные синхронизированы, проверив флаг RSF в регистре RTC_ISR. Если флаг не установлен, дождитесь его появления перед чтением.
При работе с будильником, настройте регистр RTC_ALRMAR. Укажите время срабатывания и включите будильник, установив бит ALRAE в регистре RTC_CR. Для обработки события, активируйте прерывание через бит ALRAIE.
Для повышения точности, используйте калибровку через регистр RTC_CALR. Установите значение калибровки, учитывая отклонение частоты кварцевого резонатора. Это особенно полезно для долгосрочных задач.
Пример кода для чтения времени:
while (!(RTC->ISR & RTC_ISR_RSF)); uint32_t time = RTC->TR; uint32_t date = RTC->DR;
Для отладки, проверяйте флаги в регистре RTC_ISR. Например, флаг WUTF указывает на срабатывание таймера, а ALRAF – на будильник.
Инициализация и конфигурация часов реального времени
Для начала работы с модулем часов реального времени, активируйте тактирование через регистр RCC_BDCR, установив бит RTCEN. Это обеспечит питание и доступ к периферии.
Переведите модуль в режим конфигурации, установив бит INIT в регистре RTC_ISR. Дождитесь подтверждения готовности, проверяя флаг INITF. Это может занять до двух тактов низкочастотного генератора (LSE или LSI).
Задайте предделители для частоты тактирования. Например, для кварца 32.768 кГц установите PREDIV_A в 127, а PREDIV_S в 255. Это обеспечит точность счета до секунд.
Запишите начальное время и дату в регистры RTC_TR и RTC_DR. Убедитесь, что формат времени соответствует вашим требованиям: 12- или 24-часовой режим.
Сбросьте бит INIT, чтобы завершить конфигурацию. Модуль начнет отсчет времени. Для защиты от случайной записи используйте регистр RTC_WPR, введя последовательно ключи 0xCA и 0x53.
Для обработки прерываний настройте маски в регистре RTC_CR. Например, включите флаг ALRAIE для сигнализации о срабатывании будильника. Не забудьте активировать соответствующие прерывания в NVIC.
Работа с прерываниями и будильниками в RTC
Для активации прерываний по событию будильника, установите бит ALRAIE в регистре CR. Это позволит генерировать прерывание при совпадении времени, заданного в регистре ALRMAR, с текущим значением счетчика. Убедитесь, что маска MSKx в ALRMAR настроена корректно, чтобы учитывать только нужные поля (секунды, минуты, часы или дата).
Для обработки прерывания, настройте вектор прерывания в NVIC. В обработчике проверьте флаг ALRAF в регистре ISR. После обработки события сбросьте флаг, записав 0 в соответствующий бит регистра ISR. Это предотвратит повторное срабатывание прерывания.
Для периодических задач используйте будильник с маской. Например, чтобы срабатывание происходило каждую минуту, установите маску MSK3 и MSK2 в ALRMAR, оставив только поле секунд активным. Это позволит генерировать прерывание каждые 60 секунд.
Если требуется высокая точность, учитывайте задержку обработки прерывания. Для минимизации погрешности, используйте регистр PRER для настройки предделителя, чтобы частота обновления счетчика соответствовала требуемой точности.
Для отладки прерываний, временно отключите другие источники прерываний, чтобы убедиться, что обработчик срабатывает корректно. Это особенно полезно при работе с низкочастотными событиями, где ошибки могут быть незаметны сразу.









