STM32
直播中

你又知道了

12年用户 1107经验值
私信 关注
[问答]

STM32F0的低功耗模式有哪几种

STM32F0的低功耗模式有哪几种?
STM32的电源系统主要分为哪几部分?

回帖(1)

张亮

2021-9-24 18:06:00
  STM32F0低功耗模式
  1.1 STM32的电源系统
  为便于进行电源管理,STM32把它的外设、内核等模块根据功能划分了不同的供电区域。
  
  STM32 的电源系统主要分为备份域电路、内核电路以及 ADC 电路三部分,介绍如下:
  ADC 电源及参考电压(VDDA供电区域)
  为了提高转换精度,STM32 的 ADC 配有独立的电源接口,方便进行单独的滤波。ADC 的工作电源使用 VDDA引脚输入,使用 VSSA作为独立的地连接,VREF引脚则为 ADC 提供测量使用的参考电压。
  调压器供电电路(VDD/1.8V 供电区域)
  在 STM32 的电源系统中调压器供电的电路是最主要的部分,调压器为备份域及待机电路以外的所有数字电路供电,其中包括内核、数字外设以及 RAM,调压器的输出电压约为 1.8V,因而使用调压器供电的这些电路区域被称为 1.8V 域。
  备份域电路(后备供电区域)
  STM32 的 LSE 振荡器、RTC 及备份寄存器这些器件被包含进备份域电路中,这部分的电路可以通过 STM32 的 VBAT 引脚获取供电电源,在实际应用中一般会使用 3V 的钮扣电池对该引脚供电。
  1.2 低功耗模式简介
  在系统或电源复位以后,微控制器处于运行状态。运行状态下的 HCLK 为 CPU 提供时钟,内核执行程序代码。当 CPU 不需继续运行时,可以利用多个低功耗模式来节省功耗,例如等待某个外部事件时。用户需要根据最低电源消耗,最快速启动时间和可用的唤醒源等条件,选定一个最佳的低功耗模式。
  1.3 STM32功耗模式分类
  STM32 具有运行、睡眠、停止和待机4种工作模式,上电复位后 STM32 处于运行状态,当内核不需要继续运行,可选择进入以下三种低功耗模式降低功耗:
  睡眠模式(CM0 内核停止,外设仍然运行)
  停止模式(所有时钟都停止,典型电流消耗20uA)
  待机模式(1.8V 内核电源关闭,典型电流消耗2uA)
  在运行模式下,我们也可以通过降低系统时钟关闭 APB 和 AHB 总线上未被使用的外设的时钟来降低功耗。
  1.3.1 睡眠模式
  在睡眠模式中,仅关闭了内核时钟,内核停止运行,但其片上外设,CM0 核心的外设全都还照常运行。有两种方式进入睡眠模式,它的进入方式决定了从睡眠唤醒的方式,分别是 WFI(wait for interrupt)和 WFE(wait for event),即由等待“中断”唤醒和由“事件”唤醒。
  唤醒后若由中断唤醒,先进入中断,退出中断服务程序后,接着执行WFI指令后的程序;若由事件唤醒,直接接着执行WFE后的程序。
  /**-----------------------stm32f0xx_hal_pwr.c-------------------------**/
  /**
  * @brief Enters Sleep mode.
  * @note In Sleep mode, all I/O pins keep the same state as in Run mode.
  * @param Regulator Specifies the regulator state in SLEEP mode.
  * On STM32F0 devices, this parameter is a dummy value and it is ignored
  * as regulator can‘t be modified in this mode. Parameter is kept for platform
  * compatibility.
  * @param SLEEPEntry Specifies if SLEEP mode is entered with WFI or WFE instruction.
  * When WFI entry is used, tick interrupt have to be disabled if not desired as
  * the interrupt wake up source.
  * This parameter can be one of the following values:
  * @arg PWR_SLEEPENTRY_WFI: enter SLEEP mode with WFI instruction
  * @arg PWR_SLEEPENTRY_WFE: enter SLEEP mode with WFE instruction
  * @retval None
  */
  void HAL_PWR_EnterSLEEPMode(uint32_t Regulator, uint8_t SLEEPEntry)
  {
  /* Check the parameters */
  assert_param(IS_PWR_REGULATOR(Regulator));
  assert_param(IS_PWR_SLEEP_ENTRY(SLEEPEntry));
  /* Clear SLEEPDEEP bit of Cortex System Control Register */
  SCB-》SCR &= (uint32_t)~((uint32_t)SCB_SCR_SLEEPDEEP_Msk);
  /* Select SLEEP mode entry -------------------------------------------------*/
  if(SLEEPEntry == PWR_SLEEPENTRY_WFI)
  {
  /* Request Wait For Interrupt */
  __WFI();
  }
  else
  {
  /* Request Wait For Event */
  __SEV();
  __WFE();
  __WFE();
  }
  }
  1.3.2 停止模式
  在停止模式中,进一步关闭了其它所有的时钟,于是所有的外设都停止了工作,但由于其 1.8V 区域的部分电源没有关闭,还保留了内核的寄存器、内存的信息,所以从停止模式唤醒,并重新开启时钟后,还可以从上次停止处继续执行代码。停止模式可以由任意一个外部中断(EXTI)唤醒,在停止模式中可以选择电压调节器为开模式或低功耗模式。
  唤醒后若由中断唤醒,先进入中断,退出中断服务程序后,接着执行 WFI 指令后的程序;若由事件唤醒,直接接着执行 WFE 后的程序。唤醒后,STM32 会使用 HSI 作为系统时钟。
  /**-----------------------stm32f0xx_hal_pwr.c-------------------------**/
  /**
  * @brief Enters STOP mode.
  * @note In Stop mode, all I/O pins keep the same state as in Run mode.
  * @note When exiting Stop mode by issuing an interrupt or a wakeup event,
  * the HSI RC oscillator is selected as system clock.
  * @note When the voltage regulator operates in low power mode, an additional
  * startup delay is incurred when waking up from Stop mode.
  * By keeping the internal regulator ON during Stop mode, the consumption
  * is higher although the startup time is reduced.
  * @param Regulator Specifies the regulator state in STOP mode.
  * This parameter can be one of the following values:
  * @arg PWR_MAINREGULATOR_ON: STOP mode with regulator ON
  * @arg PWR_LOWPOWERREGULATOR_ON: STOP mode with low power regulator ON
  * @param STOPEntry specifies if STOP mode in entered with WFI or WFE instruction.
  * This parameter can be one of the following values:
  * @arg PWR_STOPENTRY_WFI:Enter STOP mode with WFI instruction
  * @arg PWR_STOPENTRY_WFE: Enter STOP mode with WFE instruction
  * @retval None
  */
  void HAL_PWR_EnterSTOPMode(uint32_t Regulator, uint8_t STOPEntry)
  {
  uint32_t tmpreg = 0;
  /* Check the parameters */
  assert_param(IS_PWR_REGULATOR(Regulator));
  assert_param(IS_PWR_STOP_ENTRY(STOPEntry));
  /* Select the regulator state in STOP mode ---------------------------------*/
  tmpreg = PWR-》CR;
  /* Clear PDDS and LPDS bits */
  tmpreg &= (uint32_t)~(PWR_CR_PDDS | PWR_CR_LPDS);
  /* Set LPDS bit according to Regulator value */
  tmpreg |= Regulator;
  /* Store the new value */
  PWR-》CR = tmpreg;
  /* Set SLEEPDEEP bit of Cortex System Control Register */
  SCB-》SCR |= SCB_SCR_SLEEPDEEP_Msk;
  /* Select STOP mode entry --------------------------------------------------*/
  if(STOPEntry == PWR_STOPENTRY_WFI)
  {
  /* Request Wait For Interrupt */
  __WFI();
  }
  else
  {
  /* Request Wait For Event */
  __SEV();
  __WFE();
  __WFE();
  }
  /* Reset SLEEPDEEP bit of Cortex System Control Register */
  SCB-》SCR &= (uint32_t)~((uint32_t)SCB_SCR_SLEEPDEEP_Msk);
  }
  1.3.3 待机模式
  待机模式,它除了关闭所有的时钟,还把 1.8V 区域的电源也完全关闭了,也就是说,从待机模式唤醒后,由于没有之前代码的运行记录,只能对芯片复位,重新检测 boot 条件,从头开始执行程序。它有四种唤醒方式,分别是 WKUP(PA0)引脚的上升沿,RTC 闹钟事件,NRST 引脚的复位和 IWDG(独立看门狗)复位。
  唤醒后相当于芯片复位,在程序中表现为从头开始执行代码。
  /**-----------------------stm32f0xx_hal_pwr.c-------------------------**/
  /**
  * @brief Enters STANDBY mode.
  * @note In Standby mode, all I/O pins are high impedance except for:
  * - Reset pad (still available)
  * - RTC alternate function pins if configured for tamper, time-stamp, RTC
  * Alarm out, or RTC clock calibration out.
  * - WKUP pins if enabled.
  * STM32F0x8 devices, the Stop mode is available, but it is
  * aningless to distinguish between voltage regulator in Low power
  * mode and voltage regulator in Run mode because the regulator
  * not used and the core is supplied directly from an external source.
  * Consequently, the Standby mode is not available on those devices.
  * @retval None
  */
  void HAL_PWR_EnterSTANDBYMode(void)
  {
  /* Select STANDBY mode */
  PWR-》CR |= (uint32_t)PWR_CR_PDDS;
  /* Set SLEEPDEEP bit of Cortex System Control Register */
  SCB-》SCR |= SCB_SCR_SLEEPDEEP_Msk;
  /* This option is used to ensure that store operations are completed */
  #if defined ( __CC_ARM)
  __force_stores();
  #endif
  /* Request Wait For Interrupt */
  __WFI();
  }
举报

更多回帖

发帖
×
20
完善资料,
赚取积分