При работе с RTC STM32 возник нюанс с установкой новой даты и времени.
Во-первых, контроллер сам прекрасно понимает какой год високосный и сколько дней в том, или ином месяце. Но это только когда дату и время он переставляет сам… А вот установить можно вполне и 31 февраля.
Пример защиты от «дурака» при установке даты:
if ((m == 2 && (d > 28 + (y % 4 == 0))) || (m == 4 || m == 6 || m == 9 || m == 11) && (d > 30)) {
printf("error");
} else {
printf("set ok");
}
Во-вторых, чтобы время и дата считались установленными, нужно после установки запросить у МК время и дату. Бред, но это особенность данной архитектуры, так работают «теневые регистры».
HAL_RTC_SetTime(&hrtc, &sTime, RTC_FORMAT_BIN);
HAL_RTC_SetDate(&hrtc, &sDate, RTC_FORMAT_BIN);
HAL_RTC_GetTime(&hrtc, &sTime, RTC_FORMAT_BIN);
HAL_RTC_GetDate(&hrtc, &sDate, RTC_FORMAT_BIN);
Выход из режима StandBy:
if (__HAL_PWR_GET_FLAG(PWR_FLAG_WU)) {
__HAL_PWR_CLEAR_FLAG(PWR_FLAG_WU);
HAL_PWR_DisableWakeUpPin(PWR_WAKEUP_PIN1);
hrtc.Instance = RTC;
HAL_RTC_MspInit(&hrtc);
}
else {
MX_RTC_Init();
}