STM32超低功耗入门之低功耗运行模式

一. 认识低功耗运行模式

低功耗运行模式,是降低了功耗的运行模式,CPU 依然处于运行状态,只是这个时候的频率降低了,导致运行速度变慢,但是功耗同时也下降了。
STM32超低功耗入门之低功耗运行模式_第1张图片
通过上图可以得到信息:

  1. 电压调节器设置为 LPR(low-power regulator)
  2. CPU 处于运行状态
  3. 在低功耗模式下程序在 SRAM 执行情况下,Flash 可以被断电
  4. SRAM1 SRAM2 可以独立的开启或关闭
  5. 除了 PLL 以外的时钟都正常开启
  6. USB_FS RNG 不能使用
  7. 运行模式无需唤醒
  8. 功耗 94uA/MHZ
  9. 调压器在 Range 1,唤醒时间 4us. 调压器在 Range 2,唤醒时间 64us.

二. 低功耗运行模式的进入

进入低功耗运行模式之后 PLL 时钟无法使用:
STM32超低功耗入门之低功耗运行模式_第2张图片
上图来自于 CUBEMX
通过上图可以知道,如果 PLL 不能使用,那么将无法完成倍频,也就是无法使 MCU 倍频到最大工作频率。所以在 PLL 无法使用的情况下,MCU 可选的时钟源,只有 HSI(固定频率 16MHZ) 和 MSI(最大48MHZ) 可用。
进入低功耗运行模式的 API :void HAL_PWREx_EnableLowPowerRunMode(void)
使用这个函数时,先查看 ST 官方给出的注释:

  * @brief Enter Low-power Run mode
  * @note  In Low-power Run mode, all I/O pins keep the same state as in Run mode.
  * @note  When Regulator is set to PWR_LOWPOWERREGULATOR_ON, the user can optionally configure the
  *        Flash in power-down monde in setting the RUN_PD bit in FLASH_ACR register.
  *        Additionally, the clock frequency must be reduced below 2 MHz.
  *        Setting RUN_PD in FLASH_ACR then appropriately reducing the clock frequency must
  *        be done before calling HAL_PWREx_EnableLowPowerRunMode() API.
  * @retval None

通过上面的注释可以得到以下讯息:

  1. 低功耗运行模式下,所有的 I/O 保持了在运行模式下一样的状态,也就是说从运行模式切换到低功耗运行模式时,无需对 I/O 做重新配置
  2. 当调压器设置为 PWR_LOWPOWERREGULATOR_ON 时, 且程序是在 RAM 中运行,Flash 可以通过配置 FLASH_ACR 寄存器来上 Flash 下电
  3. 时钟频率必须降低到 2MHZ 以下
  4. 在调用 HAL_PWREx_EnableLowPowerRunMode() API之前 ,必须在FLASH_ACR中设置RUN_PD,然后适当降低时钟频率

三. 低功耗运行模式进入与退出的代码

可以直接调用 void HAL_PWREx_EnableLowPowerRunMode(void)

int main(void)
{
  int time_out = 0; 
  HAL_Init();

  SystemClock_Config();
  MX_GPIO_Init();
  
  SystemClock_Decrease(); // 使用 MSI 作为时钟源,设置设置为 1MHZ
  
  HAL_PWREx_EnableLowPowerRunMode(); // 进入低功耗运行模式

  /* 根据自己的实际情况增加判断退出低功耗运行模式的条件,例如外部检查按键状态*/
HAL_Delay(5000);//低功耗运行一会
  HAL_PWREx_DisableLowPowerRunMode(); // 推出低功耗运行模式
    
  SystemClock_Config(); // 重新配置时钟

  while (1)
  {
      HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_13);
      HAL_Delay(500);
}

配置 MSI 时钟的代码

void SystemClock_Decrease(void)
{
  RCC_OscInitTypeDef RCC_OscInitStruct = {0};
  RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};

  /** Configure LSE Drive Capability
  */
  HAL_PWR_EnableBkUpAccess();
  __HAL_RCC_LSEDRIVE_CONFIG(RCC_LSEDRIVE_LOW);
  /** Initializes the RCC Oscillators according to the specified parameters
  * in the RCC_OscInitTypeDef structure.
  */
  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_LSE|RCC_OSCILLATORTYPE_MSI;
  RCC_OscInitStruct.LSEState = RCC_LSE_ON;
  RCC_OscInitStruct.MSIState = RCC_MSI_ON;
  RCC_OscInitStruct.MSICalibrationValue = 0;
  RCC_OscInitStruct.MSIClockRange = RCC_MSIRANGE_4;
  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE;
  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_MSI;
  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
  RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;

  if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0) != HAL_OK)
  {
    Error_Handler();
  }
  /** Configure the main internal regulator output voltage
  */
  if (HAL_PWREx_ControlVoltageScaling(PWR_REGULATOR_VOLTAGE_SCALE1) != HAL_OK)
  {
    Error_Handler();
  }
  /** Enable MSI Auto calibration
  */
  HAL_RCCEx_EnableMSIPLLMode();
}

四. 总结

  1. 低功耗运行模式只是降低了 CPU 的运行速度,并没有停止
  2. USB_FS RNG 不能使用
  3. 使用低功耗运行模式不是使用 PLL ,时钟源选择 MSI,频率不要超过 2MHZ
  4. 低功耗运行模式进入后也将导致整个时钟线上的外设速度降低,退出模式后,如果外设需要更高的速度请重新初始化

你可能感兴趣的:(STM32超低功耗,STM32,超低功耗,嵌入式)