2023-05-22 3:33 AM - edited 2023-11-20 4:55 AM
Hello,
I'm facing some issue regarding the RTC peripheral of the STM32F103.
In particular, apperently, the RTC seems to randomly loose the configuration given:
By attaching with the debugger to a running target device with this problem I found out that the prescaler value seems to be set at the default value 0f 0x8000:
 
The initialization code is as follow:
/**
  * @brief  Configures RTC clock source and prescaler.
  * @param  None
  * @retval None
  */
void RTC_Configuration(void)
{
	uint8_t retVal;
	RCC_PeriphCLKInitTypeDef PeriphClkInit = {0};
	RCC_OscInitTypeDef RCC_OscInitStruct = {0};
    /* Initialize RTC Only */
	//MyRtc = 0; //20200909 controlla
    RtcHandle.Instance = RTC;
    RtcHandle.Init.AsynchPrediv = 32; /* Set the RTC time base to ~1ms */
    RtcHandle.Init.OutPut = RTC_OUTPUTSOURCE_NONE;
 
    if(READ_BIT(PWR->CSR, PWR_CSR_SBF) != RESET) /* Check if the StandBy flag is set */
    {
    	/* System resumed from STANDBY mode */
    	//putstring("test2\r\n");
        Flag_stby = TRUE;
        /* Clear StandBy flag */
        //PWR_ClearFlag(PWR_FLAG_SB);
        SET_BIT(PWR->CR, PWR_CR_CSBF);
        /* Wait for RTC APB registers synchronisation */
        //RTC_WaitForSynchro();
        retVal = HAL_RTC_WaitForSynchro(&RtcHandle);
        if(HAL_TIMEOUT == retVal) /*reinit*/
        {
        	RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_LSE;
			RCC_OscInitStruct.LSEState = RCC_LSE_ON;
 
			if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
			{
			  Error_Handler();
			}
			PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_RTC;
			PeriphClkInit.RTCClockSelection = RCC_RTCCLKSOURCE_LSE; /* 32768 Hz */
 
			if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK)
			{
			  Error_Handler();
			}
 
			if (HAL_RTC_Init(&RtcHandle) != HAL_OK)
			{
			  Error_Handler();
			}
 
        }
        /* No need to configure the RTC as the RTC configuration(clock source, enable,
           prescaler,...) is kept after wake-up from STANDBY */
    }
    else /* StandBy flag is not set */
    {
        /* RTC clock source configuration */
        /* Reset Backup Domain */
        //BKP_DeInit();
    	//putstring("reinit\r\n");
    	__HAL_RCC_BACKUPRESET_FORCE();
    	__HAL_RCC_BACKUPRESET_RELEASE();
    	//putstring("tout\r\n");
 
    	MyRtc = MY_RTC_RESET_CODE; //reset error
    	/* Clear StandBy flag */
    	SET_BIT(PWR->CR, PWR_CR_CSBF);
        /* Enable LSE OSC */
        //RCC_LSEConfig(RCC_LSE_ON);
        /* Wait till LSE is ready */
        //while(RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET)
        //{
        //}
    	RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_LSE;
    	RCC_OscInitStruct.LSEState = RCC_LSE_ON;
    	if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
    	{
    	  Error_Handler();
    	}
 
    	/* Select the RTC Clock Source */
    	        //RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);
    	        /* Enable the RTC Clock */
    	        //RCC_RTCCLKCmd(ENABLE);
    	        /* RTC configuration */
    	        /* Wait for RTC APB registers synchronisation */
    	        //RTC_WaitForSynchro();
    	        /* Set the RTC time base to ~1ms  (1.007)*/
    	        //RTC_SetPrescaler(32);
    	        /* Wait until last write operation on RTC registers has finished */
    	        //RTC_WaitForLastTask();
    	PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_RTC;
        PeriphClkInit.RTCClockSelection = RCC_RTCCLKSOURCE_LSE; /* 32768 Hz */
 
        if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK)
        {
          Error_Handler();
        }
 
        if (HAL_RTC_Init(&RtcHandle) != HAL_OK)
        {
          Error_Handler();
        }
    }
    HAL_PWR_EnableBkUpAccess();
}May you provide some insight of this problem?
Best regards,
Matteo Cardani
2023-05-22 5:10 AM
In the above code, at each point where RTC is initialized, toggle a pin, or output diagnostics to any interface, or write a diagnostic variable observed later by the debugger. Also, add a check for the proper value of the prescaler, after this routine. Do this, in order to find out the source/reason for the problem.
JW
2023-05-24 1:25 AM
Hello Jan,
as you suggested, I set a trap detecting the condition of prescaler different from 32.
I also set a trap inside the HAL_RTC_Init function.
However after two days of testing I had no luck and no GPIO were asserted.
Are there some other condition that may cause a reset of the peripheral to the default value? I don't think this is the case, but is it possible that the RTC counter timer register (CNTL and CNTH) overflowing might cause some issue?
Thank you,
Matteo