cancel
Showing results for 
Search instead for 
Did you mean: 

Stop2 mode in stm32l496zg is not working

Dhiraj1
Associate II

I am working on stm32l496zg controller with freertos.

Now, i want to use stop2 low power mode

I am using HSE, LSI and LSE clock.

As per the reference manual HSE clock will be disabled when we enter in to stop2 mode and wake up

clock source could be HSI or MSI.

Before entering STOP2 mode i shift clock from HSE to HSI and i am ble to enter into the STOP2 mode.

But incould not be able to wakeup from the STOP2 mode and i suspect that there could be an issue

with the clock configuration.

Please could you help me for the clock configuration while entering & exiting from the STOP2 mode.

Sample code will be also helpful.

Please find below code which i am working on.

stop2 function which we using for Freertos:

void Enter_STOP_mode (void)

{

  printf("Enter in stop2 mode\r\n");

  HAL_SuspendTick(); // Suspend tick timer 

  Switch_to_HSI();

  HAL_PWREx_EnterSTOP2Mode(PWR_STOPENTRY_WFI);  

  printf("Exit in stop2 mode");

  SystemClock_Config();

  HAL_ResumeTick();

}

void Switch_to_HSI(void)

{

 RCC_OscInitTypeDef RCC_OscInitStruct = {0};

 RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};

 RCC_PeriphCLKInitTypeDef PeriphClkInit = {0};

 __HAL_RCC_PWR_CLK_ENABLE();

 /** Configure LSE Drive Capability

 */

 HAL_PWR_EnableBkUpAccess();

 __HAL_RCC_LSEDRIVE_CONFIG(RCC_LSEDRIVE_LOW);

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

 */

 RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI|RCC_OSCILLATORTYPE_LSI

               |RCC_OSCILLATORTYPE_LSE;

 RCC_OscInitStruct.LSEState = RCC_LSE_ON;

 RCC_OscInitStruct.HSIState = RCC_HSI_ON;

 RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;

 RCC_OscInitStruct.LSIState = RCC_LSI_ON;

 RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;

 RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI;

 RCC_OscInitStruct.PLL.PLLM = 4;

 RCC_OscInitStruct.PLL.PLLN = 40;

 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)

 {

  Error_Handler();

 }

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

 */

 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)

 {

  Error_Handler();

 }

 PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_RTC|RCC_PERIPHCLK_USART1

               |RCC_PERIPHCLK_USART2|RCC_PERIPHCLK_USART3

               |RCC_PERIPHCLK_LPUART1|RCC_PERIPHCLK_I2C1

               |RCC_PERIPHCLK_I2C4|RCC_PERIPHCLK_USB

               |RCC_PERIPHCLK_SDMMC1|RCC_PERIPHCLK_ADC;

 PeriphClkInit.Usart1ClockSelection = RCC_USART1CLKSOURCE_PCLK2;

 PeriphClkInit.Usart2ClockSelection = RCC_USART2CLKSOURCE_PCLK1;

 PeriphClkInit.Usart3ClockSelection = RCC_USART3CLKSOURCE_PCLK1;

 PeriphClkInit.Lpuart1ClockSelection = RCC_LPUART1CLKSOURCE_PCLK1;

 PeriphClkInit.I2c1ClockSelection = RCC_I2C1CLKSOURCE_PCLK1;

 PeriphClkInit.I2c4ClockSelection = RCC_I2C4CLKSOURCE_PCLK1;

 PeriphClkInit.AdcClockSelection = RCC_ADCCLKSOURCE_SYSCLK;

 PeriphClkInit.RTCClockSelection = RCC_RTCCLKSOURCE_LSE;

 PeriphClkInit.UsbClockSelection = RCC_USBCLKSOURCE_PLLSAI1;

 PeriphClkInit.Sdmmc1ClockSelection = RCC_SDMMC1CLKSOURCE_PLLSAI1;

 PeriphClkInit.PLLSAI1.PLLSAI1Source = RCC_PLLSOURCE_HSI;

 PeriphClkInit.PLLSAI1.PLLSAI1M = 4;

 PeriphClkInit.PLLSAI1.PLLSAI1N = 24;

 PeriphClkInit.PLLSAI1.PLLSAI1P = RCC_PLLP_DIV2;

 PeriphClkInit.PLLSAI1.PLLSAI1Q = RCC_PLLQ_DIV2;

 PeriphClkInit.PLLSAI1.PLLSAI1R = RCC_PLLR_DIV4;

 PeriphClkInit.PLLSAI1.PLLSAI1ClockOut = RCC_PLLSAI1_48M2CLK;

 if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK)

 {

  Error_Handler();

 }

 /** Configure the main internal regulator output voltage

 */

 if (HAL_PWREx_ControlVoltageScaling(PWR_REGULATOR_VOLTAGE_SCALE1) != HAL_OK)

 {

  Error_Handler();

 }

}

Clock configuration for HSE,LSE,LSI attached:

void SystemClock_Config(void)

{

 RCC_OscInitTypeDef RCC_OscInitStruct = {0};

 RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};

 RCC_PeriphCLKInitTypeDef PeriphClkInit = {0};

 /** Configure LSE Drive Capability 

 */

 HAL_PWR_EnableBkUpAccess();

 __HAL_RCC_LSEDRIVE_CONFIG(RCC_LSEDRIVE_LOW);

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

 */

 RCC_OscInitStruct.OscillatorType = 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.PLL.PLLState = RCC_PLL_ON;

 RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;

 RCC_OscInitStruct.PLL.PLLM = 1;

 RCC_OscInitStruct.PLL.PLLN = 20;

 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)

 {

  Error_Handler();

 }

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

 */

 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)

 {

  Error_Handler();

 }

 PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_RTC|RCC_PERIPHCLK_USART1

               |RCC_PERIPHCLK_USART2|RCC_PERIPHCLK_USART3

               |RCC_PERIPHCLK_LPUART1|RCC_PERIPHCLK_I2C1

               |RCC_PERIPHCLK_I2C4|RCC_PERIPHCLK_USB

               |RCC_PERIPHCLK_SDMMC1|RCC_PERIPHCLK_ADC;

 PeriphClkInit.Usart1ClockSelection = RCC_USART1CLKSOURCE_PCLK2;

 PeriphClkInit.Usart2ClockSelection = RCC_USART2CLKSOURCE_PCLK1;

 PeriphClkInit.Usart3ClockSelection = RCC_USART3CLKSOURCE_PCLK1;

 PeriphClkInit.Lpuart1ClockSelection = RCC_LPUART1CLKSOURCE_PCLK1;

 PeriphClkInit.I2c1ClockSelection = RCC_I2C1CLKSOURCE_PCLK1;

 PeriphClkInit.I2c4ClockSelection = RCC_I2C4CLKSOURCE_PCLK1;

 PeriphClkInit.AdcClockSelection = RCC_ADCCLKSOURCE_SYSCLK;

 PeriphClkInit.RTCClockSelection = RCC_RTCCLKSOURCE_LSE;

 PeriphClkInit.UsbClockSelection = RCC_USBCLKSOURCE_PLLSAI1;

 PeriphClkInit.Sdmmc1ClockSelection = RCC_SDMMC1CLKSOURCE_PLLSAI1;

 PeriphClkInit.PLLSAI1.PLLSAI1Source = RCC_PLLSOURCE_HSE;

 PeriphClkInit.PLLSAI1.PLLSAI1M = 1;

 PeriphClkInit.PLLSAI1.PLLSAI1N = 24;

 PeriphClkInit.PLLSAI1.PLLSAI1P = RCC_PLLP_DIV2;

 PeriphClkInit.PLLSAI1.PLLSAI1Q = RCC_PLLQ_DIV4;

 PeriphClkInit.PLLSAI1.PLLSAI1R = RCC_PLLR_DIV4;

 PeriphClkInit.PLLSAI1.PLLSAI1ClockOut = RCC_PLLSAI1_48M2CLK;

 if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK)

 {

  Error_Handler();

 }

 /** Configure the main internal regulator output voltage 

 */

 if (HAL_PWREx_ControlVoltageScaling(PWR_REGULATOR_VOLTAGE_SCALE1) != HAL_OK)

 {

  Error_Handler();

 }

}

10 REPLIES 10

Default clock after wake up from stop mode is MSI @4MHz