cancel
Showing results for 
Search instead for 
Did you mean: 

NUCLEO-WBA55CG - RTC WUT Fails to Wake MCU from Standby Mode

maborbaa
Associate II

Hi everyone,

I'm new to STM32 solutions. My goal is to use the RTC Wake-Up Timer (WUT) to wake the MCU from Standby mode. I'm starting with a simple test:

  • Cold Boot - Program the WUT to wake the MCU in 5 seconds and enter Standby.
  • Warm Boot - Blink an LED, increment a counter (in BKPSRAM), and go back to sleep for 5 more seconds.

The Problem: The MCU enters Standby, but it never wakes up.

I am calculating the WUT for ck_spre (256 Hz) as follows: wakeup_counter = 5 (seconds) * 256 (Hz) = 1280.

HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_RTC_Init();

  if (__HAL_RCC_GET_FLAG(RCC_FLAG_LSERDY) == RESET)
    {
      // LSE FAILED!
      while (1)
	{
	  //(error)
	  HAL_GPIO_WritePin (LED_RED_GPIO_Port, LED_RED_Pin, GPIO_PIN_SET);
	  HAL_Delay (100);
	  HAL_GPIO_WritePin (LED_RED_GPIO_Port, LED_RED_Pin, GPIO_PIN_RESET);
	  HAL_Delay (100);
	}
    }

  uint32_t time_wkp_seg = 5;
  uint32_t wakeup_counter = time_wkp_seg * 256;

  if (__HAL_PWR_GET_FLAG(PWR_FLAG_SBF) != RESET)
    {
      // 1. Woke up from Standby

      // 2. Get the state (e.g., a counter)
      uint32_t wake_count = HAL_RTCEx_BKUPRead (&hrtc, RTC_BKP_DR0);
      wake_count++;

      // 3. Execute the wake-up task
      HAL_GPIO_WritePin (LED_GREEN_GPIO_Port, LED_GREEN_Pin, GPIO_PIN_SET); // Turn on LED
      HAL_Delay (50); // Keep it on for 50ms (to be visible)
      HAL_GPIO_WritePin (LED_GREEN_GPIO_Port, LED_GREEN_Pin, GPIO_PIN_RESET); // Turn off LED

      // 4. Save the new state
      HAL_RTCEx_BKUPWrite (&hrtc, RTC_BKP_DR0, wake_count);
      HAL_RTCEx_DeactivateWakeUpTimer(&hrtc);
      HAL_RTCEx_SetWakeUpTimer_IT (&hrtc, wakeup_counter, RTC_WAKEUPCLOCK_CK_SPRE_16BITS, 0);
    }
  else
    {
      // 5. It's a "cold" boot

      // 6. Save the initial state
      HAL_RTCEx_BKUPWrite (&hrtc, RTC_BKP_DR0, 0); // Start counter
      HAL_RTCEx_DeactivateWakeUpTimer(&hrtc);
      HAL_RTCEx_SetWakeUpTimer_IT (&hrtc, wakeup_counter, RTC_WAKEUPCLOCK_CK_SPRE_16BITS, 0);
    }

  // --- Safety Clear BEFORE sleeping ---
  __HAL_RTC_WAKEUPTIMER_CLEAR_FLAG(&hrtc, RTC_FLAG_WUTF);// Clear the RTC flag
  __HAL_PWR_CLEAR_FLAG(PWR_FLAG_SBF);      // Clear PWR flags

  HAL_PWR_EnterSTANDBYMode ();

 

1 REPLY 1
Gyessine
ST Employee

hello @maborbaa 
I suspect that the issue is caused by an incorrect configuration.
You can refer to this firmware example, which implements the RTC and standby mode, to base your project on it.
Since you are new to STM32 solutions, you can consult this Wiki to learn more about low-power modes.
BR
Gyessine

To give better visibility on the answered topics, please click on Accept as Solution on the reply which solved your issue or answered your question.