/* USER CODE BEGIN Header */ /** ****************************************************************************** * @file stm32_lpm_if.c * @author Yunhorn (r) Technology Limited Application Team * @brief Low layer function to enter/exit low power modes (stop, sleep) ****************************************************************************** * @attention * * Copyright (c) 2023 Yunhorn Technology Limited. * Copyright (c) 2023 Shenzhen Yunhorn Technology Co., Ltd. * All rights reserved. * * This software is licensed under terms that can be found in the LICENSE file * in the root directory of this software component. * If no LICENSE file comes with this software, it is provided AS-IS. * ****************************************************************************** */ /* USER CODE END Header */ /* Includes ------------------------------------------------------------------*/ #include "platform.h" #include "stm32_lpm.h" #include "stm32_lpm_if.h" #include "usart_if.h" /* USER CODE BEGIN Includes */ #include "dma.h" #include "gpio.h" #include "i2c.h" /* USER CODE END Includes */ /* External variables ---------------------------------------------------------*/ /* USER CODE BEGIN EV */ /* USER CODE END EV */ /* Private typedef -----------------------------------------------------------*/ /** * @brief Power driver callbacks handler */ const struct UTIL_LPM_Driver_s UTIL_PowerDriver = { PWR_EnterSleepMode, PWR_ExitSleepMode, PWR_EnterStopMode, PWR_ExitStopMode, PWR_EnterOffMode, PWR_ExitOffMode, }; /* USER CODE BEGIN PTD */ /* USER CODE END PTD */ /* Private define ------------------------------------------------------------*/ /* USER CODE BEGIN PD */ /* USER CODE END PD */ /* Private macro -------------------------------------------------------------*/ /* USER CODE BEGIN PM */ /* USER CODE END PM */ /* Private variables ---------------------------------------------------------*/ /* USER CODE BEGIN PV */ /* USER CODE END PV */ /* Private function prototypes -----------------------------------------------*/ /* USER CODE BEGIN PFP */ /* USER CODE END PFP */ /* Exported functions --------------------------------------------------------*/ void PWR_EnterOffMode(void) { #if 0 //HAL_GPIO_WritePin(GPIOB, GPIO_PIN_2, GPIO_PIN_RESET); /* LED OFF */ HAL_SuspendTick(); HAL_UART_DeInit(&huart2); //LL_PWR_ClearFlag_WU(); //__HAL_PWR_CLEAR_FLAG(PWR_FLAG_SB); __HAL_PWR_CLEAR_FLAG(PWR_FLAG_WU); __HAL_PWR_CLEAR_FLAG(PWR_FLAG_LPMODES); //LL_PWR_ClearFlag_WU(); HAL_PWR_EnterSTANDBYMode(); #endif POWER_OFF; //HAL_UART_DeInit(&huart2); //vcom_DeInit(); HAL_GPIO_DeInit(GPIOA,GPIO_PIN_All); HAL_GPIO_DeInit(GPIOB,GPIO_PIN_All); HAL_GPIO_DeInit(GPIOC,GPIO_PIN_All); HAL_SuspendTick(); HAL_PWR_EnterSTANDBYMode(); #if 0 LED_OFF; HAL_UART_DeInit(&huart2); HAL_PWR_DisableWakeUpPin(PWR_WAKEUP_PIN1);//禁用所有使用的唤醒源:PWR_WAKEUP_PIN1 connected to PA.00 __HAL_PWR_CLEAR_FLAG(PWR_FLAG_WU);//清除所有相关的唤醒标志 HAL_PWR_EnableWakeUpPin(PWR_WAKEUP_PIN1);//启用连接到PA.00的WakeUp Pin HAL_PWR_EnterSTANDBYMode();//进入待机模式 /* USER CODE BEGIN EnterOffMode_1 */ HAL_PWR_EnterSTANDBYMode(); /* USER CODE END EnterOffMode_1 */ #endif } void PWR_ExitOffMode(void) { /* USER CODE BEGIN ExitOffMode_1 */ #if 1 POWER_ON; HAL_ResumeTick(); //__HAL_PWR_CLEAR_FLAG(PWR_FLAG_SB); //HAL_GPIO_WritePin(GPIOB, GPIO_PIN_2, GPIO_PIN_SET); /* LED ON */ return; #endif #if 0 __HAL_PWR_CLEAR_FLAG(PWR_FLAG_SB); LED_ON; HAL_Delay(200); #endif /* USER CODE END ExitOffMode_1 */ } void PWR_EnterStopMode(void) { /* USER CODE BEGIN EnterStopMode_1 */ POWER_OFF; //HAL_UART_DeInit(&huart2); //vcom_DeInit(); HAL_GPIO_DeInit(GPIOA,GPIO_PIN_All); HAL_GPIO_DeInit(GPIOB,GPIO_PIN_All); HAL_GPIO_DeInit(GPIOC,GPIO_PIN_All); /* USER CODE END EnterStopMode_1 */ HAL_SuspendTick(); /* Clear Status Flag before entering STOP/STANDBY Mode */ LL_PWR_ClearFlag_C1STOP_C1STB(); /* USER CODE BEGIN EnterStopMode_2 */ /* USER CODE END EnterStopMode_2 */ HAL_PWREx_EnterSTOP2Mode(PWR_STOPENTRY_WFI); /* USER CODE BEGIN EnterStopMode_3 */ /* USER CODE END EnterStopMode_3 */ } void PWR_ExitStopMode(void) { /* USER CODE BEGIN ExitStopMode_1 */ /* USER CODE END ExitStopMode_1 */ /* Resume sysTick : work around for debugger problem in dual core */ HAL_ResumeTick(); POWER_ON; /*Not retained periph: ADC interface DAC interface USARTx, TIMx, i2Cx, SPIx SRAM ctrls, DMAx, DMAMux, AES, RNG, HSEM */ /* Resume not retained USARTx and DMA */ //vcom_Resume(); /* USER CODE BEGIN ExitStopMode_2 */ MX_GPIO_Init(); MX_DMA_Init(); MX_I2C2_Init(); /* USER CODE END ExitStopMode_2 */ } void PWR_EnterSleepMode(void) { /* USER CODE BEGIN EnterSleepMode_1 */ /* USER CODE END EnterSleepMode_1 */ /* Suspend sysTick */ HAL_SuspendTick(); /* USER CODE BEGIN EnterSleepMode_2 */ /* USER CODE END EnterSleepMode_2 */ HAL_PWR_EnterSLEEPMode(PWR_MAINREGULATOR_ON, PWR_SLEEPENTRY_WFI); /* USER CODE BEGIN EnterSleepMode_3 */ /* USER CODE END EnterSleepMode_3 */ } void PWR_ExitSleepMode(void) { /* USER CODE BEGIN ExitSleepMode_1 */ /* USER CODE END ExitSleepMode_1 */ /* Resume sysTick */ HAL_ResumeTick(); /* USER CODE BEGIN ExitSleepMode_2 */ /* USER CODE END ExitSleepMode_2 */ } /* USER CODE BEGIN EF */ /* USER CODE END EF */ /* Private Functions Definition -----------------------------------------------*/ /* USER CODE BEGIN PrFD */ /* USER CODE END PrFD */