初识电源管理

初识电源管理本文详细阐述了 STM32 微控制器的电源管理 包括电源供应 调压器电路的功能 备用域电路的设计 低功耗模式 运行 睡眠 停止和待机 以及相关的电源监控器 标志位管理和库函数

大家好,欢迎来到IT知识分享网。

一、电源供电

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

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

①备份域电路

包含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 时,器件无需外部复位电路变回保持复位状态,防止因电压不足强行工作而带来严重的后果。初识电源管理

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

见图,在刚开始电压低于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位即可控制阈值级别。初识电源管理

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

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

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

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(独立看门狗)复位。初识电源管理

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

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

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 */ }

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/131003.html

(0)
上一篇 2025-08-11 14:10
下一篇 2025-08-11 14:15

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信