cancel
Showing results for 
Search instead for 
Did you mean: 

Bug code generation, in CubeMX, for RTC - STM32F072CB ?

Sebastien B.
Associate II
Posted on January 21, 2018 at 19:32

Hello,

I use a STM32F072CB model with a battery connected directly to VBAT.

So, I use the RTC hardware. I use CubeMX to generate the initialisation code.

Unfortunately, each time the software start, the RTC registers are setted to the default value.

Here is the generated code of MX_RTC_Initd :

static void MX_RTC_Init(void)

{

  RTC_TimeTypeDef sTime;

  RTC_DateTypeDef sDate;

    /**Initialize RTC Only

    */

  hrtc.Instance = RTC;

  hrtc.Init.HourFormat = RTC_HOURFORMAT_24;

  hrtc.Init.AsynchPrediv = 127;

  hrtc.Init.SynchPrediv = 255;

  hrtc.Init.OutPut = RTC_OUTPUT_DISABLE;

  hrtc.Init.OutPutPolarity = RTC_OUTPUT_POLARITY_HIGH;

  hrtc.Init.OutPutType = RTC_OUTPUT_TYPE_OPENDRAIN;

  if (HAL_RTC_Init(&hrtc) != HAL_OK)

  {

    _Error_Handler(__FILE__, __LINE__);

  }

    /**Initialize RTC and set the Time and Date

    */

  sTime.Hours = 0x0;

  sTime.Minutes = 0x0;

  sTime.Seconds = 0x0;

  sTime.DayLightSaving = RTC_DAYLIGHTSAVING_NONE;

  sTime.StoreOperation = RTC_STOREOPERATION_SET;

  if (HAL_RTC_SetTime(&hrtc, &sTime, RTC_FORMAT_BCD) != HAL_OK)

  {

    _Error_Handler(__FILE__, __LINE__);

  }

  sDate.WeekDay = RTC_WEEKDAY_MONDAY;

  sDate.Month = RTC_MONTH_JANUARY;

  sDate.Date = 0x1;

  sDate.Year = 0x0;

  if (HAL_RTC_SetDate(&hrtc, &sDate, RTC_FORMAT_BCD) != HAL_OK)

  {

    _Error_Handler(__FILE__, __LINE__);

  }

  if(HAL_RTCEx_BKUPRead(&hrtc, RTC_BKP_DR0) != 0x32F2) {

    HAL_RTCEx_BKUPWrite(&hrtc,RTC_BKP_DR0,0x32F2);

  }

}

The code initialize, each time, the RTC registers !

If I move the line (in bold), which test the initialisation of RTCC, before the initialization, then all work as expected.

I use the STM32CubeF0 Firmware Package V1.9.0.

Here is the function corrected :

static void MX_RTC_Init(void)

{

  RTC_TimeTypeDef sTime;

  RTC_DateTypeDef sDate;

  /**Initialize RTC Only

    */

  hrtc.Instance = RTC;

  hrtc.Init.HourFormat = RTC_HOURFORMAT_24;

  hrtc.Init.AsynchPrediv = 127;

  hrtc.Init.SynchPrediv = 255;

  hrtc.Init.OutPut = RTC_OUTPUT_DISABLE;

  hrtc.Init.OutPutPolarity = RTC_OUTPUT_POLARITY_HIGH;

  hrtc.Init.OutPutType = RTC_OUTPUT_TYPE_OPENDRAIN;

  if (HAL_RTC_Init(&hrtc) != HAL_OK)

  {

    _Error_Handler(__FILE__, __LINE__);

  }

    if(HAL_RTCEx_BKUPRead(&hrtc, RTC_BKP_DR0) != 0x32F2) {

    /**Initialize RTC and set the Time and Date

    */

  sTime.Hours = 0x0;

  sTime.Minutes = 0x0;

  sTime.Seconds = 0x0;

  sTime.DayLightSaving = RTC_DAYLIGHTSAVING_NONE;

  sTime.StoreOperation = RTC_STOREOPERATION_SET;

  if (HAL_RTC_SetTime(&hrtc, &sTime, RTC_FORMAT_BCD) != HAL_OK)

  {

    _Error_Handler(__FILE__, __LINE__);

  }

  sDate.WeekDay = RTC_WEEKDAY_MONDAY;

  sDate.Month = RTC_MONTH_JANUARY;

  sDate.Date = 0x1;

  sDate.Year = 0x0;

  if (HAL_RTC_SetDate(&hrtc, &sDate, RTC_FORMAT_BCD) != HAL_OK)

  {

    _Error_Handler(__FILE__, __LINE__);

  }

    HAL_RTCEx_BKUPWrite(&hrtc,RTC_BKP_DR0,0x32F2);

  }

}

Problem : Each time I modify the settings of my project in CubeMX, the generation clear my correction ...

Is there a workaround ?

Thanks in advance.

Best regards.

1 REPLY 1
Sebastien B.
Associate II
Posted on February 01, 2018 at 14:33

No one use Vbat and calendar ?