当前位置:网站首页>STM32 enters and wakes up the stop mode through the serial port

STM32 enters and wakes up the stop mode through the serial port

2022-07-06 23:42:00 Kay Note

        STM32 Have run 、 sleep 、 Stop and standby four working modes . After power on reset STM32 In operation , When the kernel doesn't need to continue running , You can choose to enter the following three low-power modes to reduce power consumption , Of the three models , Different power consumption 、 Wake up time is different 、 Different wake-up sources , We can according to different application requirements , Choose the best low-power mode .

Sleep mode :CM3 Kernel stop , The peripheral is still running , This power consumption is the highest .

Stop mode : All clocks stop , This power consumption is low , Typical is probably 20uA about  .

Standby mode :1.8V Kernel power off , This power consumption is the lowest , Typical is probably 2uA about .

In the actual development and Application , Our commonly used low-power mode is stop mode , The wake-up mode is any external interrupt . This article mainly talks about waking up and entering the stop mode through the serial port , To realize the wake-up stop mode through the serial port , External interrupts are needed . Put the serial port Rx The pin is set to external interrupt , Rising edge trigger , In this way, the external interrupt will be triggered when the serial port receives data , This wakes up the stop mode . The relevant code is as follows

First, configure the serial port receiving end as an external interrupt :

/*************************************************
Function:       void EXIT_UART_Init(void)
Description:     External interrupt initialization 
Calls:          
Called By:     	
Input:           nothing 
Output:          nothing 
Return:         
Others:
*************************************************/
void EXIT_UART_Init(void)
{
	LL_EXTI_InitTypeDef EXTI_InitStruct = {0};
	
	/* GPIO Portd Clock Enable */
	LL_IOP_GRP1_EnableClock(LL_IOP_GRP1_PERIPH_GPIOA);
	
	/**/
  LL_EXTI_SetEXTISource(LL_EXTI_CONFIG_PORTA, LL_EXTI_CONFIG_LINE3);
	
	 /**/
  EXTI_InitStruct.Line_0_31 = LL_EXTI_LINE_3;
  EXTI_InitStruct.LineCommand = ENABLE;
  EXTI_InitStruct.Mode = LL_EXTI_MODE_IT;
  EXTI_InitStruct.Trigger = LL_EXTI_TRIGGER_RISING;
  LL_EXTI_Init(&EXTI_InitStruct);
	
	/**/
  LL_GPIO_SetPinPull(GPIOA, LL_GPIO_PIN_3, LL_GPIO_PULL_DOWN);
	
	/**/
  LL_GPIO_SetPinMode(GPIOA, LL_GPIO_PIN_3, LL_GPIO_MODE_INPUT);
	
	/* EXTI interrupt init*/
  NVIC_SetPriority(EXTI2_3_IRQn, 1);
  NVIC_EnableIRQ(EXTI2_3_IRQn);
}

Then enable the relevant clock , Enter stop mode .

/*************************************************
Function:       void enter_stop_mode(void)
Description:     Enter stop mode 
Calls:          
Called By:     	
Input:           nothing 
Output:          nothing 
Return:         
Others:
*************************************************/
void enter_stop_mode(void)
{
	EXIT_UART_Init();							// Configure the serial port pin as an external interrupt 
	
	__HAL_RCC_PWR_CLK_ENABLE();		// Can make  PER  The clock 
	
	HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFI);		// Get into  stop  Pattern 
}

After wakeup in low power mode , The default system clock is HSI, So you need to reconfigure the system clock . For convenience, the operation of the reset system is directly used here , If you need to keep external in the actual project IO Port state unchanged , You cannot use the system reset command , You need to reconfigure the system clock and other peripheral clocks .

/*
************************************************************
*	 The name of the function :	void exit_stop_mode(void)
*
*	 The functionality :	 System reset 
*
*	 Entrance parameters :	 nothing 
*
*	 Returns the parameter :	 nothing 
*
*	 explain :
************************************************************
*/
void exit_stop_mode(void)
{
	__set_FAULTMASK(1);	 // Turn off all interrupts 
	NVIC_SystemReset();
}

原网站

版权声明
本文为[Kay Note]所创,转载请带上原文链接,感谢
https://yzsam.com/2022/187/202207061603474368.html