Skip to main content
Visitor II
August 28, 2024
Question

RTC loses one second after every reset

  • August 28, 2024
  • 2 replies
  • 946 views
using stm32h753bitx controller and their latest HAL drivers. On the every reset RTC loses one second. It also loses time while the device in idle condition.
My devices uses main battery power and coin cell battery for backup.
Here's my RTC initialization,
 
rtc_init.png

 

    This topic has been closed for replies.

    2 replies

    Technical Moderator
    August 28, 2024

    Hello @Sanjay 

    Could you please try the solutions proposed on this GitHub issue HAL_RTC_Init() looses time · Issue #24 · STMicroelectronics/STM32CubeH7 (github.com).

    Best Regards.

    STTwo-32

     

    SanjayAuthor
    Visitor II
    August 28, 2024

    Hi,
    Iam using the latest driver which you are metioned above, But still I had the same issue.

    Here's my init driver for RTC,

     

    HAL_StatusTypeDef HAL_RTC_Init(RTC_HandleTypeDef *hrtc)
    {
      HAL_StatusTypeDef status = HAL_ERROR;

      /* Check RTC handler */
      if(hrtc != NULL)
      {
        /* Check the parameters */
        assert_param(IS_RTC_ALL_INSTANCE(hrtc->Instance));
        assert_param(IS_RTC_HOUR_FORMAT(hrtc->Init.HourFormat));
        assert_param(IS_RTC_ASYNCH_PREDIV(hrtc->Init.AsynchPrediv));
        assert_param(IS_RTC_SYNCH_PREDIV(hrtc->Init.SynchPrediv));
        assert_param(IS_RTC_OUTPUT(hrtc->Init.OutPut));
        assert_param(IS_RTC_OUTPUT_REMAP(hrtc->Init.OutPutRemap));
        assert_param(IS_RTC_OUTPUT_POL(hrtc->Init.OutPutPolarity));
        assert_param(IS_RTC_OUTPUT_TYPE(hrtc->Init.OutPutType));
    #if defined(TAMP)
        assert_param(IS_RTC_OUTPUT_PULLUP(hrtc->Init.OutPutPullUp));
    #endif /* TAMP */

    #if (USE_HAL_RTC_REGISTER_CALLBACKS == 1)
        if(hrtc->State == HAL_RTC_STATE_RESET)
        {
          /* Allocate lock resource and initialize it */
          hrtc->Lock = HAL_UNLOCKED;

          hrtc->AlarmAEventCallback          =  HAL_RTC_AlarmAEventCallback;             /* Legacy weak AlarmAEventCallback      */
          hrtc->AlarmBEventCallback          =  HAL_RTCEx_AlarmBEventCallback;           /* Legacy weak AlarmBEventCallback      */
          hrtc->TimeStampEventCallback       =  HAL_RTCEx_TimeStampEventCallback;        /* Legacy weak TimeStampEventCallback   */
          hrtc->WakeUpTimerEventCallback     =  HAL_RTCEx_WakeUpTimerEventCallback;      /* Legacy weak WakeUpTimerEventCallback */
          hrtc->Tamper1EventCallback         =  HAL_RTCEx_Tamper1EventCallback;          /* Legacy weak Tamper1EventCallback     */
          hrtc->Tamper2EventCallback         =  HAL_RTCEx_Tamper2EventCallback;          /* Legacy weak Tamper2EventCallback     */
          hrtc->Tamper3EventCallback         =  HAL_RTCEx_Tamper3EventCallback;          /* Legacy weak Tamper3EventCallback     */

    #if defined(TAMP)
          hrtc->InternalTamper1EventCallback =  HAL_RTCEx_InternalTamper1EventCallback;
          hrtc->InternalTamper2EventCallback =  HAL_RTCEx_InternalTamper2EventCallback;
          hrtc->InternalTamper3EventCallback =  HAL_RTCEx_InternalTamper3EventCallback;
          hrtc->InternalTamper4EventCallback =  HAL_RTCEx_InternalTamper4EventCallback;
          hrtc->InternalTamper5EventCallback =  HAL_RTCEx_InternalTamper5EventCallback;
          hrtc->InternalTamper6EventCallback =  HAL_RTCEx_InternalTamper6EventCallback;
          hrtc->InternalTamper8EventCallback =  HAL_RTCEx_InternalTamper8EventCallback;
    #endif /* TAMP */


          if(hrtc->MspInitCallback == NULL)
          {
            hrtc->MspInitCallback = HAL_RTC_MspInit;
          }
          /* Init the low level hardware */
          hrtc->MspInitCallback(hrtc);

          if(hrtc->MspDeInitCallback == NULL)
          {
            hrtc->MspDeInitCallback = HAL_RTC_MspDeInit;
          }
        }
    #else /*  (USE_HAL_RTC_REGISTER_CALLBACKS == 1) */
        if(hrtc->State == HAL_RTC_STATE_RESET)
        {
          /* Allocate lock resource and initialize it */
          hrtc->Lock = HAL_UNLOCKED;

          /* Initialize RTC MSP */
          HAL_RTC_MspInit(hrtc);
        }
    #endif /*  (USE_HAL_RTC_REGISTER_CALLBACKS == 1) */

        /* Set RTC state */
        hrtc->State = HAL_RTC_STATE_BUSY;

        /* Check whether the calendar needs to be initialized */
        if (__HAL_RTC_IS_CALENDAR_INITIALIZED(hrtc) == 0U)
        {
          /* Disable the write protection for RTC registers */
          __HAL_RTC_WRITEPROTECTION_DISABLE(hrtc);

         /* Enter Initialization mode */
          status = RTC_EnterInitMode(hrtc);
          if (status == HAL_OK)
          {
    #if defined(TAMP)
            /* Clear RTC_CR FMT, OSEL, POL and TAMPOE Bits */
            hrtc->Instance->CR &= ~(RTC_CR_FMT | RTC_CR_POL | RTC_CR_OSEL | RTC_CR_TAMPOE);
    #else
            /* Clear RTC_CR FMT, OSEL and POL Bits */
            hrtc->Instance->CR &= ~(RTC_CR_FMT | RTC_CR_OSEL | RTC_CR_POL);
    #endif /* TAMP */

            /* Set RTC_CR register */
            hrtc->Instance->CR |= (hrtc->Init.HourFormat | hrtc->Init.OutPut | hrtc->Init.OutPutPolarity);

            /* Configure the RTC PRER */
            hrtc->Instance->PRER = (hrtc->Init.AsynchPrediv << RTC_PRER_PREDIV_A_Pos) | (hrtc->Init.SynchPrediv << RTC_PRER_PREDIV_S_Pos);

            /* Exit Initialization mode */
            status = RTC_ExitInitMode(hrtc);
          }
          if(status == HAL_OK)
          {
    #if defined(TAMP)
            hrtc->Instance->CR &= ~(RTC_CR_TAMPALRM_PU | RTC_CR_TAMPALRM_TYPE | RTC_CR_OUT2EN);
            hrtc->Instance->CR |= (hrtc->Init.OutPutPullUp | hrtc->Init.OutPutType | hrtc->Init.OutPutRemap);
    #else
            hrtc->Instance->OR &= ~(RTC_OR_ALARMOUTTYPE | RTC_OR_OUT_RMP);
            hrtc->Instance->OR |= (hrtc->Init.OutPutType | hrtc->Init.OutPutRemap);
    #endif /* TAMP */
          }

        /* Enable the write protection for RTC registers */
        __HAL_RTC_WRITEPROTECTION_ENABLE(hrtc);
        }
        else
        {
          /* The calendar is already initialized */
          status = HAL_OK;
        }

        if (status == HAL_OK)
        {
          /* Set RTC state */
          hrtc->State = HAL_RTC_STATE_READY;
        }
      }

      /* return status */
      return status;
    }
    Technical Moderator
    August 28, 2024

    Could you try the workarounds suggested on this discutient (and maybe this one too) 

    Super User
    August 28, 2024

    What *year* do you set? Zero is not good.

    JW