STM32G031 HAL库进入睡眠模式,待机模式。

本文介绍了一种STM32微控制器实现低功耗的方法,包括进入待机模式的具体步骤及注意事项。提供了完整的代码示例,展示了如何通过配置时钟、电源管理和中断设置来优化功耗。

开发板推荐:天空星STM32F407VET6开发板

超高性价比 STM32主控 | 超高主频 | 一板兼容百芯 | 比赛神器 | 沉金彩色丝印

注意1:我在调试的时候关闭了看门狗,但是主循环里面有喂狗语句,导致了不能正常进入待机模式。不知道是不是我处理有问题。建议大家单独调试。避免入坑。

注意2:进入睡眠模式,待机模式,程序将烧录不了。所以我在上电2秒后进入该模式。程序如下。

int main(void)
{
    HAL_Init();
    SystemClock_Config();
    Low_Power_IO_Config();   
    while(1)
    {
        static uint8_t init_flag = 0;	
        if(init_flag == 0)
        {
            if(get_sys_time_us() > 2000)
            {
                init_flag = 1;
                 PWR_Enter_Standby();
				//Enter_Low_Power_Mode();
            }
        }
    }
}


void SystemClock_Config(void)
{
  RCC_OscInitTypeDef RCC_OscInitStruct = {0};
  RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
  RCC_PeriphCLKInitTypeDef PeriphClkInit = {0};

  /** Configure the main internal regulator output voltage 
  */
  HAL_PWREx_ControlVoltageScaling(PWR_REGULATOR_VOLTAGE_SCALE1);
  /** Initializes the CPU, AHB and APB busses clocks 
  */
  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
  RCC_OscInitStruct.HSIState = RCC_HSI_ON;
  RCC_OscInitStruct.HSIDiv = RCC_HSI_DIV1;
  RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;
  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI;
  RCC_OscInitStruct.PLL.PLLM = RCC_PLLM_DIV1;
  RCC_OscInitStruct.PLL.PLLN = 8;
  RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;
  RCC_OscInitStruct.PLL.PLLQ = RCC_PLLQ_DIV2;
  RCC_OscInitStruct.PLL.PLLR = RCC_PLLR_DIV2;
  if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  {
    Error_Handler();
  }
  /** Initializes the CPU, AHB and APB busses clocks 
  */
  RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
                              |RCC_CLOCKTYPE_PCLK1;
  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;

  if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK)
  {
    Error_Handler();
  }
  /** Initializes the peripherals clocks 
  */
  PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_I2C1|RCC_PERIPHCLK_I2S1
                              |RCC_PERIPHCLK_ADC;
  PeriphClkInit.I2c1ClockSelection = RCC_I2C1CLKSOURCE_PCLK1;
  PeriphClkInit.I2s1ClockSelection = RCC_I2S1CLKSOURCE_SYSCLK;
  PeriphClkInit.AdcClockSelection = RCC_ADCCLKSOURCE_SYSCLK;
  if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK)
  {
    Error_Handler();
  }
}


//进入睡眠模式
void Enter_Low_Power_Mode(void)
{
    __HAL_RCC_PWR_CLK_ENABLE();   //使能PWR时钟

    HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFI); //真正进入低功耗模式
    SystemClock_Config();//重新配置时钟,低功耗唤醒之后默认HSI 8M
}




// 系统进入待机模式
void PWR_Enter_Standby(void)
{
       __HAL_RCC_PWR_CLK_ENABLE();
      if (__HAL_PWR_GET_FLAG(PWR_FLAG_SB) != RESET)
      {
        __HAL_PWR_CLEAR_FLAG(PWR_FLAG_SB);
        
        if (__HAL_PWR_GET_FLAG(PWR_FLAG_WUF2) != RESET)
        {
          __HAL_PWR_CLEAR_FLAG(PWR_FLAG_WUF2);
        }

        if (__HAL_PWR_GET_FLAG(PWR_FLAG_WUF4) != RESET)
        {
          __HAL_PWR_CLEAR_FLAG(PWR_FLAG_WUF4);
        }
      }
      HAL_PWR_EnableWakeUpPin(PWR_WAKEUP_PIN2_HIGH);
      HAL_PWR_EnableWakeUpPin(PWR_WAKEUP_PIN4_HIGH);
      HAL_PWR_EnterSTANDBYMode();
}

//进入低功耗之前需要先将外部中断唤醒配置好
void Low_Power_IO_Config(void)
{
  GPIO_InitTypeDef GPIO_InitStruct = {0};
  
  GPIO_InitStruct.Pin = KEY_PIN;
  GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING;  //上升沿触发
  GPIO_InitStruct.Pull = GPIO_PULLDOWN;
  HAL_GPIO_Init(KEY_PRO, &GPIO_InitStruct);

  HAL_NVIC_SetPriority(EXTI4_15_IRQn, 0, 0);
  HAL_NVIC_EnableIRQ(EXTI4_15_IRQn);
}

 

开发板推荐:天空星STM32F407VET6开发板

超高性价比 STM32主控 | 超高主频 | 一板兼容百芯 | 比赛神器 | 沉金彩色丝印

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值