电源控制(PWR)简介
电源控制部分(PWR)概述了不同电源域的电源架构以及电源配置控制器。PWR 的内容比较多,我们把它们的主要特性概括为以下 3 点:
电源系统:USB 稳压器、内核域(VCORE)、VDD 域、备份域、模拟域(VDDA)。
电源监控:POR/PDR 监控器、BOR 监控器、PVD 监控器、AVD 监控器、VBAT 阈值、温度阈值。
电源管理:VBAT 电池充电、工作模式、电压调节控制、低功耗模式。
下面将分别对这 3 个特性进行简单介绍。
电源系统:
在电源概述框图中我们划分了 3 个区域,分别是独立的 A/D 转换器供电和参考电压、电压调节器、电池备份区域。下面分别进行简单的介绍:
① 后备电源
一般是电池,接 VBAT 引脚上。VDD断电的时候后备电源继续供电维持 RTC 运转。同时 VBAT 引脚也为 RTC、SRAM 和 LSE 振荡器供电。切换到𝑉𝐵𝐴𝑇供电由复位模块中的掉电复位功能控制。
② 电压调节器
嵌入式线性调压器为备份域和待机电路以外的所有数字电路供电。电压调节器输出电压约为 1.2V。此调压器需要将两个外部电容连接到专用引脚𝑉𝐶𝐴𝑃_1和𝑉𝐶𝐴𝑃_2,所有封装都配有这两个引脚。为激活或停用调压器,必须将特定引脚连接到 VSS 或 VDD。具体引脚与封装有关。
通过软件激活时,调压器在复位后始终处于使能状态。
根据应用模式的不同,可采用三种不同的模式工作。在运转模式下,调压器以正常功耗模式为内核、内存和外设提供 1.2V;在停止模式下,调压器以低功耗模式提供 1.2V 电源,以保存寄存器和 SRAM 的内容。在待机模式下,调压器停止供电,除了备用电路和备份域外,寄存器和SRAM 的内容全部丢失。
③ A/D 转换器
为了提高转换精度,ADC 配有独立电源,可以单独滤波并屏蔽 PCB 上的噪声。ADC 电源电压从单独的 VDDA 引脚接入,VSSA 提供了独立的电源接地连接。为了确保测量低电压时具有更高的精度,用户可以在VREF 上连接到单独的 ADC 外部参考电压输入,VREF 电压介于 1.8V 到 VDDA 之间。
电源监控:
电源监控的部分主要关注 PVD 监控器,以及 上电复位(POR)/掉电复位(PDR)。
⚫ 上电复位(POR)/掉电复位(PDR)
一个上电复位,一个掉电复位,低于上电复位阈值 VPOR 或者低于掉电复位阈值 VPDR 的时候系统保持复位状态,否则正常运行。
⚫ 欠压复位(BOR)
上电期间,欠压复位(BOR)将使系统保持复位状态,直到 VDD 电源电压达到指定的 VBOR 阈值。VBOR 阈值通过系统选项字节(某些寄存器的 BOR_LEV 位)进行配置。默认情况下,BOR 关闭。可选择以下可编程 VBOR阈值:
⚫ 可编程电压检测器(PVD)
上面介绍的 POR、PDR 以及 BOR 功能都是设置电压阈值与外部供电电压 VDD 比较,当 VDD低于设置的电压阈值时,就会直接进入复位状态,防止电压不足导致的误操作。
下面介绍可编程电压检测器(PVD),它可以实时监视 VDD的电压,方法是将 VDD与 PWR 控制寄存器 1(PWR_CR1)中的 PLS[2:0]位所选的 VPVD 阈值进行比较。当检测到电压低于VPVD 阈值时,如果使能 EXTI16 线中断,即使能 PVD & AVD 中断(可参考表 15.1.2.1 知道EXTI16 线内部连接 PVD 中断事件),可以产生 PVD 中断,具体取决于 EXTI16 线配置为检测
上升还是下降沿,然后在复位前,在中断服务程序中执行紧急关闭系统等任务。
电源管理
电源管理的部分主要关注低功耗模式,在 STM32 的正常工作中,具有四种工作模式,运行、睡眠、停止以及待机。在上电复位后,STM32 处于运行状态时,当内核不需要继续运行,就可以选择进入后面的三种模式降低功耗。这三种低功耗模式电源消耗不同、唤醒时间不同和唤醒源不同,我们要根据自身的需要选择合适的低功耗模式。
下面是低功耗模式汇总介绍,如下表所示。
下面对睡眠模式、停止模式和待机模式的进入及退出方法进行介绍。
1、睡眠模式
进入睡眠模式,CPU 时钟关闭,但是其他所有的外设仍可以运行,所以任何中断或事件都可以唤醒睡眠模式。
有两种方式进入睡眠模式 WFI 和 WFE。这两种方式进入的睡眠模式唤醒的方法不同,分别是 WFI(wait for interrupt)和 WFE(wait for event),即由等待“中断”唤醒和由“事件”唤醒。下面我们看看睡眠模式进入及退出方法:
2、停止模式
进入停止模式,所有的时钟都关闭,于是所有的外设也停止了工作。但是 VDD 电源是没有关闭的,所以内核的寄存器和内存信息都保留下来,等待重新开启时钟就可以从上次停止的地方继续执行程序。
值得注意的是:当电压调节器处于低功耗模式下,当系统从停止模式退出时,将会有一段额外的启动延时。如果在停止模式期间保持内部调节器开启,则退出启动时间会缩短,但相应的功耗会增加。
3、待机模式
待机模式可实现最低功耗。该模式是在 CM4 深睡眠模式时关闭电压调节器,整个 1.8V 供电区域被断电。PLL、HSI、和 HSE 振荡器也被断电。除备份域(RTC 寄存器、RTC 备份寄存器和备份SRAM)和待机电路中的寄存器外,SRAM 和其他寄存器内容都将丢失。不过如果我们使能了备份区域(备份 SRAM、RTC、LSE),那么待机模式下的功耗,将达到 6uA 左右。下面我们看看待机模式进入及退出方法:
PWR模块寄存器
⚫ PWR 控制寄存器 1(PWR_CR1)
PVD电压监控实验只需要用到 PWR_CR1 控制寄存器,还有就是 EXTI16 线中断。
位[7:5] PLS 用于设置 PVD 检测的电压阀值,即前面我们介绍 PVD 的 8 个等级阀值选择。
位 4 PVDE 位,用于使能或者禁止 PVD 检测,显然我们要使能 PVD 检测,该位置 1。
这个寄存器还有其他的位我们没有列出来,也是跟电源相关的,如待机,掉电等,我们后面的实验再讲解这些功能,这里先跳过。
再有就是 EXTI 中断屏蔽寄存器(EXTI_IMR)。中断屏蔽寄存器是32位,用到23位,每位控制一个EXTI线上的中断请求屏蔽还是开放。
上升沿触发选择器(EXTI_RTSR)。上升沿触发选择器是32位,用到23位,每位控制一个EXTI线上的上升沿触发中断允许还是禁止。
下降沿触发选择器(EXTI_FTSR)。下降沿触发选择器是32位,用到23位,每位控制一个EXTI线上的下降沿触发中断允许还是禁止。
挂起寄存器(EXTI_PR)。挂起寄存器是32位,用到23位,每位控制一个EXTI线上的下降沿触发中断允许还是禁止。
PVD电压监控实验
例程,开发板供电正常的话,LCD 屏会显示"PVD Voltage OK!"。当供电电压过低,则会通过 PVD中断服务函数将 LED1点亮;当供电电压正常后,会在 PVD中断服务函数将 LED1熄灭。LED0 闪烁,提示程序运行。
可编程电压检测器 PVD 属于 STM32F429 的内部资源,只需要软件设置好即可正常工作。
PWR 在 HAL 库中的驱动代码在 stm32f4xx_hal_pwr.c 文件(及其头文件)中。
PVD电压监测配置步骤
HAL_PWR_ConfigPVD 函数用来初始化 PWR。可以用 PWR_PVDTypeDef 初始化结构体来设置 PVD 检测级别 并指定 PVD 的 EXTI 边沿触发模式。
typedef struct
{
uint32_t PVDLevel; /* 指定 PVD 检测级别 */
uint32_t Mode; /* 指定 PVD 的 EXTI 检测模式 */
}PWR_PVDTypeDef;
/*
1)PVDLevel:指向 PVD 检测级别,对应 PWR_CR1 寄存器的 PLS 位的设置,取值范围
PWR_PVDLEVEL_0 到 PWR_PVDLEVEL_7,共八个级别。
2)Mode:指定 PVD 的 EXTI 边沿检测模式。
*/
void HAL_PWR_ConfigPVD (PWR_PVDTypeDef *sConfigPVD);
配置步骤:
1) 调用 HAL_PWR_ConfigPVD 函数配置 PVD,包括检测电压级别、中断线触发方式等。
其实就是 PWR_CR1 设置检测电压级别,EXTI 的 IMR、RTSR、FTSR、PR等设置PVD外部中断。
2)使能 PVD 检测,配置 PVD/AVD 中断优先级,开启 PVD/AVD 中断。
通过 HAL_PWR_EnablePVD 函数使能 PVD 检测。PWR_CR1控制寄存器设置PVD检测级别 和 PVD电源电压检测器使能。
通过 HAL_NVIC_EnableIRQ 函数使能 PVD/AVD 中断。
通过 HAL_NVIC_SetPriority 函数设置中断优先级。3)编写中断服务函数
PVA/AVD 中断服务函数为:PVD_AVD_IRQHandler。然后逻辑代码在 PVD/AVD 中断服务回调函数 HAL_PWR_PVDCallback 中编写。中断函数里面可以通过__HAL_PWR_GET_FLAG(PWR_FLAG_PVDO) 从 CSR 寄存器读出 PVDO 标志位的值,判断电压是否低于检测级别下的电压阈值。
睡眠模式实验
WFI / WFE 指令进入睡眠模式,进入睡眠模式后,使用外部中断唤醒。进入外部中断后,EXTI_IMR1 寄存器的值会自动清零,我们需要对应的外部中断线位置 1,取消屏蔽,相当于其他中断的中断标志位进入中断后硬件自动置 1,需要手动清零。
进入睡眠模式函数 EnterSLEEPMode,其声明如下:
void HAL_PWR_EnterSLEEPMode (uint32_t Regulator, uint8_t SLEEPEntry);
⚫ 函数描述:
用于设置 CPU 进入睡眠模式。
⚫ 函数形参:
形参 1 指定稳压器的状态。有两个选择,PWR_MAINREGULATOR_ON 表示稳压器处于正常模式,PWR_LOWPOWERREGULATOR_ON 表示稳压器处于低功耗模式。对应的是 PWR_CR 寄存器的 LPDS 位的设置。
形参 2 指定进入睡眠模式的方式。有两个选择,PWR_SLEEPENTRY _WFI 表示使用 WFI
指令,PWR_SLEEPENTRY_WFE 表示使用 WFE 指令。
PWR睡眠模式配置步骤
1)配置外部中断作为唤醒睡眠模式的方式
2)通过 HAL_PWR_EnterSLEEPMode 进入 CPU 睡眠模式。其实就是发送 WFI 指令。
3)按键触发外部中断,CPU从睡眠模式唤醒。是SCB的SCR寄存器清除SLEEPDEEP位,将cpu从睡眠模式唤醒。
停止模式和待机模式可看作深度睡眠状态
接收到 WFI/WFE 后是 睡眠还是停止由 内核寄存器的DEEPSLEEP位控制。
接收到 WFI/WFE 后是 停止还是待机由 CR寄存器 控制。
停止模式
停止模式寄存器
⚫ PWR 控制寄存器 (PWR_CR)
PWR 的 控制寄存器 CR 可以通过 PDDS 位域 选择 WFI/WFE 指令进入停止模式还是待机模式,停止模式即对 PDDS 位置 0 即可。在停止模式下,电压调节器开启还是低功耗,我们设置稳压器为低功耗模式,等待中断唤醒,所以位 LPDS 置 1。
⚫ 系统控制及状态寄存器(PWR_CSR)
WFI 指令进入停止模式。使用外部中断唤醒。
该寄存器在于 ARM 内核中,详细描述可查阅《Cortex-M3 权威指南》。在本实验中,我们需要把 SLEEPDEEP 位置 1,这样子后面调用 WFI 命令时,进入的就是停止模式了。在唤醒后,需要清除 SLEEPDEEP 位,进行置 0。
停止模式配置步骤
进入停止模式函数,其声明如下:
void HAL_PWR_EnterSTOPMode (uint32_t Regulator, uint8_t STOPEntry);
⚫ 函数描述:
用于设置 CPU 进入停止模式。
⚫ 函数形参:
形参 1 指定稳压器在停止模式下的状态。有两个选择,PWR_MAINREGULATOR_ON 表示稳压器处于主模式,PWR_LOWPOWERREGULATOR_ON 表示稳压器处于低功耗模式。对应的是 PWR_CR 寄存器的 LPDS 位的设置。
形参 2 指定用 WFI 还是 WFE 指令进入停止模式。有两个选择,PWR_STOPENTRY_WFI 表示使用 WFI 指令,PWR_STOPENTRY_WFE 表示使用 WFE 指令。我们选择前者,不了解这两种指令的区别,可以回看 30.1.3 小节的知识。
函数返回值:无
停止模式配置步骤:
1)配置外部中断,作为唤醒停止模式的方式
2)调用EnterSTOPMode函数进入停止模式。其实就是配置 CR 寄存器选择深度睡眠时进入停止模式,配置 CSR 寄存器使 WFI 指令作用于停止模式。
3)按键触发外部中断唤醒停止模式
待机模式
PWR_CR 寄存器的 CWUF 位可清除唤醒标志位。PDDS 位可控制 WFI/WFU 命令进入停止模式还是待机模式。
PWR_CSR 寄存器的 EWUP 位用来使能 WKUP引脚的待机唤醒功能。
待机模式配置步骤
使能唤醒引脚函数,其声明如下:
void HAL_PWR_EnableWakeUpPin (uint32_t WakeUpPinPolarity);
⚫ 函数描述:
用于使能唤醒引脚。
⚫ 函数形参:
形参 1 取值范围:PWR_WAKEUP_PIN1。
⚫ 函数返回值:
无
⚫ 注意事项:
禁止某个唤醒引脚使用的函数如下:
void HAL_PWR_DisableWakeUpPin (uint32_t WakeUpPinPolarity);
进入待机模式函数,其声明如下:
void HAL_PWR_EnterSTANDBYMode (void);
⚫ 函数描述:
用于使 CPU 进入待机模式,进入待机模式,首先要设置 SLEEPDEEP 位,接着我们通 PWR_CR 设置 PDDS 位,使得 CPU 进入深度睡眠时进入待机模式,最后执行 WFI 指令开始进入待机模式,并等待 WK_UP 唤醒的到来。
⚫ 函数形参:
无
⚫ 函数返回值:
无
待机模式配置步骤:
1)进入 CPU 待机模式
在进入待机模式之前我们需要做一些准备,比如:关闭 RTC 相关中断、清除 RTC 相关中断标志位等一些操作,只是防止 RTC 中断唤醒。这里就不细讲,详见本例程源码。通过__HAL_PWR_CLEAR_FLAG 函数清除唤醒标志位。通过 HAL_PWR_EnableWakeUpPin 函数使能 PA0 的唤醒功能(wkup引脚)。通过 HAL_PWR_EnterSTANDBYMode 函数进入待机模式。
2)通过按下 WKUP 引脚上升沿触发唤醒待机模式
按下 WK_UP 按键(特定唤醒源)触发唤醒待机模式。