RTC STM32

При работе с 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();
    }

Изменено: