cancel
Showing results for 
Search instead for 
Did you mean: 

STM32H750VB HAL_RTC_GetTime() function returns to old value.

Eralp
Associate III

Hi, i'm working with RTC and having issue about getting time. I'm calling HAL_RTC_GetTime function with HAL_RTC_GetDate, it's return old value of time. For example time is 00:10:00 and i called gettime function, it's return 00:09:38. I'm getting time value every seconds in while loop, and it returns same value about 8-10 times and then gives new value and repeat same new value..

When i setting an alarm interrupt, it's working exactly in time and getting interrupt but when i gettime in interrupt it returns old value again :S For example alarm occured at 00:10:00 and i called HAL_RTC_GetTime() it returns 00:09:28

I tried to set BYPSHAD register but nothing changed.

8 REPLIES 8

How exactly do you read out the time/date (show code), and how do you observe it?

Don't you read it out in interrupt?

JW

Eralp
Associate III

This is my RTC Init function:

void MX_RTC_Init(void)
{
 
  /* USER CODE BEGIN RTC_Init 0 */
 
  /* USER CODE END RTC_Init 0 */
 
  RTC_TimeTypeDef sTime = {0};
  RTC_DateTypeDef sDate = {0};
  RTC_AlarmTypeDef sAlarm = {0};
 
  /* USER CODE BEGIN RTC_Init 1 */
 
  /* USER CODE END RTC_Init 1 */
  /** 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;
  hrtc.Init.OutPutRemap = RTC_OUTPUT_REMAP_NONE;
  if (HAL_RTC_Init(&hrtc) != HAL_OK)
  {
    Error_Handler();
  }
 
  /* USER CODE BEGIN Check_RTC_BKUP */
  HAL_PWR_EnableBkUpAccess();
  if ((HAL_RTCEx_BKUPRead(&hrtc, RTC_BKP_DR0) != 0x32F2) || (InitState == 0)) {
  /* USER CODE END Check_RTC_BKUP */
 
  /** Initialize RTC and set the Time and Date
  */
  sTime.Hours = 0;
  sTime.Minutes = 0;
  sTime.Seconds = 0;
  sTime.DayLightSaving = RTC_DAYLIGHTSAVING_NONE;
  sTime.StoreOperation = RTC_STOREOPERATION_RESET;
  if (HAL_RTC_SetTime(&hrtc, &sTime, RTC_FORMAT_BIN) != HAL_OK)
  {
    Error_Handler();
  }
  sDate.WeekDay = RTC_WEEKDAY_FRIDAY;
  sDate.Month = RTC_MONTH_JANUARY;
  sDate.Date = 1;
  sDate.Year = 21;
  if (HAL_RTC_SetDate(&hrtc, &sDate, RTC_FORMAT_BIN) != HAL_OK)
  {
    Error_Handler();
  }
  /** Enable the Alarm A
  */
  sAlarm.AlarmTime.Hours = 0;
  sAlarm.AlarmTime.Minutes = 0;
  sAlarm.AlarmTime.Seconds = 0;
  sAlarm.AlarmTime.SubSeconds = 0;
  sAlarm.AlarmTime.DayLightSaving = RTC_DAYLIGHTSAVING_NONE;
  sAlarm.AlarmTime.StoreOperation = RTC_STOREOPERATION_RESET;
  sAlarm.AlarmMask = RTC_ALARMMASK_DATEWEEKDAY|RTC_ALARMMASK_HOURS;
  sAlarm.AlarmSubSecondMask = RTC_ALARMSUBSECONDMASK_ALL;
  sAlarm.AlarmDateWeekDaySel = RTC_ALARMDATEWEEKDAYSEL_WEEKDAY;
  sAlarm.AlarmDateWeekDay = RTC_WEEKDAY_MONDAY;
  sAlarm.Alarm = RTC_ALARM_A;
  if (HAL_RTC_SetAlarm_IT(&hrtc, &sAlarm, RTC_FORMAT_BIN) != HAL_OK)
  {
    Error_Handler();
  }
  /* USER CODE BEGIN RTC_Init 2 */
    HAL_RTCEx_BKUPWrite(&hrtc, RTC_BKP_DR0, 0x32F2);
  }
  /* USER CODE END RTC_Init 2 */
 
}

And this one is RTC Alarm Callback function:

void HAL_RTC_AlarmAEventCallback(RTC_HandleTypeDef* hrtc)
{
	RTC_TimeTypeDef sTime = {0};
	RTC_DateTypeDef sDate = {0};
 
	HAL_RTC_GetTime(hrtc, &sTime, RTC_FORMAT_BIN);
	HAL_RTC_GetDate(hrtc, &sDate, RTC_FORMAT_BIN);
 
	printf("-> Time Value: %d:%d:%d\n", sTime.Hours, sTime.Minutes, sTime.Seconds);
}

The last one is emWin GUI Timer Callback function (Every seconds running)

static void _cbTimer(GUI_TIMER_MESSAGE *pTM)
{
                RTC_TimeTypeDef sTime;
                RTC_DateTypeDef sDate;
 
                printf("[%lu] [GUI TIMER : %d ms]\n", DWT->CYCCNT, pTM->Time);
 
		//RTC->CR |= RTC_CR_BYPSHAD;
		HAL_RTC_GetTime(&hrtc, &sTime, RTC_FORMAT_BIN);
		HAL_RTC_GetDate(&hrtc, &sDate, RTC_FORMAT_BIN);
 
		printf("-> Time Value: %d:%d:%d\n", sTime.Hours, sTime.Minutes, sTime.Seconds);
}

Here is SWO output log:

[1304357641] [GUI TIMER : 8494 ms]

-> Time Value: 00:57:23

[1497135505] [GUI TIMER : 9699 ms]

-> Time Value: 00:57:23

[1689780897] [GUI TIMER : 10903 ms]

-> Time Value: 00:57:23

[1882568665] [GUI TIMER : 12108 ms]

-> Time Value: 00:57:23

[2075529489] [GUI TIMER : 13314 ms]

-> Time Value: 00:57:23

[2268197121] [GUI TIMER : 14518 ms]

-> Time Value: 00:57:23

[2461038297] [GUI TIMER : 15723 ms]

-> Time Value: 00:57:23

[2654003993] [GUI TIMER : 16929 ms]

-> Time Value: 00:57:23

[2846520713] [GUI TIMER : 18132 ms]

-> Time Value: 00:57:23

[3039180217] [GUI TIMER : 19337 ms]

-> Time Value: 00:57:23

[3232025161] [GUI TIMER : 20542 ms]

-> Time Value: 00:57:23

[3424683369] [GUI TIMER : 21746 ms]

-> Time Value: 00:57:23

[3617574609] [GUI TIMER : 22951 ms]

-> Time Value: 00:57:23

[3810695401] [GUI TIMER : 24158 ms]

-> Time Value: 00:57:23

[4003402089] [GUI TIMER : 25363 ms]

-> Time Value: 00:57:23

[4196349889] [GUI TIMER : 26569 ms]

-> Time Value: 00:57:23

[93972889] [GUI TIMER : 27773 ms]

-> Time Value: 00:57:23

[286453145] [GUI TIMER : 28976 ms]

-> Time Value: 00:57:23

[479632657] [GUI TIMER : 30183 ms]

-> Time Value: 00:57:23

[673089777] [GUI TIMER : 31392 ms]

-> Time Value: 00:57:23

[865815049] [GUI TIMER : 32597 ms]

-> Time Value: 00:57:23

[1058500057] [GUI TIMER : 33801 ms]

-> Time Value: 00:57:50

[1251244729] [GUI TIMER : 35005 ms]

-> Time Value: 00:57:50

[1444148521] [GUI TIMER : 36211 ms]

-> Time Value: 00:57:50

[1637159289] [GUI TIMER : 37417 ms]

-> Time Value: 00:57:50

[1829975577] [GUI TIMER : 38623 ms]

-> Time Value: 00:57:50

[2022827985] [GUI TIMER : 39828 ms]

-> Time Value: 00:57:50

[2216069857] [GUI TIMER : 41036 ms]

-> Time Value: 00:57:50

[2408947281] [GUI TIMER : 42241 ms]

-> Time Value: 00:57:50

[2601704761] [GUI TIMER : 43446 ms]

-> Time Value: 00:57:50

[2794511841] [GUI TIMER : 44651 ms]

-> Time Value: 00:57:50

[2987291129] [GUI TIMER : 45856 ms]

-> Time Value: 00:57:50

[3179921769] [GUI TIMER : 47060 ms]

-> Time Value: 00:57:50

[3372517827] [GUI TIMER : 48263 ms]

-> Time Value: 00:57:50

[3565604057] [GUI TIMER : 49470 ms]

-> Time Value: 00:57:50

[3758445577] [GUI TIMER : 50675 ms]

-> Time Value: 00:57:50

[3951415265] [GUI TIMER : 51882 ms]

-> Time Value: 00:57:50

[4144023041] [GUI TIMER : 53085 ms]

-> Time Value: 00:57:50

[41932473] [GUI TIMER : 54291 ms]

-> Time Value: 00:57:50

[234875313] [GUI TIMER : 55497 ms]

-> Time Value: 00:57:50

[428126265] [GUI TIMER : 56705 ms]

-> Time Value: 00:57:50

[620947417] [GUI TIMER : 57910 ms]

-> Time Value: 00:57:50

[813501809] [GUI TIMER : 59113 ms]

-> Time Value: 00:57:50

[1006397009] [GUI TIMER : 60319 ms]

-> Time Value: 00:57:50

[1198993169] [GUI TIMER : 61522 ms]

-> Time Value: 00:57:50

[1391792961] [GUI TIMER : 62727 ms]

-> Time Value: 00:57:50

[1584445569] [GUI TIMER : 63932 ms]

-> Time Value: 00:57:50

[1777130089] [GUI TIMER : 65136 ms]

-> Time Value: 00:57:50

[1969920305] [GUI TIMER : 66341 ms]

-> Time Value: 00:57:50

[2162760609] [GUI TIMER : 67546 ms]

-> Time Value: 00:57:50

[2355523593] [GUI TIMER : 68751 ms]

-> Time Value: 00:57:50

[2548981809] [GUI TIMER : 69960 ms]

-> Time Value: 00:57:50

[2741714617] [GUI TIMER : 71164 ms]

-> Time Value: 00:7:50

[2934466737] [GUI TIMER : 72369 ms]

-> Time Value: 00:57:50

[3127042513] [GUI TIMER : 73573 ms]

-> Time Value: 00:57:50

[3319328561] [GUI TIMER : 74775 ms]

-> Time Value: 00:57:50

[3512110497] [GUI TIMER : 75979 ms]

-> Time Value: 00:58:32

[3705026865] [GUI TIMER : 77185 ms]

-> Time Value: 00:58:32

[3897659401] [GUI TIMER : 78389 ms]

-> Time Value: 00:58:32

[4090859569] [GUI TIMER : 79597 ms]

-> Time Value: 00:58:35

[4283822345] [GUI TIMER : 80803 ms]

-> Time Value: 00:58:35

[181971593] [GUI TIMER : 82010 ms]

-> Time Value: 00:58:35

Eralp
Associate III

Btw if i set BYPSHAD register, i can get new values more often. Like this:

[534417869] [GUI TIMER : 3682 ms]

-> Time Value: 20:10:2

[726000565] [GUI TIMER : 4879 ms]

-> Time Value: 20:10:2

[917718677] [GUI TIMER : 6077 ms]

-> Time Value: 20:10:2

[1109103533] [GUI TIMER : 7274 ms]

-> Time Value: 20:10:2

[1300888549] [GUI TIMER : 8472 ms]

-> Time Value: 20:10:7

[1492881373] [GUI TIMER : 9672 ms]

-> Time Value: 20:10:8

[1685023109] [GUI TIMER : 10873 ms]

-> Time Value: 20:10:8

[1876716317] [GUI TIMER : 12071 ms]

-> Time Value: 20:10:8

[2068411709] [GUI TIMER : 13269 ms]

-> Time Value: 20:10:8

[2260397197] [GUI TIMER : 14469 ms]

-> Time Value: 20:10:8

[2451916989] [GUI TIMER : 15666 ms]

-> Time Value: 20:10:14

[2643790341] [GUI TIMER : 16865 ms]

-> Time Value: 20:10:14

[2835466517] [GUI TIMER : 18063 ms]

-> Time Value: 20:10:14

[3027452693] [GUI TIMER : 19263 ms]

-> Time Value: 20:10:18

[3218802333] [GUI TIMER : 20459 ms]

-> Time Value: 20:10:18

[3410548917] [GUI TIMER : 21658 ms]

-> Time Value: 20:10:18

[3602144917] [GUI TIMER : 22855 ms]

-> Time Value: 20:10:18

[3793967957] [GUI TIMER : 24054 ms]

-> Time Value: 20:10:23

[3985862765] [GUI TIMER : 25253 ms]

-> Time Value: 20:10:23

[4177856717] [GUI TIMER : 26453 ms]

-> Time Value: 20:10:25

[74475797] [GUI TIMER : 27651 ms]

-> Time Value: 20:10:25

[266075069] [GUI TIMER : 28848 ms]

-> Time Value: 20:10:27

[457924533] [GUI TIMER : 30047 ms]

-> Time Value: 20:10:27

[649871765] [GUI TIMER : 31247 ms]

-> Time Value: 20:10:27

[841754013] [GUI TIMER : 32446 ms]

-> Time Value: 20:10:27

[1033290541] [GUI TIMER : 33643 ms]

-> Time Value: 20:10:32

[1225273213] [GUI TIMER : 34843 ms]

-> Time Value: 20:10:32

[1417037219] [GUI TIMER : 36042 ms]

-> Time Value: 20:10:32

[1608963597] [GUI TIMER : 37241 ms]

-> Time Value: 20:10:32

[1800760269] [GUI TIMER : 38440 ms]

-> Time Value: 20:10:37

Do you use some form of sleep? If yes, you have to wait until RSF bit is set before reading time/date, try calling HAL_RTC_WaitForSynchro().

JW

Eralp
Associate III

I didn't use any sleep function but i tried HAL_RTC_WaitForSynchro() function and nothing changed.

Eralp
Associate III

I don't understand how HAL_RTC_GetTime function returns old value while RTC Alarm getting right value and generate interrupt from same RTC shadow registers :S

Alarms are generated from the RTC-clock domain, otherwise they wouldn't work in sleep modes.

> I don't understand how HAL_RTC_GetTime function returns old value

Maybe it's not HAL_RTC_GetTime() which returns old value, but something in your program's fabric. Instead of printf(), try storing the read values into an array, and after some time, observe that array in debugger.

JW

Eralp
Associate III

I was already use time values in an expression to check and control somethings and gettime wasn't working correctly, i mean swo printf works good.

I fixed problem yesterday but don't know how exactly done 🙂 Change sometings, move gui apps and static libs to external flash and use BYPSHAD = 1.

If i don't set this value it still doesn't work. I think this is the starting point to solve problem.

Thanks for your support JW.