STM32L496 RTC Timeout Outside a Building, OK Inside a Building
Hi,
I'm designing a board for weather observations and having a problem with the RTC timing out.
I'm using a TCXO as the input for the RTC on LSE. The particular TCXO is ECS-327TXO-2012-33-TR.
Here is the weird thing. If the board is inside a building, my house in this case, all is good, the RTC starts up no problem. However, if the board is outside (it's a weather instrument so it will operate outside on battery power), the RTC fails to start up, with a timeout inside RTC_EnterInitMode.
If I run the RTC on LSI then all is fine, but I need more accuracy, thus the TCXO.
Below are details on the setup. If any further information is required let me know.
Any help would be greatly appreciated! This one really has me stumped.
Jerry
The circuit diagram for the TCXO is:

Where XRTC-IN is connected to pin 3 (PC14-OSC32-IN) of a STM32L496RGT3.
Below is SystemClock_Config:
void SystemClock_Config(void)
{
RCC_OscInitTypeDef RCC_OscInitStruct = {0};
RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
/** Configure the main internal regulator output voltage
*/
if (HAL_PWREx_ControlVoltageScaling(PWR_REGULATOR_VOLTAGE_SCALE1) != HAL_OK)
{
while (true) {}
}
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_LSI | RCC_OSCILLATORTYPE_HSE | RCC_OSCILLATORTYPE_LSE;
RCC_OscInitStruct.HSEState = RCC_HSE_ON;
RCC_OscInitStruct.LSEState = RCC_LSE_BYPASS;
RCC_OscInitStruct.LSIState = RCC_LSI_ON;
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
RCC_OscInitStruct.PLL.PLLM = 1;
RCC_OscInitStruct.PLL.PLLN = 8;
RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;
RCC_OscInitStruct.PLL.PLLQ = RCC_PLLQ_DIV2;
RCC_OscInitStruct.PLL.PLLR = RCC_PLLR_DIV2;
if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
{
while (true) {}
}
// RCC_ClkInitStruct.ClockType = (RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2);
RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
|RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
if(HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_4) != HAL_OK)
{
/* Initialization Error */
while(1);
}
}
And this is the RTC initialization:
/** Initialize RTC Only
*/
rtcHandle.Instance = RTC;
rtcHandle.Init.HourFormat = RTC_HOURFORMAT_24;
rtcHandle.Init.AsynchPrediv = 127;
rtcHandle.Init.SynchPrediv = 255;
rtcHandle.Init.OutPut = RTC_OUTPUT_DISABLE;
rtcHandle.Init.OutPutRemap = RTC_OUTPUT_REMAP_NONE;
rtcHandle.Init.OutPutPolarity = RTC_OUTPUT_POLARITY_HIGH;
rtcHandle.Init.OutPutType = RTC_OUTPUT_TYPE_OPENDRAIN;
if (HAL_RTC_Init(&rtcHandle) != HAL_OK)
{
return false;
}
return true;
Below is HAL_RTC_MspInit:
void HAL_RTC_MspInit(RTC_HandleTypeDef* hrtc) {
RCC_PeriphCLKInitTypeDef PeriphClkInit = {0};
if(hrtc->Instance==RTC) {
// Initializes the peripherals clock
PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_RTC;
PeriphClkInit.RTCClockSelection = RCC_RTCCLKSOURCE_LSE;
if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK) {
while (true) {}
}
/* Peripheral clock enable */
__HAL_RCC_RTC_ENABLE();
}
}

