电源对电子设备的重要性不言而喻,它是保证系统稳定运行的基础,而保证系统能稳定运行的同时,又有低功耗的要求。在很多应用场合中都对电子设备的功耗要求非常苛刻,如 某些传感器信息采集设备,仅靠小型的电池提供电源,要求工作长达数年之久,且期间不需要任何维护;由于智慧穿戴设备的小型化要求,电池体积不能太大导致容量也比较小,所以也很有必要从控制功耗入手,提高设备的续行时间。因此,STM32有专门的电源管理外设监控电源并管理设备的运行模式,确保系统正常运行,并尽量降低器件的功耗。
为了方便进行电源管理,STM32 把它的外设、内核等模块根据功能划分了供电区域, 其内部电源区域划分如下图:
从框图了解到,STM32的电源系统主要分为备份域电路、内核电路以及ADC电路三部分,介绍如下:
①:备份域电路
STM32的LSE 振荡器、RTC、备份寄存器及备份 SRAM 这些器件被包含进备份域电路中,这部分的电路可以通过STM32的 VBAT 引脚获取供电电源,在实际应用中一般会使用 3V 的钮扣电池对该引脚供电。
在图中备份域电路的左侧有一个电源开关结构,在它的上方连接了 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 提供测量使用的参考电压。用户可以在VREF上连接一个单独的外部参考电压ADC输入。V REF上的电压范围从1.8 V到VDDA。
STM32芯片主要通过引脚 VDD 从外部获取电源,在它的内部具有电源监控器用于检测 VDD的电压,以实现复位功能及掉电紧急处理功能,保证系统可靠地运行。
1、上电复位与掉电复位(POR与PDR)
当检测到 VDD 的电压低于阈值 VPOR 及 VPDR 时,无需外部电路辅助,STM32 芯片会自动保持在复位状态,防止因电压不足强行工作而带来严重的后果。见下图,在刚开始电压低于 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)。VBOR是通过设备选项字节配置的。默认情况下,BOR是关闭的。可以选择3个可编程V BOR阈值水平。
- BOR为3(VBOR3)。断电阈值为3。
- BOR为2(VBOR2)。断电阈值为2。
- BOR为1(VBOR1)。断电阈值为1。
3、可编程电压检测器(PVD)
上述 POR、PDR 以及 BOR功能都是使用其电压阈值与外部供电电压 VDD 比较,当低 于工作阈值时,会直接进入复位状态,这可防止电压不足导致的误操作。除此之外, STM32 还提供了可编程电压检测器 PVD,它也是实时检测 VDD 的电压,当检测到电压低于 VPVD 阈值时,会向内核产生一个 PVD 中断(EXTI16 线中断)以使内核在复位前进行紧急处理。该电压阈值可通过电源控制寄存器 PWR_CSR 设置。
默认情况下,微控制器在系统或开机复位后处于运行模式。在运行模式下,CPU由HCLK计时,程序代码执行。当CPU不需要继续运行时,例如在等待外部事件时,可以使用几种低功耗模式来节省电能。用户可以选择在低功耗、短启动时间和可用唤醒源之间做出最佳的模式。
STM32F4具有三种低功耗模式:
- 睡眠模式:Cortex-M4与FPU内核停止,外围设备继续运行如NVIC、系统时钟等。
- 停止模式:在停止模式下,1.2V域中所有时钟停止,锁相环、HSI和HSE RC振荡器禁用。内部SRAM和寄存器内容被保存。电压调节器可以配置在正常或低功耗模式。
- 待机模式:待机模式可以实现最低的功耗,它基于Cortex-M4深睡眠模式,并禁用了电压调节器。因此1.2V域被关闭。锁相环、HSI振荡器和HSE振荡器也被关闭。除RTC寄存器,RTC备份寄存器,备份SRAM和备用电路外,SRAM和寄存器内容都会丢失。
本实验只配置STM32F4的待机模式,在待机模式下,它除了关闭所有的时钟,还把1.2V区域的电源也完全关闭了,也就是说,从待机模式唤醒后,由于没有之前代码的运行记录,只能对芯片复位,重新检测boot条件,从头开始执行程序。它有四种唤醒方式,分别是WKUP(PA0)引脚的上升沿,RTC闹钟时间,NRST引脚的复位和IWDG(独立看门狗)复位。
电源控制(PWR)寄存器包括:PWR电源控制寄存器(PWR_CR)、PWR电源控制/状态寄存器(PWR_CSR)。
bsp_wakeup.c程序如下:
#include "bsp_wakeup.h"
// 系统进入待机模式
static void PWR_Enter_Standby(void)
{
__HAL_RCC_PWR_CLK_ENABLE(); // 使能 PWR 时钟
__HAL_PWR_CLEAR_FLAG(PWR_FLAG_WU); // 清除 Wake_UP 标志
HAL_PWR_EnableWakeUpPin(PWR_WAKEUP_PIN1); // 设置 WKUP 用于唤醒
HAL_PWR_EnterSTANDBYMode(); // 进入待机模式
}
// 唤醒按键初始化
void WAKEUP_Init(void)
{
GPIO_InitTypeDef GPIO_Initure; // 定义初始化GPIO结构体变量
__HAL_RCC_GPIOE_CLK_ENABLE(); // 开始GPIOE时钟
GPIO_Initure.Pin = GPIO_PIN_3; // PE3引脚
GPIO_Initure.Pull = GPIO_PULLUP; // 上拉
GPIO_Initure.Mode = GPIO_MODE_IT_FALLING; // 下降沿触发
GPIO_Initure.Speed = GPIO_SPEED_FREQ_HIGH; // 高速
HAL_GPIO_Init(GPIOE, &GPIO_Initure); // GPIOE初始化
HAL_NVIC_SetPriority(EXTI3_IRQn, 2, 2);
HAL_NVIC_EnableIRQ(EXTI3_IRQn);
}
// 中断服务函数
void EXTI3_IRQHandler(void)
{
HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_3);
}
// 中断回调函数
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
if(GPIO_Pin == GPIO_PIN_3)
{
PWR_Enter_Standby(); // 进入待机模式
}
}
主函数如下:
int main(void)
{
CLOCLK_Init(); // 配置系统时钟为168M
LED_Init(); // LED初始化
WAKEUP_Init(); // 初始化进入待机模式引脚
while(1)
{
LED1_ON;
LED2_ON;
HAL_Delay(500);
LED1_OFF;
LED2_OFF;
HAL_Delay(500);
}
}
现象:将程序下载到开发板后,可以看到LED1和LED2灯开始闪烁,当我们按下KEY1按键时,开发板进入待机模式,LED灯停止闪烁,此时我们按下KEY_UP按键来唤醒待机模式,按下后可以看到LED灯又重新开始闪烁。