2025-09-11 1:24 AM
Hi,
I'm using a SMT32H562ZGT6 uC with RTC pheripheral enabled and clock source from LSE. But HAL_RTC_Init() function returns HAL_TIMEOUT. Investigating I found the method RTC_EnterInitMode returns HAL_TIMEOUT.
Clock configuration is performed before calling the RTC initiazlization using The SystemClock_Config generated by cubeMX:
void BSP::SystemClock_Config(void)
{
RCC_OscInitTypeDef RCC_OscInitStruct = {0};
RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
/** Configure the main internal regulator output voltage
*/
__HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE0);
while (!__HAL_PWR_GET_FLAG(PWR_FLAG_VOSRDY)) {
}
/** Configure LSE Drive Capability
* Warning : Only applied when the LSE is disabled.
*/
HAL_PWR_EnableBkUpAccess();
__HAL_RCC_LSEDRIVE_CONFIG(RCC_LSEDRIVE_LOW);
/** Initializes the RCC Oscillators according to the specified parameters
* in the RCC_OscInitTypeDef structure.
*/
RCC_OscInitStruct.OscillatorType =
RCC_OSCILLATORTYPE_HSI48 | RCC_OSCILLATORTYPE_LSI |
RCC_OSCILLATORTYPE_HSE | RCC_OSCILLATORTYPE_LSE;
RCC_OscInitStruct.HSEState = RCC_HSE_ON;
RCC_OscInitStruct.LSEState = RCC_LSE_ON;
RCC_OscInitStruct.LSIState = RCC_LSI_ON;
RCC_OscInitStruct.HSI48State = RCC_HSI48_ON;
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
RCC_OscInitStruct.PLL.PLLSource = RCC_PLL1_SOURCE_HSE;
RCC_OscInitStruct.PLL.PLLM = 2;
RCC_OscInitStruct.PLL.PLLN = 40;
RCC_OscInitStruct.PLL.PLLP = 2;
RCC_OscInitStruct.PLL.PLLQ = 2;
RCC_OscInitStruct.PLL.PLLR = 2;
RCC_OscInitStruct.PLL.PLLRGE = RCC_PLL1_VCIRANGE_3;
RCC_OscInitStruct.PLL.PLLVCOSEL = RCC_PLL1_VCORANGE_WIDE;
RCC_OscInitStruct.PLL.PLLFRACN = 0;
if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) {
Error_Handler();
}
/** Initializes the CPU, AHB and APB buses clocks
*/
RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_SYSCLK |
RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2 |
RCC_CLOCKTYPE_PCLK3;
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
RCC_ClkInitStruct.APB3CLKDivider = RCC_HCLK_DIV1;
if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5) != HAL_OK) {
Error_Handler();
}
/** Configure the programming delay
*/
__HAL_FLASH_SET_PROGRAM_DELAY(FLASH_PROGRAMMING_DELAY_2);
}
After that I'm initializing the RTC as follows:
bool RTC_C::initialize()
{
_RTCHandler.Instance = RTC;
_RTCHandler.Init.HourFormat = RTC_HOURFORMAT_24;
_RTCHandler.Init.AsynchPrediv = 127;
_RTCHandler.Init.SynchPrediv = 255;
_RTCHandler.Init.OutPut = RTC_OUTPUT_DISABLE;
_RTCHandler.Init.OutPutRemap = RTC_OUTPUT_REMAP_NONE;
_RTCHandler.Init.OutPutPolarity = RTC_OUTPUT_POLARITY_HIGH;
_RTCHandler.Init.OutPutType = RTC_OUTPUT_TYPE_OPENDRAIN;
_RTCHandler.Init.OutPutPullUp = RTC_OUTPUT_PULLUP_NONE;
_RTCHandler.Init.BinMode = RTC_BINARY_NONE;
if (HAL_RTC_Init(&_RTCHandler) != HAL_OK) {
return false;
}
RTC_PrivilegeStateTypeDef privilegeState = {0};
privilegeState.rtcPrivilegeFull = RTC_PRIVILEGE_FULL_NO;
privilegeState.backupRegisterPrivZone = RTC_PRIVILEGE_BKUP_ZONE_NONE;
privilegeState.backupRegisterStartZone2 = RTC_BKP_DR0;
privilegeState.backupRegisterStartZone3 = RTC_BKP_DR0;
if (HAL_RTCEx_PrivilegeModeSet(&_RTCHandler, &privilegeState) != HAL_OK) {
return false;
}
if (HAL_OK != HAL_RTC_WaitForSynchro(&_RTCHandler)) {
return false;
}
return true;
}
But initialization fails.
Can someone give me some hints? or have alredy experienced a similar issue?
Thank you in advance for the support.
Solved! Go to Solution.
2025-09-11 2:24 AM
This is the value of RCC_BDCR:
I've not used ST examples yet, but seems I've found something...
When HAL_RTC_Init() is called the following check is performed:
if (hrtc->State == HAL_RTC_STATE_RESET)
{
/* Allocate lock resource and initialize it */
hrtc->Lock = HAL_UNLOCKED;
/* Initialize RTC MSP */
HAL_RTC_MspInit(hrtc);
}
But initially the state is not HAL_RTC_STATE_RESET and HAL_RTC_MspInit() is not performed.
Calling HAL_RTC_MspInit() before the HAL_RTC_Init() the RTC_EnterInitMode() function doesn't return HAL_TIMEOUT anymore:
bool RTC_C::initialize()
{
_RTCHandler.Instance = RTC;
_RTCHandler.Init.HourFormat = RTC_HOURFORMAT_24;
_RTCHandler.Init.AsynchPrediv = 127;
_RTCHandler.Init.SynchPrediv = 255;
_RTCHandler.Init.OutPut = RTC_OUTPUT_DISABLE;
_RTCHandler.Init.OutPutRemap = RTC_OUTPUT_REMAP_NONE;
_RTCHandler.Init.OutPutPolarity = RTC_OUTPUT_POLARITY_HIGH;
_RTCHandler.Init.OutPutType = RTC_OUTPUT_TYPE_OPENDRAIN;
_RTCHandler.Init.OutPutPullUp = RTC_OUTPUT_PULLUP_NONE;
_RTCHandler.Init.BinMode = RTC_BINARY_NONE;
HAL_RTC_MspInit(&_RTCHandler);
if (HAL_RTC_Init(&_RTCHandler) != HAL_OK) {
return false;
}
RTC_PrivilegeStateTypeDef privilegeState = {0};
privilegeState.rtcPrivilegeFull = RTC_PRIVILEGE_FULL_NO;
privilegeState.backupRegisterPrivZone = RTC_PRIVILEGE_BKUP_ZONE_NONE;
privilegeState.backupRegisterStartZone2 = RTC_BKP_DR0;
privilegeState.backupRegisterStartZone3 = RTC_BKP_DR0;
if (HAL_RTCEx_PrivilegeModeSet(&_RTCHandler, &privilegeState) != HAL_OK) {
return false;
}
if (HAL_OK != HAL_RTC_WaitForSynchro(&_RTCHandler)) {
return false;
}
return true;
}
I don't know if this can be considered a fix or a workaround.
2025-09-11 1:46 AM
Hello,
Can you check the status of the RCC_BDCR register when this issue happens ?
Also, have you tried any of the STM32CubeMX RTC examples ? it could be useful to test if these basic examples work to eliminate the possibility that you have a hardware problem.
2025-09-11 2:24 AM
This is the value of RCC_BDCR:
I've not used ST examples yet, but seems I've found something...
When HAL_RTC_Init() is called the following check is performed:
if (hrtc->State == HAL_RTC_STATE_RESET)
{
/* Allocate lock resource and initialize it */
hrtc->Lock = HAL_UNLOCKED;
/* Initialize RTC MSP */
HAL_RTC_MspInit(hrtc);
}
But initially the state is not HAL_RTC_STATE_RESET and HAL_RTC_MspInit() is not performed.
Calling HAL_RTC_MspInit() before the HAL_RTC_Init() the RTC_EnterInitMode() function doesn't return HAL_TIMEOUT anymore:
bool RTC_C::initialize()
{
_RTCHandler.Instance = RTC;
_RTCHandler.Init.HourFormat = RTC_HOURFORMAT_24;
_RTCHandler.Init.AsynchPrediv = 127;
_RTCHandler.Init.SynchPrediv = 255;
_RTCHandler.Init.OutPut = RTC_OUTPUT_DISABLE;
_RTCHandler.Init.OutPutRemap = RTC_OUTPUT_REMAP_NONE;
_RTCHandler.Init.OutPutPolarity = RTC_OUTPUT_POLARITY_HIGH;
_RTCHandler.Init.OutPutType = RTC_OUTPUT_TYPE_OPENDRAIN;
_RTCHandler.Init.OutPutPullUp = RTC_OUTPUT_PULLUP_NONE;
_RTCHandler.Init.BinMode = RTC_BINARY_NONE;
HAL_RTC_MspInit(&_RTCHandler);
if (HAL_RTC_Init(&_RTCHandler) != HAL_OK) {
return false;
}
RTC_PrivilegeStateTypeDef privilegeState = {0};
privilegeState.rtcPrivilegeFull = RTC_PRIVILEGE_FULL_NO;
privilegeState.backupRegisterPrivZone = RTC_PRIVILEGE_BKUP_ZONE_NONE;
privilegeState.backupRegisterStartZone2 = RTC_BKP_DR0;
privilegeState.backupRegisterStartZone3 = RTC_BKP_DR0;
if (HAL_RTCEx_PrivilegeModeSet(&_RTCHandler, &privilegeState) != HAL_OK) {
return false;
}
if (HAL_OK != HAL_RTC_WaitForSynchro(&_RTCHandler)) {
return false;
}
return true;
}
I don't know if this can be considered a fix or a workaround.
2025-09-11 2:34 AM
Hello @MattiaB,
Could you please test the RTC examples provided in the STM32CubeH5: Link(here)
Additionally, I recommend checking out this article: Getting started with RTC
I hope my answer has helped you. When your question is answered, please select this topic as the solution that answered you, as it will help others find that answer faster.
Thanks for your contribution.
Dor_RH
2025-09-11 6:07 AM
Hello @MattiaB
What is the handle state before executing HAL_RTC_Init(). Is the first init of the RTC peripheral?
2025-09-11 6:08 AM - edited 2025-09-11 6:10 AM
.
2025-09-11 6:09 AM
It's the first init of the peripheral and the state is equal to 0xFF.
2025-09-11 8:33 AM
Hello @MattiaB
Could you please call HAL_RTC_Deinit() before calling HAL_RTC_Init()?
2025-09-11 11:34 PM - edited 2025-09-12 1:46 AM
Hi @Saket_Om, also calling deinit before the init the problem persists.
RTC_EnterInitMode() returns always HAL_TIMEOUT.
2025-09-12 3:34 AM
Hello @MattiaB
The function HAL_RTC_Deinit() reset the state to HAL_RTC_STATE_RESET juste after executing the HAL_RTC_MspDeInit().
Could you check if the state is HAL_RTC_STATE_RESET after HAL_RTC_Deinit().