天天看點

stm32 HAL 低功耗模式模式

最近學習了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();

	
}
           

機這種操作

繼續閱讀