初识电源管理

admin2024-04-03  0

一、电源供电

器件的工作电压(VDD)要求介于1.8V到3.6V之间,嵌入式线性调压器用于提供内部1.2V数字电源。

当主电源VDD断电时,可通过VBAT电压为实时时钟(RTC)、RTC备份寄存器和备份SRAM(BKP SRAM)供电。初识电源管理,第1张

①备份域电路

包含LSE振荡器、RTC、备份寄存器及备份SRAM。电源开关自动切换VDD和VBAT供电。

②调压器电路

最主要的部分,调压器为备份域及待机电路以外的所有数字电路供电,其中包括内核、 数字外设以及RAM,调压器的输出电压约为1.2V,因而使用调压器供电的这些电路区域被称为1.2V域。

调压器可以运行在“运行模式”、“停止模式”以及“待机模式”。在运行模式下,1.2V域全功率运行;在停止模式下1.2V域运行在低功耗状态, 1.2V区域的所有时钟都被关闭,相应的外设都停止了工作,但它会保留内核寄存器以及SRAM的内容;在待机模式下,整个1.2V域都断电, 该区域的内核寄存器及SRAM内容都会丢失(备份区域的寄存器及SRAM不受影响)。

③ADC电路和参考电压

ADC工作电源使用VDDA引脚输入,使用VSSA作为独立的地连接,VREF引脚则作为ADC提供测量使用的参考电压。

引脚名描述
VDD用于I/O引脚和系统模拟部分供电,比如复位、电源管理、振荡器等
VDDA用于ADC、DAC、运放、比较器和电压基准供电,这部分供电是单独的
VREF+,VREF-用于ADC、DAC的基准电压,当使能了STM32F4内部的电压基准,将使用内部基准供VREF+,VREF-。如果没有使能的话,通过外置电压基准提供。
VBAT当VDD不供电的时候,由VBAT为备份域供电。
VDDLDO电压稳压器供电。
VCAP数字核心域供电。
VSS所有电源和模拟稳压器的地端。

二、电源监控器

2.1 上电复位(POR)/掉电复位(PDR)

本器件内部集成由POR/PDR电路,可以从1.8V开始正常工作。

当VDD/VDDA低于指定阈值VPOR/PDR 时,器件无需外部复位电路变回保持复位状态,防止因电压不足强行工作而带来严重的后果。初识电源管理,第2张

图:上电复位/掉电复位波形

见图,在刚开始电压低于VPOR时,STM32保持在上电复位状态(POR);当VDD电压持续上升至大于VPOR时,芯片开始正常运行;

而在芯片正常运行的时候,当检测到VDD电压下降至VPDR阈值,会进入掉电复位状态。

2.2 欠压复位(BOR)

上电期间,欠压复位(BOR)将使器件保持复位状态,直到电源电压达到指定的VBOR阈值。BOR默认为关闭,可以选择4个VBOR阈值。

等级条件电压值
1级欠压阈值下降沿2.19V
1级欠压阈值上升沿2.29V
2级欠压阈值下降沿2.50V
2级欠压阈值上升沿2.59V
3级欠压阈值下降沿2.83V
3级欠压阈值上升沿2.92V

POR与PDR的复位电压阈值是固定的,用户可以使用STM32的BOR功能来自行设定复位阈值。它可以编程控制电压检测工作在BOR欠压阈值等级中的阈值级别,通过修改“选项字节”中的BOR_LEV位即可控制阈值级别。初识电源管理,第3张

如上图所示,当电源电压(VDD)降至所选VBOR阈值以下时,将使器件复位。要禁止BOR功能,VDD必须高于VBOR0,以启动器件选项字节编程序列。

2.3 可编程电压检测器(PVD)

上述POR、PDR以及BOR功能都是使用其电压阈值与外部供电电压VDD比较,当低于工作阈值时,会直接进入复位状态,这可防止电压不足导致的误操作。 除此之外,STM32还提供了可编程电压检测器PVD,它也是实时检测VDD的电压,当检测到电压低于VPVD阈值时, 会向内核产生一个PVD中断(EXTI16线中断)以使内核在复位前进行紧急处理。该电压阈值可通过电源控制寄存器PWR_CSR设置。初识电源管理,第4张

PWR 电源控制/状态寄存器 (PWR_CSR)中提供了 PVDO 标志,用于指示 VDD 是大于还是

小于 PVD 阈值。该事件内部连接到 EXTI 线 16,如果通过 EXTI 寄存器使能,则可以产生中

断。当 VDD 降至 PVD 阈值以下以及/或者当 VDD 升至 PVD 阈值以上时,可以产生 PVD 输

出中断,具体取决于 EXTI 线 16 上升沿/下降沿的配置。该功能的用处之一就是可以在中断

服务程序中执行紧急关闭系统的任务。

三、低功耗

3.1 简介

降低集成电路的能量消耗。

对用电池供电的产品:

①更小的电池体积(降低了大小和成本)

②延长电池寿命

③电磁干扰更小,提高无线通信质量

④电源设计简单,无需过多考虑散热问题。

3.2 低功耗模式

按功耗由高到低排列,STM32具有运行、睡眠、停止和待机四种工作模式。上电复位后STM32处于运行状态时,当内核不需要继续运行, 就可以选择进入后面的三种低功耗模式降低功耗,这三种模式中,电源消耗不同、唤醒时间不同、唤醒源不同,用户需要根据应用需求, 选择最佳的低功耗模式。

模式说明进入方式唤醒方式对1.2V区域时钟的影响对VDD区域时钟的影响调压器
睡眠内核停止,所有外设包括M4核心的外设如NVIC、系统时钟(SysTick)等仍在运行调用WFI命令任一中断内核时钟关,对其他时钟和ADC时钟无影响
睡眠内核停止,所有外设包括M4核心的外设如NVIC、系统时钟(SysTick)等仍在运行调用WFE命令唤醒事件内核时钟关,对其他时钟和ADC时钟无影响
停止所有的时钟都已停止配置PWR_CR寄存器的PDDS+LPDS位+SLEEPD EEP位+WFI或WFE命令任一外部中断(在外部中断寄存器中设置)关闭所有1.2V区域的时钟HSI和HSE的振荡器关闭开启或处于低功耗模式(依据电源控制寄存器的设定)
待机1.2V电源关闭配置PWR_CR寄存器的PDDS+SLEEPD EEP位+WFI或WFE命令WKUP引脚的上升沿、RTC闹钟事件、NRST引脚上的外部复位、IWDG复位关闭所有1.2V区域的时钟HSI和HSE的振荡器关闭

这三种低功耗模式层层递进,运行的时钟或芯片功能越来越少,因而功耗越来越低。

3.2.1 睡眠模式

仅关闭内核时钟,内核停止运行,但所有外设包括M4核心的外设如NVIC、系统时钟(SysTick)等仍在运行。有两种方式进入睡眠模式,他的进入方式决定了睡眠唤醒的方式,分别位WFI和WFE,即由等待“中断”唤醒和“事件”唤醒。

特性说明
立即睡眠在执行WFI或WFE指令时立即进入睡眠模式。
退出时睡眠在退出优先级最低的中断服务程序后才进入睡眠模式。
进入方式内核寄存器的SLEEPDEEP=0,然后调用WFI或WFE指令即可进入睡眠模式;另外若内核寄存器的SLEEPONEXIT=0时,进入“立即睡眠”模式,SLEEPONEXIT=1时,进入“退出时睡眠”模式。
唤醒方式如果是使用WFI指令睡眠的,则可使用任意中断唤醒;如果是使用WFE指令睡眠的,则由事件唤醒。
睡眠时关闭内核时钟,内核停止,而外设正常运行,在软件上表现为不在执行新的代码。这个状态会保留睡眠前的内核寄存器、内存的数据。
唤醒延迟无延迟。
唤醒后若由中断唤醒,先进入中断,退出中断服务程序后,接着执行WFI指令后的程序;若由事件唤醒,直接接着执行WFE后的程序。

3.2.2 停止模式

关闭了其它所有的时钟,所有的外设都停止了工作,但由于其1.2V区域的部分电源没有关闭,还保留了内核的寄存器、内存信息,所以从停止模式唤醒,并重新开启时钟后,还可以从上次停止处继续执行代码。停止模式可以由任意一个外部中断(EXTI)唤醒。在停止模式中可以选择电压调节器为开模式或低功耗模式,可选择内部Flash工作在正常模式或掉电模式。

特性说明
调压器低功耗模式在停止模式下调压器可工作在正常模式或低功耗模式,可进一步降低功耗
flash掉电模式在停止模式下flash可工作在正常模式或掉电模式,可进一步降低功耗
进入方式内核寄存器的SLEEPDEEP=1,PWR_CR寄存器中的PDDS=0,然后调用WFI或WFE指令即可进入停止模式;PWR_CR寄存器的LPDS=0时,调压器工作在正常模式,LPDS=1时工作在低功耗模式;PWR_CR寄存器的FPDS=0时,flash工作在正常模式,FPDS=1时进入掉电模式。
唤醒方式使用WFI指令,可以使用任意EXTI线的中断唤醒;使用WFE指令,可以使用任意配置为事件模式的EXTI线事件唤醒。
停止时内核停止,片上外设停止,会保留停止前的内核寄存器、内存数据。
唤醒延迟基础延迟为HSI的启动时间,若调压器工作在低功耗模式,还得加上调压器从低功耗切换至正常模式下的时间,若FLASH工作在掉电模式,还需要加上FLASH从掉电模式唤醒的时间。
唤醒后若由中断唤醒,先进入中断,退出中断服务程序后,接着执行WFI指令后的程序;若由事件唤醒,直接接着执行WFE后的程序。唤醒后,STM32会使用HSI作为系统时钟。

3.2.3 待机模式

关闭所有时钟,还把1.2V区域的电源全关闭,所以从待机模式唤醒后,由于没有之前代码的运行记录,只能对芯片复位,重新检测boot条件,从头开始执行程序。有四种唤醒方式:WKUP(PA0)引脚的上升沿,RTC闹钟事件,NRST引脚的复位和IWDG(独立看门狗)复位。初识电源管理,第5张

综上所述:若备份域电源正常供电,备份域内的RTC都可以正常运行、备份域内的寄存器及备份域内的SRAM数据被保存,不受功耗模式影响。

四、电源管理相关的库函数及命令初识电源管理,第6张

4.1 进入停机模式

void PWR_EnterSTOPMode(uint32_t PWR_Regulator, uint8_t PWR_STOPEntry)
{
  uint32_t tmpreg = 0;
  assert_param(IS_PWR_REGULATOR(PWR_Regulator));
  assert_param(IS_PWR_STOP_ENTRY(PWR_STOPEntry));
  tmpreg = PWR->CR;
  tmpreg &= CR_DS_MASK;
  tmpreg |= PWR_Regulator;
  PWR->CR = tmpreg;
  SCB->SCR |= SCB_SCR_SLEEPDEEP_Msk;
  if(PWR_STOPEntry == PWR_STOPEntry_WFI)
  {   
    __WFI();
  }
  else
  {
    __WFE();
  }
  SCB->SCR &= (uint32_t)~((uint32_t)SCB_SCR_SLEEPDEEP_Msk);  
}

4.2 进入待机模式

void PWR_EnterSTANDBYMode(void)
{
  /* Clear Wakeup flag */
  PWR->CR |= PWR_CR_CWUF;
  
  /* Select STANDBY mode */
  PWR->CR |= 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();
}

4.3 获取标志位状态

①PWR_FLAG_WU: Wake Up flag 唤醒标志 ②PWR_FLAG_SB: StandBy flag 待命标志 ③PWR_FLAG_PVDO: PVD Output 电源电压检测器(PVD)输出标志

FlagStatus PWR_GetFlagStatus(uint32_t PWR_FLAG)
{
  FlagStatus bitstatus = RESET;
  
  /* Check the parameters */
  assert_param(IS_PWR_GET_FLAG(PWR_FLAG));
  
  if ((PWR->CSR & PWR_FLAG) != (uint32_t)RESET)
  {
    bitstatus = SET;
  }
  else
  {
    bitstatus = RESET;
  }
  /* Return the flag status */
  return bitstatus;
}

4.4 使能或失能唤醒引脚功能

void PWR_WakeUpPinCmd(FunctionalState NewState)
{
  /* Check the parameters */  
  assert_param(IS_FUNCTIONAL_STATE(NewState));
​
  *(__IO uint32_t *) CSR_EWUP_BB = (uint32_t)NewState;
}

4.5 将PWR外设寄存器初始化为默认复位值

void PWR_DeInit(void)
{
  RCC_APB1PeriphResetCmd(RCC_APB1Periph_PWR, ENABLE);
  RCC_APB1PeriphResetCmd(RCC_APB1Periph_PWR, DISABLE);
}

4.6 使能或失能对RTC和备份寄存器的访问

void PWR_BackupAccessCmd(FunctionalState NewState)
{
  /* Check the parameters */
  assert_param(IS_FUNCTIONAL_STATE(NewState));
  
  *(__IO uint32_t *) CR_DBP_BB = (uint32_t)NewState;
}

4.7 使能或失能电源电压检测器

void PWR_PVDCmd(FunctionalState NewState)
{
  /* Check the parameters */
  assert_param(IS_FUNCTIONAL_STATE(NewState));
​
  *(__IO uint32_t *) CR_PVDE_BB = (uint32_t)NewState;
}

4.8 配置电源电压检测器(PVD)检测到的电压阈值

void PWR_PVDLevelConfig(uint32_t PWR_PVDLevel)
{
  uint32_t tmpreg = 0;
  
  /* Check the parameters */
  assert_param(IS_PWR_PVD_LEVEL(PWR_PVDLevel));
  
  tmpreg = PWR->CR;
  
  /* Clear PLS[7:5] bits */
  tmpreg &= CR_PLS_MASK;
  
  /* Set PLS[7:5] bits according to PWR_PVDLevel value */
  tmpreg |= PWR_PVDLevel;
  
  /* Store the new value */
  PWR->CR = tmpreg;
}

4.9清除标志

void PWR_ClearFlag(uint32_t PWR_FLAG)
{
  /* Check the parameters */
  assert_param(IS_PWR_CLEAR_FLAG(PWR_FLAG));
  
#if defined (STM32F427_437xx) || defined (STM32F429_439xx)
  if (PWR_FLAG != PWR_FLAG_UDRDY)
  {
    PWR->CR |=  PWR_FLAG << 2;
  }
  else
  {
    PWR->CSR |= PWR_FLAG_UDRDY;
  }
#endif /* STM32F427_437xx ||  STM32F429_439xx */
​
#if defined (STM32F40_41xxx) || defined (STM32F401xx) 
  PWR->CR |=  PWR_FLAG << 2;
#endif /* STM32F40_41xxx */
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明原文出处。如若内容造成侵权/违法违规/事实不符,请联系SD编程学习网:675289112@qq.com进行投诉反馈,一经查实,立即删除!