Power cfg①

文章目录[隐藏]

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

生成海报
点赞 0

到底是啥

我还没有学会写个人说明!

暂无评论

发表评论

相关推荐

RT-Thread Studio移植LAN8720A驱动

RTT网络协议栈驱动移植(霸天虎) 1、新建工程 ​ 工程路径不含中文路径名,工程名用纯英文不含任何符号。 2、用CubeMx配置板子外设 2.1、配置时钟 ​ 按照自己板子配置相应时钟。

ESP8266 无限重启踩坑

最近做了一个电子墨水屏万年历,在移植屏幕代码时遇到了esp8266无限软复位的问题,如果你的串口打印是以下图片所示,那么恭喜你问题解决了。 造成软复位的原因是因为,程序里有死循环&#xf

Lin总线通信在STM32作为主机代码以及从机程序

距离上次做资料准备已经过去六天了。最近在学车,上周末就没有开电脑。这周开始进行了Lin通信的代码整理,目前是可以正常通信的了,采用的是增强型校验方式。后期再进一步跟进研究。。。更新一博,留

4路红外循迹模块使用教程

4路红外循迹模块使用教程 个人原创博客:点击浏览模块详细信息: 工作电压:DC 3.3V~5V 工作电流:尽量选择1A以上电源供电 工作温度:-10℃~50℃ 安装孔