Skip to main content
Associate
August 28, 2024
Question

RTC loses one second after every reset

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.

4 replies

STTwo-32
ST 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

 

To give better visibility on the answered topics, please click on Accept as Solution on the reply which solved your issue or answered your question.
SanjayAuthor
Associate
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;
}
STTwo-32
ST Technical Moderator
August 28, 2024

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

To give better visibility on the answered topics, please click on Accept as Solution on the reply which solved your issue or answered your question.
waclawek.jan
Super User
August 28, 2024

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

JW