最近學習了stm32的低功耗模式, 發現很多可以學習的地方, 單片機功耗要低才能續航很久
模式
1 sleep_mode
低功耗模式 -如果是中斷就先執行中斷的程式,然後執行上次停下的代碼
這種模式感覺隻有在等待中斷時候才有用, 比如sleep(1), 不過功耗不是降太多
2 stop模式
隻有靠外部中斷喚醒或者RTC定時器和看門狗喚醒
因為RTC的鬧鐘中斷是接到外部中斷的, 是以也算是外部中斷
這種模式适合長時間休眠, 用RTC來喚醒, 比如1分鐘喚醒一次, 喂狗 然後馬上休眠
3 standby_mode
待機模式, 這種模式功耗最低 這種模式适合長按開機長按關
// 進入低功耗模式 -如果是中斷就先執行中斷的程式,然後執行上次停下的代碼
void module_pwr_enter_sleep_mode(void)
{
printf("begin sleep mode\r\n");
HAL_SuspendTick();
HAL_PWR_EnterSLEEPMode(PWR_MAINREGULATOR_ON,PWR_SLEEPENTRY_WFI);
HAL_ResumeTick();
}
// 進入STOP模式,靠外部中斷喚醒
void module_pwr_enter_stop_mode(void)
{
printf("begin stop mode\r\n");
HAL_SuspendTick();
HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON,PWR_STOPENTRY_WFI);
}
// 進入待機模式
void module_pwr_enter_standby_mode(void)
{
printf("begin standby mode\r\n");
HAL_PWR_DisableWakeUpPin(PWR_WAKEUP_PIN1);
/* Clear all related wakeup flags*/
__HAL_PWR_CLEAR_FLAG(PWR_FLAG_WU);
/* Enable WakeUp Pin PWR_WAKEUP_PIN1 connected to PA.00 使能PA00的喚醒功能*/
HAL_PWR_EnableWakeUpPin(PWR_WAKEUP_PIN1);
/* Enter the Standby mode進入待機模式 */
HAL_PWR_EnterSTANDBYMode();
}
// STOP模式喚醒, 配置時鐘
void module_pwr_stop_mode_wake(void)
{
// 配置系統時鐘
RCC_OscInitTypeDef RCC_OscInitStruct = {0};
RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = {0};
/** Configure the main internal regulator output voltage
*/
__HAL_RCC_PWR_CLK_ENABLE();
__HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);
/** Initializes the RCC Oscillators according to the specified parameters
* in the RCC_OscInitTypeDef structure.
*/
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 = 25;
RCC_OscInitStruct.PLL.PLLN = 336;
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_DIV4;
RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2;
if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5) != HAL_OK)
{
Error_Handler();
}
PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_RTC;
PeriphClkInitStruct.RTCClockSelection = RCC_RTCCLKSOURCE_LSE;
if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK)
{
Error_Handler();
}
// 恢複系統時鐘
HAL_ResumeTick();
}
機這種操作