电源对电子设备的重要性不言而喻,它是保证系统稳定运行的基础,而保证系统能稳定运行后,又有低功耗的要求。在很多应用场合中都对电子设备的功耗要求非常苛刻,如某些传感器信息采集设备,仅靠小型的电池提供电源,要求工作长达数年之久,且期间不需要任何维护;由于智慧穿戴设备的小型化要求,电池体积不能太大导致容量也比较小,所以也很有必要从控制功耗入手,提高设备的续行时间。因此,STM32 有专门的电源管理外设监控电源并管理设备的运行模式,确保系统正常运行,并尽量降低器件的功耗。
电源监控器STM32芯片主要通过引脚 VDD 从外部获取电源,在它的内部具有电源监控器用于检测 VDD的电压,以实现复位功能及掉电紧急处理功能,保证系统可靠地运行。
1. 上电复位与掉电复位(POR与 PDR)
当检测到 VDD 的电压低于阈值 VPOR及 VPDR 时,无需外部电路辅助,STM32 芯片会自动保持在复位状态,防止因电压不足强行工作而带来严重的后果。见图 45-1,在刚开始电压低于 VPOR时(约 1.72V),STM32 保持在上电复位状态(POR,Power On Reset),当VDD 电压持续上升至大于 VPOR时,芯片开始正常运行,而在芯片正常运行的时候,当检测到 VDD 电压下降至低于 VPDR阈值(约 1.68V),会进入掉电复位状态(PDR,Power Down Reset)。
2. 欠压复位(BOR)
POR与 PDR的复位电压阈值是固定的,如果用户想要自行设定复位阈值,可以使用STM32的 BOR功能( Brownout Reset )。它可以编程控制电压检测工作在表 45-1 中的阈值级别,通过修改“选项字节”(某些特殊寄存器)中的 BOR_LEV 位即可控制阈值级别。其复位控制示意图见图 45-2。
3. 可编程电压检测器 PVD
上述 POR、PDR以及 BOR功能都是使用其电压阈值与外部供电电压 VDD 比较,当低于工作阈值时,会直接进入复位状态,这可防止电压不足导致的误操作。除此之外,STM32还提供了可编程电压检测器 PVD,它也是实时检测 VDD的电压,当检测到电压低于 VPVD阈值时,会向内核产生一个 PVD 中断(EXTI16 线中断)以使内核在复位前进行紧急处理。该电压阈值可通过电源控制寄存器 PWR_CSR设置。
使用 PVD可配置 8 个等级,见表 45-2。其中的上升沿和下降沿分别表示类似图 45-2中 VDD电压上升过程及下降过程的阈值。
STM32 的电源系统为了方便进行电源管理,STM32 把它的外设、内核等模块跟据功能划分了供电区域,其内部电源区域划分见图 45-3。
从框图了解到,STM32的电源系统主要分为备份域电路、内核电路以及 ADC电路三部分,介绍如下:
备份域电路
STM32的 LSE 振荡器、RTC、备份寄存器及备份 SRAM这些器件被包含进备份域电路中,这部分的电路可以通过 STM32的 VBAT引脚获取供电电源,在实际应用中一般会使用 3V的钮扣电池对该引脚供电。
在图中备份域电路的左侧有一个电源开关结构,它的功能类似图 45-4 中的双二极管,在它的上方连接了 VBAT 电源,下方连接了 VDD主电源(一般为 3.3V),右侧引出到备份域电路中。当 VDD主电源存在时,由于 VDD电压较高,备份域电路通过 VDD 供电,当 VDD掉电时,备份域电路由钮扣电池通过 VBAT 供电,保证电路能持续运行,从而可利用它保留关键数据。
调压器供电电路
在 STM32 的电源系统中调压器供电的电路是最主要的部分,调压器为备份域及待机电路以外的所有数字电路供电,其中包括内核、数字外设以及 RAM,调压器的输出电压约为 1.2V,因而使用调压器供电的这些电路区域被称为 1.2V 域。调压器可以运行在“运行模式”、“停止模式”以及“待机模式”。在运行模式下,1.2V 域全功率运行;在停止模式下 1.2V 域运行在低功耗状态,1.2V 区域的所有时钟都被关闭,相应的外设都停止了工作,但它会保留内核寄存器以及SRAM的内容;在待机模式下,整个 1.2V域都断电,该区域的内核寄存器及SRAM内容都会丢失(备份区域的寄存器及 SRAM 不受影响)。
ADC 电源及参考电压
为了提高转换精度,STM32 的 ADC 配有独立的电源接口,方便进行单独的滤波。ADC 的工作电源使用 VDDA引脚输入,使用 VSSA作为独立的地连接,VREF引脚则为 ADC提供测量使用的参考电压。
STM32的功耗模式按功耗由高到低排列,STM32具有运行、睡眠、停止和待机四种工作模式。上电复位后 STM32 处于运行状态时,当内核不需要继续运行,就可以选择进入后面的三种低功耗模式降低功耗,这三种模式中,电源消耗不同、唤醒时间不同、唤醒源不同,用户需要根据应用需求,选择最佳的低功耗模式。三种低功耗的模式说明见表 45-3。
从表中可以看到,这三种低功耗模式层层递进,运行的时钟或芯片功能越来越少,因而功耗越来越低。
1. 睡眠模式
在睡眠模式中,仅关闭了内核时钟,内核停止运行,但其片上外设,CM4核心的外设全都还照常运行。有两种方式进入睡眠模式,它的进入方式决定了从睡眠唤醒的方式,分别是 WFI(wait for interrupt)和 WFE(wait for event),即由等待“中断”唤醒和由“事件”唤醒。睡眠模式的各种特性见表 45-4。
2. 停止模式
在停止模式中,进一步关闭了其它所有的时钟,于是所有的外设都停止了工作,但由于其 1.2V 区域的部分电源没有关闭,还保留了内核的寄存器、内存的信息,所以从停止模
式唤醒,并重新开启时钟后,还可以从上次停止处继续执行代码。停止模式可以由任意一个外部中断(EXTI)唤醒。在停止模式中可以选择电压调节器为开模式或低功耗模式,可选
择内部 FLASH 工作在正常模式或掉电模式。停止模式的各种特性见表 45-5。
3. 待机模式
待机模式,它除了关闭所有的时钟,还把 1.2V 区域的电源也完全关闭了,也就是说,从待机模式唤醒后,由于没有之前代码的运行记录,只能对芯片复位,重新检测 boot 条件,从头开始执行程序。它有四种唤醒方式,分别是 WKUP(PA0)引脚的上升沿,RTC 闹钟事件,NRST 引脚的复位和 IWDG(独立看门狗)复位。
在以上讲解的睡眠模式、停止模式及待机模式中,若备份域电源正常供电,备份域内的 RTC 都可以正常运行、备份域内的寄存器及备份域内的 SRAM数据会被保存,不受功耗模式影响。
电源管理相关的库函数及命令2.1 配置 PVD监控功能
PVD可监控 VDD 的电压,当它低于阈值时可产生 PVD中断以让系统进行紧急处理,这个阈值可以直接使用库函数 PWR_PVDLevelConfig 配置成前面表 45-2 中说明的阈值等级。
2.2 WFI与 WFE命令
我们了解到进入各种低功耗模式时都需要调用 WFI 或 WFE 命令,它们实质上都是内核指令,在库文件 core_cmInstr.h 中把这些指令封装成了函数,见代码清单 24-1。
我们了解到进入各种低功耗模式时都需要调用 WFI 或 WFE 命令,它们实质上都是内核指令,在库文件 core_cmInstr.h 中把这些指令封装成了函数,见代码清单 24-1。
对于这两个指令,我们应用时一般只需要知道,调用它们都能进入低功耗模式,需要使用函数的格式“__WFI();”和“__WFE();”来调用(因为__wfi及__wfe 是编译器内置的函数,函数内部使用调用了相应的汇编指令)。其中 WFI指令决定了它需要用中断唤醒,而WFE 则决定了它可用事件来唤醒,关于它们更详细的区别可查阅《cortex-CM3/CM4权威指南》了解。
2.3 进入停止模式
直接调用 WFI和 WFE 指令可以进入睡眠模式,而进入停止模式则还需要在调用指令前设置一些寄存器位,STM32标准库把这部分的操作封装到 PWR_EnterSTOPMode函数中
了,它的定义见代码清单 43-2。
这个函数有两个输入参数,分别用于控制调压器的模式及选择使用 WFI 或 WFE 停止,代码中先是根据调压器的模式配置 PWR_CR寄存器,再把内核寄存器的 SLEEPDEEP 位置1,这样再调用 WFI或 WFE命令时,STM32就不是睡眠,而是进入停止模式了。函数结尾处的语句用于复位 SLEEPDEEP 位的状态,由于它是在 WFI及 WFE 指令之后的,所以这部分代码是在 STM32 被唤醒的时候才会执行。要注意的是进入停止模式后,STM32的所有 I/O都保持在停止前的状态,而当它被唤醒时,STM32 使用 HSI作为系统时钟(16MHz)运行,由于系统时钟会影响很多外设的工作状态,所以一般我们在唤醒后会重新开启 HSE,把系统时钟设置会原来的状态。前面提到在停止模式中还可以控制内部 FLASH 的供电,控制 FLASH 是进入掉电状态还是正常供电状态,这可以使用库函数 PWR_FlashPowerDownCmd 配置,它其实只是封装了一个对 FPDS寄存器位操作的语句,见代码清单 45-3。这个函数需要在进入停止模式前被调用,即应用时需要把它放在上面的 PWR_EnterSTOPMode 之前。
2.4 进入待机模式
类似地,STM32 标准库也提供了控制进入待机模式的函数,其定义见代码清单 43-3。
该函数中先配置了 PDDS寄存器位及 SLEEPDEEP寄存器位,接着调用__force_stores函数确保存储操作完毕后再调用 WFI指令,从而进入待机模式。这里值得注意的是,待机
模式也可以使用 WFE 指令进入的,如果您有需要可以自行修改;另外,由于这个函数没有操作 WUF寄存器位,所以在实际应用中,调用本函数前,还需要清空 WUF寄存器位才能进入待机模式。
在进入待机模式后,除了被使能了的用于唤醒的 I/O,其余 I/O 都进入高阻态,而从待机模式唤醒后,相当于复位 STM32 芯片,程序重新从头开始执行。