Associate
February 3, 2023
Solved
STM32L0 GetTime after Stop returns hours > 24 or pm in 24h Mode unpredictable
- February 3, 2023
- 4 replies
- 3695 views
Using RTC with LSI Clock, BinaryMode and 24h Format.
HAL_RTC_GetTime/Date returns unpredictable values after stop mode crossing midday or midnight:
- hours value above 24h. see a)
- "pm" (Timeformat "64") in 24h Mode, which is sometimes wrong additionally, which prevents correction. see b & c
a)
INFO: Entering Sleep for 28763463 ms (approx. 8h)
INFO: StartSleep DateTime: 23/01/29, 20:50:33 TimeFormat:0
INFO: EndSleep DateTime: 23/01/29, 28:49:56 TimeFormat:0 -> Should be 23/01/30, 04:49:56
b)
INFO: Entering Sleep for 28765979 ms (approx. 8h)
INFO: StartSleep DateTime: 23/01/31, 05:33:32 TimeFormat:0
INFO: EndSleep DateTime: 23/01/31, 01:32:58 TimeFormat:64 -> Should be 13:32:58 and TimeFormat:0
c) early IRQ wakeup (approx. 6.5h)
INFO: StartSleep DateTime: 23/02/01, 05:32:20 TimeFormat:0
INFO: EndSleep DateTime: 23/02/01, 12:00:58 TimeFormat:64 -> Should be TimeFormat:0unsigned int sleep(unsigned int sleepDuration){
RTC_TimeTypeDef startTime;
RTC_DateTypeDef startDate;
RTC_TimeTypeDef endTime;
RTC_DateTypeDef endDate;
HAL_RTC_GetTime(&hrtc, &startTime, RTC_FORMAT_BIN); // Read GetDate after GetTime to keep RTC working!!!
HAL_RTC_GetDate(&hrtc, &startDate, RTC_FORMAT_BIN); // Necessary to keep rtc working
debugf("INFO: StartSleep %s\n", getDateTimeString(&startTime, &startDate));
GPIO_Sleep(); // Disable GPIO (->Analog)
/* RTC interrupt Init */
// max 0xFFFF seconds = 18,2 hours; 0: 1 Second
HAL_RTCEx_SetWakeUpTimer_IT(&hrtc, MIN((sleepDuration / 1000u) -1u, 0xFFFFu), RTC_WAKEUPCLOCK_CK_SPRE_16BITS); // Don't use 17Bit (36h), because of 24H overflow
HAL_SuspendTick(); // Disable INT and keep current value
// ####### Enter STOP mode ##########
HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFI);
SystemClock_Config();
HAL_ResumeTick(); // Enable INT and continue counting
GPIO_Wakeup(); // Enable GPIO
HAL_RTC_WaitForSynchro(&hrtc);
HAL_RTC_GetTime(&hrtc, &endTime, RTC_FORMAT_BIN); // Read GetDate after GetTime to keep RTC working!!!
HAL_RTC_GetDate(&hrtc, &endDate, RTC_FORMAT_BIN); // Necessary to keep rtc working
debugf("INFO: EndSleep %s\n", getDateTimeString(&endTime, &endDate));
sleepDuration = sleepDuration - (elapsedSeconds(&startTime, &startDate, &endTime, &endDate) * 1000u);
uwTick += sleepDuration; // Atomic access to Base Tick Count
return sleepDuration;
}Does anyone know the reason for it, or has a workaround?
