STM32 PWR电源控制

STM32 PWR电源控制

PWR简介

  • PWR(Power Control)电源控制

  • PWR负责管理STM32内部的电源供电部分,可以实现可编程电压监测器和低功耗模式的功能

  • 可编程电压监测器(PVD)可以监控VDD电源电压,当VDD下降到PVD阀值以下或上升到PVD阀值之上时,PVD会触发中断,用于执行紧急关闭任务

    • 这个功能预想的场景应该是,使用电池供电,或者对安全要求比较高的设备,如果供电电压在逐渐下降,在电压过低的情况下,可能会导致内部或者外部电路发生不确定的错误,为了避免不确定的因素,在电源电压低于设定的阈值时,我们可以主动出击,提前发出警告,并且关闭比较危险的设备。
  • 低功耗模式包括睡眠模式(Sleep)、停机模式(Stop)和待机模式(Standby),可在系统空闲时,降低STM32的功耗,延长设备使用时间

    • 尤其是像一些电池供电的设备,对空闲时候的耗电量是有极大要求的,比如数据采集设备、车钥匙、遥控器、报警器等等,这些产品都有一个特点,就是在它们的生命周期里,绝大部分时间,都是空闲状态,但是我们知道,单片机程序一旦开始,正常运行的状态下,程序永远都不会停下来,所以主程序的最后,一般都是个死循环,即使需要空闲,让程序停下来,也得来个空循环让程序一直转圈卡住。但是,程序运行就会耗电,空循环的耗电量也是很大的。比如遥控器,如果不用它的时候,程序一直空循环,那么用不到几天,电池就没电了。所以说,对于这些设备,我们需要这样的低功耗模式,在空闲状态时,关闭不必要的硬件,比如直接把CPU断电,或者关闭时钟,这样程序自然就不会运行了。
    • 但是在低功耗模式下,我们也需要保留必要的唤醒电路,比如串口接收数据的中断唤醒、外部中断唤醒,RTC闹钟唤醒等等,在需要设备工作时,STM32能够立刻重新投入工作,这样才行。如果只考虑进入低功耗而不考虑唤醒,STM32相当于直接断电。
    • 所以低功耗模式,我们要考虑关闭哪些硬件,保留哪些硬件,以及如何去唤醒,当然,关闭越多的硬件,设备越省电,唤醒就越麻烦。

电源框图

在这里插入图片描述

  • 模拟部分供电,VDDA(VDD Analog)
    • 主要负责模拟部分的供电,其中包括AD转换器、温度传感器、复位模块、PLL锁相环,这些电路的供电正极是VDDA,负极是VSSA。
      • 其中AD转换器,还有两根参考电压的供电脚,VREF+和VREF-。这两个引脚在引脚多的型号里会单独引出来,在引脚少的型号,比如STM32F103C8T6,VREF+和VREF-在内部就已经分别接到了VDDA和VSSA。
  • 数字部分供电
    • VDD供电区域 包括IO电路、待机电路(唤醒逻辑,IWDG独立看门狗)电压调节器(VDD通过电压调节器,降压到1.8V,提供给1.8V供电区域)
    • 1.8V供电区域 包括CPU核心、存储器和内置数字外设
  • STM32内部的大部分关键电路,CPU、存储器和外设,其实都是以1.8V的低电压运行的,当这些外设需要与外界进行交流时,才会IO电路转换到3.3V,所以我们从外部看好像STM32内部全是3.3V。但实际上,它内部的CPU、外设等,都是1.8V供电运行。使用低电压运行的主要目的是降低功耗。电压越低,内部电路运行的功耗就相对越低。
    • CPU核心、存储器和数字外设,都属于1.8V供电区域,而待机电路、唤醒逻辑等,属于VDD供电区域。
    • 电压调节器,作用是给1.8V区域供电。
  • 后备供电,VBAT(V Battery)
    • 包括LSE 32K晶体震荡器、后备寄存器、RCC BDCR寄存器和RTC
      • RCC BDCR是RCC的寄存器,叫备份域控制寄存器,也是和后备区域有关的寄存器,所以也可以由VBAT供电。
  • 低电压检测器 可以控制VBAT到后备供电区域的开关,VDD有电时,由VDD供电,VDD没电时,由VBAT供电。

上电复位和掉电复位

在这里插入图片描述

  • 当VDD或者VDDA电压过低时,内部电路直接产生复位,让STM32复位住,不要乱操作。
    • 这个复位和不复位的界限之间,设置了一个40mv的迟滞电压,大于上限POR(Power On Reset)时解除复位,小于下限PDR(Power Down Reset)时复位。设置两个阈值的作用,就是防止电压在某个阈值附近波动时,造成输出也来回抖动。
  • 复位信号Reset,低电平有效,电压过低时复位,电压正常时,不复位。

可编程电压监测器

在这里插入图片描述

  • PVD阈值可以使用程序指定,可以自定义调节。
  • PVD的电压要高于上电掉电复位的电压,3.3V是正常的供电,当电压降低,在2.9V~2.2V之间,属于PVD监测的范围,可以通过PVD设置一个警告线,之后再降低,到1.9V,就是复位电路的检测范围,低于1.9V,直接复位住,不让动了。
  • PVD触发之后,芯片还是可以正常工作的,只不过是电源电压过低,该提醒一下用户了。PVD输出,高电平有效,电压过低时为1,电压正常时为0。这个信号可以去申请中断,在上升沿或者下降沿时,触发中断,依次提醒程序进行适当的处理。PVD的中断申请是通过外部中断实现的。

在这里插入图片描述

低功耗模式

  • 关闭电路通常有两个做法,一个是关闭时钟,另一个是关闭电源。关闭电源比关闭时钟更省电。
    • 关闭时钟,所有的运算和涉及时序的操作都会暂停,但是寄存器和存储器里面保存的数据还可以维持,不会消失。
    • 关闭电源,就是电路直接断电,电路的操作和数据都会直接丢失。
  • 表中对1.8V区域时钟的影响和对VDD区域时钟的影响就是对1.8V区域和VDD区域的时钟控制
  • 电压调节器,实际上就是1.8V区域的电源,如果电压调节器关,就代表直接把1.8V区域断电

在这里插入图片描述

  • 睡眠模式(一般省电),浅睡眠,相当于打了个盹,直接调用WFI或者WFE即可进入。

    • 相同点 调用任意一个之后,芯片都进入睡眠
    • 不同点 WFI进入的得用中断唤醒,WFE进入的得用事件唤醒
    • WFI和WFE是内核的指令,对应库函数中,有对应的函数,直接调用函数即可。
      • WFI(Wait For Interrupt)等待中断,对应的唤醒条件是任一中断。调用WFI进入的睡眠模式,任何外设发生任何中断时,芯片都会立刻醒来,由于中断发生了,所以醒来后第一件事,一般就是处理中断函数。
      • WFE (Wait For Event) 等待事件,对应的唤醒条件是唤醒事件。这个事件可以是外部中断配置为事件模式,也可以是使能了中断,但是没有配置NVIC。调用WFE进入的睡眠模式,产生唤醒事件时,会立刻醒来。醒来之后,一般不需要进中断函数。直接从睡眠的地方继续运行。
    • 睡眠模式对电路的影响 睡眠模式只把CPU时钟关了,对其他电路没有任何操作。CPU时钟关了,程序就会暂停,不会继续运行了。CPU不运行,芯片功耗就会降低。
      • 对1.8V区域时钟的影响 CPU时钟关,对其他时钟和ADC时钟无影响。
      • 对VDD区域时钟的影响 无
      • 对电压调节器的操作 开

PDDS位用来区分是停机模式还是待机模式

  • PDDS=0 进入停机模式
  • PDDS=1 进入待机模式

LPDS位用来设置电压调节器

  • LPDS=0,电压调节器开启
  • LPDS=1,电压调节器进入低功耗
  • 停机模式(非常省电) 不区分WFI和WFE 把运行的高速时钟关闭,CPU和外设都暂停工作,但是电压调节器并没有关,存储器和寄存器数据可以维持原样。唤醒条件较为苛刻,只能通过外部中断唤醒。
    • 进入停机模式 SLEEPDEEP位置1(进入深度睡眠模式),PDDS位置0(进入停机模式),最后调用WFI或者WFE
    • 停机模式的唤醒 任一外部中断
    • 停机模式对电路的影响
      • 关闭所有1.8V区域的时钟,不仅CPU不能运行,外设也无法运行。定时器,正在定时的,会暂停;串口,收发数据,也会暂停。不过由于没关闭电源,所以CPU和外设的寄存器数据都是维持原状的。
      • HSI和HSE的振荡器关闭,既然CPU和外设时钟都关闭了,那么这两个高速时钟本身也失去了存在的意义,所以HSI内部高速时钟和HSE外部高速时钟会关闭。LSI内部低速时钟和LSE外部低俗时钟,这两个并不会主动关闭,如果开启过这两个时钟,还可以继续运行。
      • 开启或处于低功耗模式,电压调节器是由LPDS位控制的,电压调节器无论是开启还是低功耗,都可以维持1.8V区域寄存器和存储器的数据内容,区别就是,低功耗模式更省电一些,同时,低功耗模式在唤醒时,要花更多的时间,相反,电压调节器开启的话,就是更耗电一些,唤醒更快了。
  • 待机模式(极为省电) 将能关闭的全部关闭,只保留几个唤醒的功能,
    • 进入待机模式 SLEEPDEEP位置1(进入深度睡眠模式),PDDS位置1(进入待机模式),最后调用WFI或者WFE
    • 待机模式的唤醒 只有指定4个信号可以唤醒
      • WKUP引脚的上升沿(PA0)
      • RTC闹钟事件 可以唤醒待机模式,应用场景就是,芯片每隔一段时间自动工作一次
      • NRST引脚上的外部复位 按一下复位键,也可以唤醒
      • IWDG复位 独立看门狗复位
    • 停机模式对电路的影响
      • 关闭所有1.8V区域的时钟
      • HSI和HSE的振荡器关闭,并不会主动关闭LSI和LSE两个低速时钟,因为这两个时钟还要维持RTC和独立看门狗的运行。
      • 电压调节器关闭,意味着1.8V区域的电源关闭,内部的存储器和寄存器的数据全部丢失

模式选择

  • 执行WFI(Wait For Interrupt)或者WFE(Wait For Event)指令后,STM32进入低功耗模式

在这里插入图片描述

  • SLEEPDEEP=0 睡眠模式(浅睡眠)
    • SLEEPONEXIT=0 调用WFI/WFE,立刻进入睡眠模式。
    • SLEEPONEXIT=1 调用WFI/WFE之后,会等待中断退出,等所有中断处理完成之后,再进入睡眠。
    • 这两种细分模式,一般可以不用管,只要不在中断函数里调用WFI/WFE,他们的效果相同。可以把WFI/WFE放在主程序中。如果想在中断函数里调用WFI/WFE,并且想中断结束后再睡眠,才需要考虑下面这个模式。
  • SLEEPDEEP=1 深度睡眠模式
    • PDDS=0 进入停机模式
      • LPDS=0 停机模式且开启电压调节器
      • LPDS=1 停机模式且电压调节器低功耗(更省电但是唤醒延迟更高)
    • PDDS=1 进入待机模式

睡眠模式

  • 执行完WFI/WFE指令后,STM32进入睡眠模式,程序暂停运行,唤醒后程序从暂停的地方继续运行。

    • 一般可以在主循环的最后,执行以下WFI/WFE,主循环执行一遍就睡眠,唤醒之后,主循环又执行一遍,再睡眠。每唤醒一次,主循环执行一遍。
  • SLEEPONEXIT位决定STM32执行完WFI或WFE后,是立刻进入睡眠,还是等STM32从最低优先级的中断处理程序中退出时进入睡眠。

  • 在睡眠模式下,所有的I/O引脚都保持它们在运行模式时的状态。

    • 比如,如果在程序里进行电灯,灯点亮了,再进入睡眠,等仍然是亮的,GPIO引脚的高低电平在睡眠时是维持原样的。
  • WFI指令进入睡眠模式,可被任意一个NVIC响应的中断唤醒。

  • WFE指令进入睡眠模式,可被唤醒事件唤醒。

停止模式

  • 执行完WFI/WFE指令后,STM32进入停止模式,程序暂停运行,唤醒后程序从暂停的地方继续运行

  • 1.8V供电区域的所有时钟都被停止,PLL、HSI和HSE被禁止,SRAM和寄存器内容被保留下来

  • 在停止模式下,所有的I/O引脚都保持它们在运行模式时的状态

  • 当一个中断或唤醒事件导致退出停止模式时,HSI被选为系统时钟

    • 我们的程序,默认在SystemInit函数里的配置,是使用的HSE外部高速时钟,通过PLL倍频,得到72MHz主频,但是进入停止模式后,PLL和HSE都停止了,而且在退出停止模式时,它并不会再自动帮我们开启PLL和HSE,而是默认用HSI的8MHz,直接作为主频。如果忽略这个问题,那么就会出现一个现象,程序刚上电,是72MHz的主频,但是进入停止模式,再唤醒之后,就变成8MHz的主频了。

    • 所以我们在停止模式唤醒后,第一时间就是重新启动HSE,配置主频为72MHz,这个操作也不麻烦,只需要再调用以下SystemInit即可。

  • 当电压调节器处于低功耗模式下,系统从停止模式退出时,会有一段额外的启动延时

  • WFI指令进入停止模式,可被任意一个EXTI中断唤醒

  • WFE指令进入停止模式,可被任意一个EXTI事件唤醒

待机模式

  • 执行完WFI/WFE指令后,STM32进入待机模式,唤醒后程序从头开始运行

  • 整个1.8V供电区域被断电,PLL、HSI和HSE也被断电,SRAM和寄存器内容丢失,只有备份的寄存器和待机电路维持供电

  • 在待机模式下,所有的I/O引脚变为高阻态(浮空输入)

    • 对于输出来说,既不输出高电平,也不输出低电平,呈现高阻态。

    • 对于输入来说,不上拉也不下拉,呈现浮空输入状态。

    • GPIO的配置中,没有高阻态这个配置,其实就是浮空输入配置,浮空输入对于输出而言,就是高阻态。

    • 所以说,如果提前点了个灯,进入待机模式后,无论这个灯是高电平点亮还是低电平点亮,都会熄灭,GPIO对外不输出高低电平,也不流过电流。

  • WKUP引脚的上升沿、RTC闹钟事件的上升沿、NRST引脚上外部复位、IWDG复位退出待机模式

  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

YRr YRr

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值