第十九章 PWR
目录
本章介绍了W55MH32的电源控制(PWR)功能,其工作电压2.0~3.6V,含电源管理器,有POR/PDR、PVD等。低功耗模式包括睡眠、停止、待机,介绍了相关例程,用于测试低功耗模式及唤醒功能。
1 电源介绍
W55MH32 的工作电压(VDD)为 2.0~3.6V。通过内置的电压调节器提供所需的 1.8V 电源。当主电源 VDD 掉电后,通过 VBAT 脚为实时时钟(RTC)和备份寄存器提供电源。
电源框图
注:VDDA 和 VSSA 必须分别联到 VDD 和 VSS。
1.1 独立的 A/D 转换器供电和参考电压
为了提高转换的精确度,ADC 使用一个独立的电源供电,过滤和屏蔽来自印刷电路板上的毛刺干扰。
- ADC 的电源引脚为 VDDA
- 独立的电源地 VSSA
如果有 VREF-引脚(根据封装而定),它必须连接到 VSSA。为了确保输入为低压时获得更好精度,用户可以连接一个独立的外部参考电压 ADC 到 VREF+和VREF-脚上。在 VREF+的电压范围为 2.4V~VDDA。
1.2 电池备份区域
使用电池或其他电源连接到 VBAT 脚上,当 VDD 断电时,可以保存备份寄存器的内容和维持 RTC的功能。
VBAT 脚为 RTC、LSE 振荡器和 PC13 至 PC15 端口供电,可以保证当主电源被切断时 RTC 能继续工作。切换到 VBAT 供电的开关,由复位模块中的掉电复位功能控制。
警告:在 VDD 上升阶段(tRSTTEMPO)或者探测到 PDR(掉电复位)之后,VBAT 和 VDD 之间的电源开关仍会保持连接在 VBAT。
在 VDD 上升阶段,如果 VDD 在小于 tRSTTEMPO 的时间内达到稳定状态(关于 tRSTTEMPO 数值可参考数据手册中的相关部分),且 VDD>VBAT+0.6V 时,电流可能通过 VDD 和 VBAT 之间的内部二极管注入到 VBAT。
如果与 VBAT 连接的电源或者电池不能承受这样的注入电流,强烈建议在外部 VBAT 和电源之间连接一个低压降二极管。如果在应用中没有外部电池,建议 VBAT 在外部连接到 VDD 并连接一个 100nF 的陶瓷滤波电容。
当备份区域由 VDD(内部模拟开关连到 VDD)供电时,下述功能可用:
- PC14 和 PC15 可以用于 GPIO 或 LSE 引脚
- PC13 可以作为通用 I/O 口、TAMPER 引脚、RTC 校准时钟、RTC 闹钟或秒输出
注: 因为模拟开关只能通过少量的电流(3mA),在输出模式下使用 PC13 至 PC15 的 I/O 口功能是有限制的:速度必须限制在 2MHz 以下,最大负载为 30pF,而且这些 I/O 口绝对不能当作电流源(如驱动 LED)。
当后备区域由 VBAT 供电时(VDD 消失后模拟开关连到 VBAT),可以使用下述功能:
- PC14 和 PC15 只能用于 LSE 引脚
- PC13 可以作为 TAMPER 引脚、RTC 闹钟或秒输出
1.3 电压调节器
复位后调节器总是使能的。根据应用方式它以 3 种不同的模式工作。
- 运转模式:调节器以正常功耗模式提供 1.8V 电源(内核,内存和外设)。
- 停止模式:调节器以低功耗模式提供 1.8V 电源,以保存寄存器和 SRAM 的内容。
- 待机模式:调节器停止供电。除了备用电路和备份域外,寄存器和 SRAM 的内容全部丢失。
2 电源管理器
2.1 上电复位(POR)和掉电复位(PDR)
W55MH32 内部有一个完整的上电复位(POR)和掉电复位(PDR)电路,当供电电压达到 2V 时系统既能正常工作。
当VDD/VDDA低于指定的限位电压VPOR/VPDR时,系统保持为复位状态,而无需外部复位电路。关于上电复位和掉电复位的细节请参考数据手册的电气特性部分。
上电复位和掉电复位的波形图
2.2 可编程电压监测器(PVD)
用户可以利用 PVD对 VDD电压与电源控制寄存器(PWR_CR)中的 PLS[2:0]位进行比较来监控电源,这几位选择监控电压的阀值。通过设置 PVDE 位来使能 PVD。
电源控制/状态寄存器(PWR_CSR)中的 PVDO 标志用来表明 VDD 是高于还是低于 PVD 的电压阀值。该事件在内部连接到外部中断的第 16 线,如果该中断在外部中断寄存器中是使能的,该事件就会产生中断。当 VDD 下降到 PVD 阀值以下和(或)当 VDD 上升到 PVD 阀值之上时,根据外部中断第16 线的上升/下降边沿触发设置,就会产生 PVD 中断。例如,这一特性可用于用于执行紧急关闭任务。
PVD的门限
3 低功耗模式
在系统或电源复位以后,微控制器处于运行状态。当 CPU 不需继续运行时,可以利用多种低功耗模式来节省功耗,例如等待某个外部事件时。用户需要根据最低电源消耗、最快速启动时间和可用的唤醒源等条件,选定一个最佳的低功耗模式。
三种低功耗模式:
- 睡眠模式(Cortex™-M3 内核停止,所有外设包括 Cortex-M3 核心的外设,如 NVIC、系统时钟(SysTick)等仍在运行)
- 停止模式(所有的时钟都已停止)
- 待机模式(1.8V 电源关闭)
此外,在运行模式下,可以通过以下方式中的一种降低功耗:
- 降低系统时钟
- 关闭 APB 和 AHB 总线上未被使用的外设时钟。
低功耗模式一览
模式 | 进入 | 唤醒 | 对 1.8V 区域时钟的影响 | 对 V<sub>DD</sub>区域时钟的影响 | 电压调节器 |
睡眠 (SLEEP - NOW 或 SLEEP - ON - EXIT) | WFI WFE | 任一中断 唤醒事件 | CPU 时钟关,对其他时钟和 ADC 时钟无影响 | 无 | 开 |
停机 | PDDS 和 LPDS 位 + SLEEPDEEP 位 + WFI 或 WFE | 任一外部中断 (在外部中断寄存器中设置) | 关闭所有 1.8V 区域的时钟 | HSI 和 HSE 的振荡器关闭 | 开启或处于低功耗模式 (依据电源控制寄存器 (PWR_CR) 的设定) |
待机 | PDDS 位 + SLEEPDEEP 位 + WFI 或 WFE | WKUP 引脚上的上升沿、RTC 闹钟事件、NRST 引脚上的外部复位、IWDG 复位 | - | - | 关 |
3.1 降低系统时钟
在运行模式下,通过对预分频寄存器进行编程,可以降低任意一个系统时钟(SYSCLK、HCLK、PCLK1、PCLK2)的速度。进入睡眠模式前,也可以利用预分频器来降低外设的时钟。
3.2 外部时钟的控制
在运行模式下,任何时候都可以通过停止为外设和内存提供时钟(HCLK 和 PCLKx)来减少功耗。为了在睡眠模式下更多地减少功耗,可在执行 WFI 或 WFE 指令前关闭所有外设的时钟。
通过设置 AHB 外设时钟使能寄存器(RCC_AHBENR)、APB2 外设时钟使能寄存器(RCC_APB2ENR)和APB1 外设时钟使能寄存器(RCC_APB1ENR)来开关各个外设模块的时钟。
3.3 睡眠模式
进入睡眠模式通过执行 WFI 或 WFE 指令进入睡眠状态。根据 Cortex™-M3 系统控制寄存器中的 SLEEPONEXIT 位的值,有两种选项可用于选择睡眠模式进入机制:
- SLEEP-NOW:如果 SLEEPONEXIT 位被清除,当 WRI 或 WFE 被执行时,微控制器立即进入睡眠模式。
- SLEEP-ON-EXIT:如果 SLEEPONEXIT 位被置位,系统从最低优先级的中断处理程序中退出时,微控制器就立即进入睡眠模式。
在睡眠模式下,所有的 I/O 引脚都保持它们在运行模式时的状态。
退出睡眠模式如果执行 WFI 指令进入睡眠模式,任意一个被嵌套向量中断控制器响应的外设中断都能将系统从睡眠模式唤醒。如果执行 WFE 指令进入睡眠模式,则一旦发生唤醒事件时,微处理器都将从睡眠模式退出。唤醒事件可以通过下述方式产生:
- 在外设控制寄存器中使能一个中断,而不是在 NVIC(嵌套向量中断控制器)中使能,并且在Cortex-M3 系统控制寄存器中使能 SEVONPEND 位。当 MCU 从 WFE 中唤醒后,外设的中断挂起位和外设的 NVIC 中断通道挂起位(在 NVIC 中断清除挂起寄存器中)必须被清除。
配置一个外部或内部的 EXIT 线为事件模式。当 MCU 从 WFE 中唤醒后,因为与事件线对应的挂起位未被设置,不必清除外设的中断挂起位或外设的 NVIC 中断通道挂起位。该模式唤醒所需的时间最短,因为没有时间损失在中断的进入或退出上。
SLEEP-NOW 模式
SLEEP-NOW 模式 | 说明 |
进入 | 在以下条件下执行 WFI (等待中断) 或 WFE (等待事件) 指令: - SLEEPDEEP=0 和 - SLEEPONEXIT=0 参考 Cortex-M3 系统控制寄存器。 |
退出 | 如果执行 WFI 进入睡眠模式: 中断:参考中断向量表 (表 51) 如果执行 WFE 进入睡眠模式: 唤醒事件:参考唤醒事件管理 (第 8.2.3 节) |
SLEEP-ON-EXIT 模式
SLEEP-ON_EXIT 模式 | 说明 |
进入 | 在以下条件下执行 WFI 指令: - SLEEPDEEP=0 和 - SLEEPONEXIT=1 参考 Cortex™-M3 系统控制寄存器 |
退出 | 中断:参考中断向量表 (表 51) |
唤醒延时 | 无 |
3.4 停止模式
停止模式是在 Cortex™-M3 的深睡眠模式基础上结合了外设的时钟控制机制,在停止模式下电压调节器可运行在正常或低功耗模式。此时在 1.8V 供电区域的的所有时钟都被停止,PLL、HSI 和HSERC 振荡器的功能被禁止,SRAM 和寄存器内容被保留下来。
在停止模式下,所有的 I/O 引脚都保持它们在运行模式时的状态。
进入停止模式
在停止模式下,通过设置电源控制寄存器(PWR_CR)的 LPDS 位使内部调节器进入低功耗模式,能够降低更多的功耗。如果正在进行闪存编程,直到对内存访问完成,系统才进入停止模式。如果正在进行对 APB 的访问,直到对 APB 访问完成,系统才进入停止模式。可以通过对独立的控制位进行编程,可选择以下功能:
- 独立看门狗(IWDG):可通过写入看门狗的键寄存器或硬件选择来启动 IWDG。一旦启动了独立看门狗,除了系统复位,它不能再被停止。
- 实时时钟(RTC):通过备份域控制寄存器(RCC_BDCR)的 RTCEN 位来设置。
- 内部 RC 振荡器(LSIRC):通过控制/状态寄存器(RCC_CSR)的 LSION 位来设置。
- 外部 32.768kHz 振荡器(LSE):通过备份域控制寄存器(RCC_BDCR)的 LSEON 位设置。
在停止模式下,如果在进入该模式前 ADC 和 DAC 没有被关闭,那么这些外设仍然消耗电流。通过设置寄存器 ADC_CR2 的 ADON 位和寄存器 DAC_CR 的 ENx 位为 0 可关闭这 2 个外设。
退出停止模式
关于如何退出停止模式,详见下表。
当一个中断或唤醒事件导致退出停止模式时,HSIRC 振荡器被选为系统时钟。
当电压调节器处于低功耗模式下,当系统从停止模式退出时,将会有一段额外的启动延时。如果在停止模式期间保持内部调节器开启,则退出启动时间会缩短,但相应的功耗会增加。
停止模式
停止模式 | 说明 |
进入 | 在以下条件下执行 WFI (等待中断) 或 WFE (等待事件) 指令: - 设置 Cortex-M3 系统控制寄存器中的 SLEEPDEEP 位 - 不清除电源控制寄存器 (PWR_CR) 中的 PDDS 位 - 通过设置 PWR_CR 中 LPDS 位选择电压调节器的模式 注:为了进入停止模式,所有的外部中断的请求位 (挂起寄存器 (EXTI_PR)) 和 RTC 的闹钟标志都必须被清除,否则停止模式的进入流程将会被跳过,程序继续运行。 |
退出 | 如果执行 WFI 进入停止模式: 设置任一外部中断线为中断模式 (在 NVIC 中必须使能相应的外部中断向量)。参见中断向量表 (表 51)。 如果执行 WFE 进入停止模式: 设置任一外部中断线为事件模式。参见唤醒事件管理 (第 8.2.3 节)。 |
唤醒延时 | HSIRC 唤醒时间 + 电压调节器从低功耗唤醒的时间。 |
3.5 待机模式
待机模式可实现系统的最低功耗。该模式是在 Cortex-M3 深睡眠模式时关闭电压调节器。整个1.8V 供电区域被断电。PLL、HSI 和 HSE 振荡器也被断电。SRAM 和寄存器内容丢失。只有备份的寄存器和待机电路维持供电。
进入待机模式
可以通过设置独立的控制位,选择以下待机模式的功能:
- 独立看门狗(IWDG):可通过写入看门狗的键寄存器或硬件选择来启动 IWDG。一旦启动了独立看门狗,除了系统复位,它不能再被停止。
- 实时时钟(RTC):通过备用区域控制寄存器(RCC_BDCR)的 RTCEN 位来设置。
- 内部 RC 振荡器(LSIRC):通过控制/状态寄存器(RCC_CSR)的 LSION 位来设置。
- 外部 32.768kHz 振荡器(LSE):通过备用区域控制寄存器(RCC_BDCR)的 LSEON 位设置。
退出待机模式
当一个外部复位(NRST 引脚)、IWDG 复位、WKUP 引脚上的上升沿或 RTC 闹钟事件的上升沿发生时,微控制器从待机模式退出。从待机唤醒后,除了电源控制/状态寄存器(PWR_CSR),所有寄存器被复位。从待机模式唤醒后的代码执行等同于复位后的执行(采样启动模式引脚、读取复位向量等)。电源控制/状态寄存器(PWR_CSR)(见第 4.4.2 节)将会指示内核由待机状态退出。
关于如何退出待机模式,详见下表:
待机模式
待机模式 | 说明 |
进入 | 在以下条件下执行 WFI (等待中断) 或 WFE (等待事件) 指令: - 设置 Cortex™-M3 系统控制寄存器中的 SLEEPDEEP 位 - 设置电源控制寄存器 (PWR_CR) 中的 PDDS 位 - 清除电源控制 / 状态寄存器 (PWR_CSR) 中的 WUF 位 |
退出 | WKUP 引脚的上升沿、RTC 闹钟事件的上升沿、NRST 引脚上外部复位、IWDG 复位。 |
唤醒延时 | 复位阶段时电压调节器的启动。 |
待机模式下的输入/输出端口状态
在待机模式下,所有的 I/O 引脚处于高阻态,除了以下的引脚:
- 复位引脚(始终有效)
- 当被设置为防侵入或校准输出时的 TAMPER 引脚
- 被使能的唤醒引脚
调试模式
默认情况下,如果在进行调试微处理器时,使微处理器进入停止或待机模式,将失去调试连接。这是因为 Cortex™-M3 的内核失去了时钟。然而,通过设置 DBGMCU_CR 寄存器中的某些配置位,可以在使用低功耗模式下调试软件。
3.6 低功耗模式下的自动唤醒(AWU)
RTC可以在不需要依赖外部中断的情况下唤醒低功耗模式下的微控制器(自动唤醒模式)。RTC提供一个可编程的时间基数,用于周期性从停止或待机模式下唤醒。通过对备份区域控制寄存器(RCC_BDCR)的RTCSEL[1:0]位的编程,三个 RTC 时钟源中的二个时钟源可以选作实现此功能。
- 低功耗 32.768kHz 外部晶振(LSE)该时钟源提供了一个低功耗且精确的时间基准。(在典型情形下消耗小于 1µA)
- 低功耗内部 RC 振荡器(LSIRC)
使用该时钟源,节省了一个 32.768kHz 晶振的成本。但是 RC 振荡器将少许增加电源消耗。为了用 RTC 闹钟事件将系统从停止模式下唤醒,必须进行如下操作:
- 配置外部中断线 17 为上升沿触发。
- 配置 RTC 使其可产生 RTC 闹钟事件。
如果要从待机模式中唤醒,不必配置外部中断线 17。
4 例程设计
4.1 PWR_Standby
1. 初始化阶段
(1)使能电源和备份域时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);
开启电源控制(PWR)和备份域(BKP)的时钟,为后续的电源管理操作做准备。
(2)延时函数和串口初始化
delay_init();
UART_Configuration(115200);
- delay_init():初始化延时函数,方便后续使用延时操作。
- UART_Configuration(115200):配置串口 1,波特率为 115200,用于后续的信息输出和命令接收。
(3)获取并打印时钟信息
RCC_GetClocksFreq(&clocks);
printf("\n");
printf("SYSCLK: %3.1fMhz, HCLK: %3.1fMhz, PCLK1: %3.1fMhz, PCLK2: %3.1fMhz, ADCCLK: %3.1fMhz\n",
(float)clocks.SYSCLK_Frequency / 1000000, (float)clocks.HCLK_Frequency / 1000000,
(float)clocks.PCLK1_Frequency / 1000000, (float)clocks.PCLK2_Frequency / 1000000, (float)clocks.ADCCLK_Frequency / 1000000);
获取系统各时钟频率,并通过串口打印出来,方便调试和查看系统时钟配置情况。
(4)打印提示信息并使能唤醒引脚
printf("PWR Standby Test.\n");
printf("Enable WakeUp Pin - PA0\n");
printf("Please Input 's', Come Standby Mode\n");
PWR_WakeUpPinCmd(ENABLE);
- 打印测试信息和提示用户输入's' 以进入待机模式。
- 使能唤醒引脚 PA0,用于后续从待机模式唤醒系统。
2. 等待用户输入
while (GetCmd() != 's');
通过GetCmd()函数不断检查串口接收的数据,当接收到字符's' 时,跳出循环,准备进入待机模式。
3. GPIO 配置
GPIO_Configuration();
对所有 GPIO 端口(GPIOA - GPIOG)进行配置,将所有引脚设置为模拟输入模式,以降低功耗。
4. 进入待机模式
PWR_EnterSTANDBYMode();
调用该函数使系统进入待机模式,此时系统大部分功能停止工作,功耗极低。综上所述,该程序的主要流程是初始化系统,提示用户输入's',接收到指定字符后配GPIO,然后使系统进入待机模式,等待唤醒信号。
4.2 PWR_Stop
该程序是一个基于 W55MH32 的低功耗停止模式(STOP Mode)测试程序,主要用于验证系统进入停止模式以及通过外部中断唤醒的功能。以下是程序的主要工作流程总结:
1. 初始化阶段
(1)使能电源和备份域时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);
开启电源控制(PWR)和备份域(BKP)的时钟,为后续的电源管理操作做准备。
(2)延时函数和串口初始化
delay_init();
UART_Configuration(115200);
- delay_init():初始化延时函数。
- UART_Configuration(115200):配置串口 1,波特率为 115200,用于调试信息输出和命令接收。
(3)获取并打印时钟信息
RCC_GetClocksFreq(&clocks);
printf("SYSCLK: %3.1fMhz, HCLK: %3.1fMhz, PCLK1: %3.1fMhz, PCLK2: %3.1fMhz, ADCCLK: %3.1fMhz\n", ...);
获取并打印系统各总线时钟频率,便于调试。
(4)打印提示信息并配置唤醒引脚
printf("PWR Stop Test.\n");
printf("Enable WakeUp Pin - PA0\n");
printf("Please Input 's', Come Stop Mode\n");
WAKEUP_Configuration();
- 提示用户输入字符 's' 触发进入停止模式。
- 调用 WAKEUP_Configuration() 配置唤醒引脚 PA0 为外部中断触发(上升沿)。
2. 等待用户输入
while (GetCmd() != 's');
通过 GetCmd() 函数持续检测串口输入,直到接收到字符 's'。
3. GPIO 配置
GPIO_Configuration();
- 将所有 GPIO 引脚(除 PA0 外)设置为模拟输入模式(GPIO_Mode_AIN),以降低功耗。
- PA0 保持上拉输入,用于唤醒中断。
4. 进入停止模式
PWR_EnterSTOPMode(PWR_Regulator_LowPower, PWR_STOPEntry_WFI);
- 选择低功耗调节器(PWR_Regulator_LowPower)以进一步降低功耗。
- 通过 **WFI(Wait For Interrupt)** 指令进入停止模式。
5. 唤醒后处理
(1)系统复位与重新初始化
SystemInit(); // 复位系统时钟到默认配置
UART_Configuration(115200); // 重新初始化串口
printf("WakeUp Success\n");
- 唤醒后,系统从复位向量启动,需重新初始化串口才能继续输出。
(2)无限循环
while (1);
程序保持运行状态,等待其他操作。
6. 唤醒中断处理(EXTI0_IRQHandler)
- 当 PA0 检测到上升沿时触发中断。
- 清除中断标志位并打印调试信息(示例中仅打印EXTI->PR寄存器值)。