文章目录[隐藏]
Power cfg
一、电源监控器
STM32芯片主要通过引脚VDD从外部获取电源,在它的内部具有电源监控器用于检测VDD的电压,以实现复位功能及掉电紧急处理功能。
(1)上电复位和掉电复位(POR&PDR)
当检测到VDD的电压低于阈值VPOR及VPDR时,无需外部电路辅助,STM32芯片会自动保持在复位状态,防止因电压不足强行工作而带来严重的后果。 见图 POR与PDR ,在刚开始电压低于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)。 它可以编程控制电压检测工作在表 BOR欠压阈值等级 中的阈值级别,通过修改“选项字节”(某些特殊寄存器)中的BOR_LEV位即可控制阈值级别。 其复位控制示意图见图 BOR复位控制 。
(3)可编程电压检测器
上述POR、PDR以及BOR功能都是使用其电压阈值与外部供电电压VDD比较,当低于工作阈值时,会直接进入复位状态,这可防止电压不足导致的误操作。 除此之外,STM32还提供了可编程电压检测器PVD,它也是实时检测VDD的电压,当检测到电压低于VPVD阈值时, 会向内核产生一个PVD中断(EXTI16线中断)以使内核在复位前进行紧急处理。该电压阈值可通过电源控制寄存器PWR_CSR设置。
PVD配置8个等级:
上升沿和下降沿分别表示类似图 BOR复位控制 中VDD电压上升过程及下降过程的阈值。
二、Stm32的电源系统
STM32的电源系统主要分为备份域电路、内核电路以及ADC电路三部分,介绍如下:
(1)备份域电路
STM32的LSE振荡器、RTC、备份寄存器及备份SRAM这些器件被包含进备份域电路中,这部分的电路可以通过STM32的VBAT引脚获取供电电源, 在实际应用中一般会使用3V的钮扣电池对该引脚供电。
在图中备份域电路的左侧有一个电源开关结构,它的功能类似图 双二极管结构 中的双二极管,在它的上方连接了VBAT电源, 下方连接了VDD主电源(一般为3.3V),右侧引出到备份域电路中。当VDD主电源存在时,由于VDD电压较高,备份域电路通过VDD供电, 当VDD掉电时,备份域电路由钮扣电池通过VBAT供电,保证电路能持续运行,从而可利用它保留关键数据。
(2)调压器供电电路
在STM32的电源系统中调压器供电的电路是最主要的部分,调压器为备份域及待机电路以外的所有数字电路供电,其中包括内核、 数字外设以及RAM,调压器的输出电压约为1.2V,因而使用调压器供电的这些电路区域被称为1.2V域。
调压器可以运行在“运行模式”、“停止模式”以及“待机模式”。在运行模式下,1.2V域全功率运行;在停止模式下1.2V域运行在低功耗状态, 1.2V区域的所有时钟都被关闭,相应的外设都停止了工作,但它会保留内核寄存器以及SRAM的内容;在待机模式下,整个1.2V域都断电, 该区域的内核寄存器及SRAM内容都会丢失(备份区域的寄存器及SRAM不受影响)。
(3)ADC电源及参考电压
为了提高转换精度,STM32的ADC配有独立的电源接口,方便进行单独的滤波。ADC的工作电源使用VDDA引脚输入, 使用VSSA作为独立的地连接,VREF引脚则为ADC提供测量使用的参考电压。
功耗模式如下:
这三种低功耗模式层层递进,运行的时钟或芯片功能越来越少,因而功耗越来越低。
(1)睡眠 模式
在睡眠模式中,仅关闭了内核时钟,内核停止运行,但其片上外设,CM4核心的外设全都还照常运行。有两种方式进入睡眠模式, 它的进入方式决定了从睡眠唤醒的方式,分别是WFI(wait for interrupt)和WFE(wait forevent), 即由等待“中断”唤醒和由“事件”唤醒。
(2)停止模式
在停止模式中,进一步关闭了其它所有的时钟,于是所有的外设都停止了工作,但由于其1.2V区域的部分电源没有关闭,还保留了内核的寄存器、 内存的信息,所以从停止模式唤醒,并重新开启时钟后,还可以从上次停止处继续执行代码。停止模式可以由任意一个外部中断(EXTI)唤醒。 在停止模式中可以选择电压调节器为开模式或低功耗模式,可选择内部FLASH工作在正常模式或掉电模式。
(3)待机模式
待机模式,它除了关闭所有的时钟,还把1.2V区域的电源也完全关闭了,也就是说,从待机模式唤醒后, 由于没有之前代码的运行记录,只能对芯片复位,重新检测boot条件,从头开始执行程序。它有四种唤醒方式, 分别是WKUP(PA0)引脚的上升沿,RTC闹钟事件,NRST引脚的复位和IWDG(独立看门狗)复位。
在以的睡眠模式、停止模式及待机模式中,若备份域电源正常供电,备份域内的RTC都可以正常运行、备份域内的寄存器及备份域内的SRAM数据会被保存,不受功耗模式影响。
进入各种低功耗模式时都需要调用WFI或WFE命令,它们实质上都是内核指令,在库文件core_cmInstr.h中把这些指令封装成了函数,具体如下:
电源管理-1 WFI与WFE的指令定义(core_cmInstr.h文件)
/** \brief Wait For Interrupt
Wait For Interrupt is a hint instruction that suspends execution
until one of a number of events occurs.
*/
#define __WFI __wfi
/** \brief Wait For Event
Wait For Event is a hint instruction that permits the processor to enter
a low-power state until one of a number of events occurs.
*/
#define __WFE __wfe
对于这两个指令,我们应用时一般只需要知道,调用它们都能进入低功耗模式,需要使用函数的格式“__WFI();”和“__WFE();”来调用(因为__wfi及__wfe是编译器内置的函数,
函数内部使用调用了相应的汇编指令)。其中WFI指令决定了它需要用中断唤醒,而WFE则决定了它可用事件来唤醒,关于它们更详细的区别可查阅《cortex-CM3/CM4权威指南》了解。
直接调用WFI和WFE指令可以进入睡眠模式,而进入停止模式则还需要在调用指令前设置一些寄存器位, STM32标准库把这部分的操作封装到PWR_EnterSTOPMode函数中,具体如下
/**
* @brief 进入停止模式
*
* @note 在停止模式下所有I/O的会保持在停止前的状态
* @note 从停止模式唤醒后,会使用HSI作为时钟源
* @note 调压器若工作在低功耗模式,可减少功耗,但唤醒时会增加延迟
* @param PWR_Regulator: 设置停止模式时调压器的工作模式
* @arg PWR_MainRegulator_ON: 调压器正常运行
* @arg PWR_LowPowerRegulator_ON: 调压器低功耗运行
* @param PWR_STOPEntry: 设置使用WFI还是WFE进入停止模式
* @arg PWR_STOPEntry_WFI: WFI进入停止模式
* @arg PWR_STOPEntry_WFE: WFE进入停止模式
* @retval None
*/
void PWR_EnterSTOPMode(uint32_t PWR_Regulator, uint8_t PWR_STOPEntry)
{
uint32_t tmpreg = 0;
/* 设置调压器的模式 ------------*/
tmpreg = PWR->CR;
/* 清除 PDDS 及 LPDS 位 */
tmpreg &= CR_DS_MASK;
/* 根据PWR_Regulator 的值(调压器工作模式)配置LPDS,MRLVDS及LPLVDS位 */
tmpreg |= PWR_Regulator;
/* 写入参数值到寄存器 */
PWR->CR = tmpreg;
/* 设置内核寄存器的SLEEPDEEP位 */
SCB->SCR |= SCB_SCR_SLEEPDEEP_Msk;
/* 设置进入停止模式的方式-----------------*/
if (PWR_STOPEntry == PWR_STOPEntry_WFI) {
/* 需要中断唤醒*/
__WFI();
} else {
/* 需要事件唤醒 */
__WFE();
}
/* 以下的程序是当重新唤醒时才执行的,清除SLEEPDEEP位的状态*/
SCB->SCR &= (uint32_t)~((uint32_t)SCB_SCR_SLEEPDEEP_Msk);
}
这个函数有两个输入参数,分别用于控制调压器的模式及选择使用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寄存器位操作的语句,见下方代码,这个函数需要在进入停止模式前被调用,即应用时需要把它放在上面的PWR_EnterSTOPMode之前。
/**
* @brief 设置内部FLASH在停止模式时是否工作在掉电状态
* 掉电状态可使功耗更低,但唤醒时会增加延迟
* @param NewState:
ENABLE:FLASH掉电
DISABLE:FLASH正常运行
* @retval None
*/
void PWR_FlashPowerDownCmd(FunctionalState NewState)
{
/*配置FPDS寄存器位*/
*(__IO uint32_t *) CR_FPDS_BB = (uint32_t)NewState;
}
版权声明:本文为CSDN博主「到底是啥」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/Kudo_chitose/article/details/121732541
暂无评论