cancel
Showing results for 
Search instead for 
Did you mean: 

STM32LORA discovery- PingPong Standby wake up by RTC timer

Prasanth Velliyangiri
Associate II
Posted on July 12, 2017 at 15:11

Hi Support Team 

I am using STM32LORA discovery- PingPong , in slave role after sending data to Masetr , slave has to go to STANDBY mode  ,and wake up via RTC timer event..

void SystemClock_Config( void )

{

/*----------------------------------------FROM MASTER-AT---------------------------------------------------*/

RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};

RCC_OscInitTypeDef RCC_OscInitStruct = {0};

RCC_PeriphCLKInitTypeDef PeriphClkInit;

__PWR_CLK_ENABLE();

/**Configure the main internal regulator output voltage

*/

__HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1); // VP JUL 10

/**Initializes the CPU, AHB and APB busses clocks

*/

/* Enable HSE Oscillator and Activate PLL with HSE as source */

RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI | RCC_OSCILLATORTYPE_LSI|RCC_OSCILLATORTYPE_MSI;

RCC_OscInitStruct.HSEState = RCC_HSE_OFF;

RCC_OscInitStruct.HSIState = RCC_HSI_ON;

RCC_OscInitStruct.LSIState = RCC_LSI_ON; // VP JUL 10

RCC_OscInitStruct.MSIState = RCC_MSI_ON; // VP JUL 10

RCC_OscInitStruct.MSICalibrationValue = 0; // VP JUL 10

RCC_OscInitStruct.MSIClockRange = RCC_MSIRANGE_5; // VP JUL 10

RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;

RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE ; // VP JUL 11 RCC_PLL_ON;

//RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI; VP JUL 11

//RCC_OscInitStruct.PLL.PLLMUL = RCC_PLLMUL_6; VP JUL 11

//RCC_OscInitStruct.PLL.PLLDIV = RCC_PLLDIV_3; VP JUL 11

if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)

{

Error_Handler();

}

/***********************VP JUL 10 ******************************/

/* Set Voltage scale1 as MCU will run at 32MHz */

// __HAL_RCC_PWR_CLK_ENABLE();

/* Poll VOSF bit of in PWR_CSR. Wait until it is reset to 0 */

while (__HAL_PWR_GET_FLAG(PWR_FLAG_VOS) != RESET) {};

/*****************************************************/

/* Select PLL as system clock source and configure the HCLK, PCLK1 and PCLK2

clocks dividers */

RCC_ClkInitStruct.ClockType = (RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2);

RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_MSI ; // RCC_SYSCLKSOURCE_PLLCLK; VP JUL 11

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_1) != HAL_OK)

{

Error_Handler();

}

PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_USART2 | RCC_PERIPHCLK_I2C1 | RCC_PERIPHCLK_RTC; // VP JUL 10

PeriphClkInit.Usart2ClockSelection = RCC_USART2CLKSOURCE_HSI;

PeriphClkInit.I2c1ClockSelection = RCC_I2C1CLKSOURCE_HSI;

PeriphClkInit.RTCClockSelection = RCC_RTCCLKSOURCE_LSI; // VP JUL 10

HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit);

/***********************VP JUL 10***************************************/

/**Configure the Systick interrupt time

*/

HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000);

/**Configure the Systick

*/

HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);

/* SysTick_IRQn interrupt configuration */

HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);

/**************************************************************/

__SYSCFG_CLK_ENABLE(); // VP JUL 12

}

static void SystemPower_Config(void)

{

/* Enable Power Control clock */

__HAL_RCC_PWR_CLK_ENABLE();

HAL_PWREx_EnableUltraLowPower();

/* Enable the fast wake up from Ultra low power mode */

HAL_PWREx_EnableFastWakeUp();

}

void Enter_Stand_by_Mode(void)

{

/****************************************************************/

__HAL_RCC_PWR_CLK_ENABLE();

HAL_DBGMCU_EnableDBGStandbyMode();

/* Check and handle if the system was resumed from StandBy mode */

if(__HAL_PWR_GET_FLAG(PWR_FLAG_SB) != RESET)

{

/* Clear Standby flag */

__HAL_PWR_CLEAR_FLAG(PWR_FLAG_SB);

}

/* Insert 5 seconds delay */

HAL_Delay(5000);

/* The Following Wakeup sequence is highly recommended prior to each Standby mode entry

mainly when using more than one wakeup source this is to not miss any wakeup event.

- Disable all used wakeup sources,

- Clear all related wakeup flags,

- Re-enable all used wakeup sources,

- Enter the Standby mode.

*/

/* Disable all used wakeup sources*/

HAL_RTCEx_DeactivateWakeUpTimer(&RtcHandle);

/* Re-enable all used wakeup sources*/

/* ♯♯ Setting the Wake up time ♯♯♯♯♯♯♯♯♯♯♯♯♯♯♯♯♯♯♯♯♯♯♯♯♯♯♯♯♯♯♯♯♯♯♯♯♯♯♯♯♯♯♯♯*/

/* RTC Wakeup Interrupt Generation:

Wakeup Time Base = (RTC_WAKEUPCLOCK_RTCCLK_DIV /(LSI))

Wakeup Time = Wakeup Time Base * WakeUpCounter

= (RTC_WAKEUPCLOCK_RTCCLK_DIV /(LSI)) * WakeUpCounter

==> WakeUpCounter = Wakeup Time / Wakeup Time Base

To configure the wake up timer to 4s the WakeUpCounter is set to 0x1FFF:

RTC_WAKEUPCLOCK_RTCCLK_DIV = RTCCLK_Div16 = 16

Wakeup Time Base = 16 /(~39.000KHz) = ~0,410 ms

Wakeup Time = ~4s = 0,410ms * WakeUpCounter

==> WakeUpCounter = ~4s/0,410ms = 9750 = 0x2616 */

HAL_RTCEx_SetWakeUpTimer_IT(&RtcHandle, 0x2616, RTC_WAKEUPCLOCK_RTCCLK_DIV16);

__HAL_RTC_WAKEUPTIMER_CLEAR_FLAG (&RtcHandle, RTC_FLAG_WUTF);

/* Clear all related wakeup flags */

__HAL_PWR_CLEAR_FLAG(PWR_FLAG_WU);

/* Enter the Standby mode */

HAL_PWR_EnterSTANDBYMode();

}

But STANDBY and RTC wake up is not working , what am i missing ??

#stm32f072-discovery
4 REPLIES 4
Posted on July 12, 2017 at 17:28

>>

Hi Support Team 

This is primarily a user forum, for LoRa related implementation you might want to discuss with an FAE from your local sales office assigned to your account, or one specializing with these applications.

Tips, Buy me a coffee, or three.. PayPal Venmo
Up vote any posts that you find helpful, it shows what's working..
Prasanth Velliyangiri
Associate II
Posted on July 13, 2017 at 06:34

Hi 

Thank you for your reply..

I want to configure RTC alarm to wake from Standby , lora side i dont have any issues...

Thank you.

Posted on July 13, 2017 at 08:20

The RTC is used for other time management in the LoRa code. In order to debug and test transition into and out of standby you're likely to need to remove the debugger, and provide status/telemetry via a serial port. Review other L0 examples. Make sure other things are not flagging within the RTC, or other wakeup sources.

Tips, Buy me a coffee, or three.. PayPal Venmo
Up vote any posts that you find helpful, it shows what's working..
Prasanth Velliyangiri
Associate II
Posted on July 13, 2017 at 14:26

Hi 

Thank you for your reply..

i am able to enter into STANBY mode , only first time STANDBY mode is proper(STANDBY mode- 4s) , remaining time goes to STANDBY immediately waking up ...What could be the issue ?