cancel
Showing results for 
Search instead for 
Did you mean: 

RTC loses one second after every reset

Sanjay
Associate II
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

 

4 REPLIES 4
STTwo-32
ST Employee

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.

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;
}

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.

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

JW