/* * @Author: sunlight 2524828700@qq.com * @Date: 2024-09-13 21:25:41 * @LastEditors: sunlight 2524828700@qq.com * @LastEditTime: 2024-09-19 14:02:17 * @FilePath: \auxiliary_addition\Usr\power\pwr.c * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE */ #include "pwr.h" #include "stm32f4xx_hal.h" #include "zgpio.h" /** * @description:停止模式恢复正常HSE时钟 * @return {*} */ static void SystemConfig_Recover(void) { RCC_OscInitTypeDef RCC_OscInitStruct = {0}; RCC_ClkInitTypeDef RCC_ClkInitStruct = {0}; /** Configure the main internal regulator output voltage */ __HAL_RCC_PWR_CLK_ENABLE(); __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1); RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE; RCC_OscInitStruct.HSEState = RCC_HSE_ON; RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE; RCC_OscInitStruct.PLL.PLLM = 4; RCC_OscInitStruct.PLL.PLLN = 72; RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2; RCC_OscInitStruct.PLL.PLLQ = 4; if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) { Error_Handler(); } /** Initializes the CPU, AHB and APB buses 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_DIV2; RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2; if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK) { Error_Handler(); } } /** * @description: SleepMode Enter and Wakeup * @return {*} */ void Power_SleepMode(void) { HAL_SuspendTick(); // 暂停滴答时钟,防止通过滴答时钟中断唤醒 // printf("enter sleep"); DebugLight_OFF; HAL_PWR_EnterSLEEPMode(PWR_MAINREGULATOR_ON, PWR_SLEEPENTRY_WFE); // 进入正常睡眠模式,中断唤醒 // printf("enter sleep"); HAL_ResumeTick(); // 被唤醒后,恢复滴答时钟 DebugLight_ON; } /** * @description: StopMode Enter and Wakeup * @return {*} */ void Power_StopMode(void) { #if FLASH_PowerDown HAL_PWREx_EnableFlashPowerDown(); // 掉电进一步降低功耗 #else HAL_PWREx_DisableFlashPowerDown(); // 正常供电 #endif DebugLight_OFF; HAL_SuspendTick(); // 暂停时钟 HAL_PWR_EnterSTOPMode(PWR_MAINREGULATOR_ON, PWR_SLEEPENTRY_WFI); // 进入停止模式,中断唤醒 SystemConfig_Recover(); // 恢复HES时钟和PLL设置 HAL_ResumeTick(); // 恢复时钟 DebugLight_ON; } /** * @description: StandbyMode Enter and Wakeup * @return {*} */ void Power_StandByMode(void) { // 检测复位来源 if (__HAL_PWR_GET_FLAG(PWR_FLAG_SB)) { __HAL_PWR_CLEAR_FLAG(PWR_FLAG_SB); // 清除复位标志 } __HAL_PWR_CLEAR_FLAG(PWR_FLAG_WU); // 清除WU标志 #if WKUP HAL_PWR_EnableWakeUpPin(PWR_WAKEUP_PIN1); // 使能WKUP引脚唤醒 #endif DebugLight_OFF; HAL_PWR_EnterSTANDBYMode(); // 进入待机模式 } void HAL_RTCEx_WakeUpTimerEventCallback(RTC_HandleTypeDef *hrtc) {}