自学内容网 自学内容网

STM32—PWR电源控制

1.PWR简介

  • PWR(Power Control)电源控制
  • PWR负责管理STM32内部的电源供电部分,可以实现可编程电压监测器和低功耗模式的功能
  • 可编程电压监测器(PVD)可以监控VDD电源电压,当VDD下降到PVD阀值以下或上升到PVD阀值之上时,PVD会触发中断,用于执行紧急关闭任务
    • 使用场景:使用电池供电,或者对安全要求比较高的设备,如果供电电压在逐渐下降,在电压过低的情况下可能会导致内部或者外部电路发生不确定的错误,为了避免不确定的因素,在电源电压低于设定的阈值时,提前发出警告,并且关团比较危险的设备
  • 低功耗模式包括睡眠模式(Sleep)、停机模式(Stop)和待机模式(Standby),可在系统空闲时,降低STM32的功耗,延长设备使用时间
    • 像一些用电池供电的设备对空闲时候的耗电量是有极大要求的,比如数据采集设备、车钥匙、遥控器、报警器等等,这些产品都有个特点就是在它们的生命周期里绝大部分时间都是空闲状态,但是我们知道,单片机程序一旦开始,正常运行的状态下,程序永远都不会停下来,所以主程序的最后,一般都是个死循环,即使需要空闲,让程序停下来,那也得来个空循环让程序一直转圈卡住,但是,程序运行就会耗电空循环的耗电量也是很大的,比如遥控器如果不用它的时候,程序一直空循环那么用不到几天,电池就没电了,这样显然是不行的
    • 所以说,对于这些设备我们需要这样的低功耗模式,在空闲状态时,关闭不必要的硬件,比如我直接把CPU断电,或者关闭时钟,这样程序自然就不会运行了,但是在低功耗模式下我们也需要保留必要的唤醒电路,比如串口接收数据的中断唤醒、外部中断唤醒、RTC闹钟唤醒等等,在需要设备工作时STM32能够立刻重新投入工作,这样才行,如果你只考虑进入候功耗而不考虑唤醒,STM32一睡不醒,那不就跟直接断电没区别了嘛,所以,低功耗模式,我们要考虑关闭哪些硬件,保留哪些硬件,以及如何去唤醒,当然,关闭越多的硬件,设备越省电,唤醒就越麻烦

2.电源框图

整体上看,这个图可以分为3个部分,最上面是模拟部分供电,叫作VDDA(VDD Analog),中间是数字部分供电包括两块区域,VDD供电区域和1.8V供电区域,下面是后备供电,叫作VBAT(V Battery)

VDDA供电区域,主要负责模拟部分的供电,其中包括AD转换器、温度传感器、复位模块、PLL锁相环,这些电路的供电正极是VDDA,负极是VSSA,其中AD转换器,还有两根参考电压的供电脚,叫作VREF+和VREF-,这两个脚在引脚多的型号里会单独引出来,在引脚少的型号,比如我们这个C8T6,VREF+和VREF-在内部就已经分别接到了VDDA和VSSA了

然后看中间部分的供电,这一块由两部分组成,左边部分是VDD供电区域,其中包括IO电路、待机电路、唤醒逻辑和独立看门狗,右边部分是VDD通过电压调节器,降压到1.8V,提供给后面这一块的1.8V供电区域,1.8V区域包括CPU核心、存储器和内置数字外设,可以看出,STM32内部的大部分关键电路,CPU、存储器和外设,其实都是以1.8V的低电压运行的,当这些外设需要与外界进行交流时才会通过I0电路转换到3.3V,所以我们从外部看好像STM32内部全是3.3V,但实际上,它内部的CPU、外设等,都是1.8V供电运行,使用候电屈运行的主要目的是降低功耗,电压越低,内部电路运行的功耗就相对越低,主要是记住,CPU核心、存储器和数字外设都属于1.8V供电区域,而待机电路、唤醒逻辑等属于VDD供电区域,然后这个电压调节器,它的作用是给1.8V区域供电

最下面就是我们上一节提到的VBAT后备供电区域了,其中包括LSE 32K晶体振荡器、后备寄存器、RCC BDCR寄存器和RTC,RCC BDCR是RCC的寄存器,叫备份域制寄存器,也是和后备区域有关的寄存器,所以也可以由VBAT供电,然后这里有个低电压检测器可以控制这个开关,VDD有电时,由VDD供电,VDD没电时,由VBAT供电

需要了解STM32内部有哪几部分供电区域,以及每部分供电区域里都有啥

3.上电复位和掉电复位

首先是上电复位和掉电复位,这个的意思是,当VDD或者VDDA电压过低时,内部电路直接产生复位,让STM32复位住,不要乱操作,这个复位和不复位的界限之间设置了一个40mV迟滞电压,大于上限POR(PowerOn Reset)时解除复位,小于下限PDR(Power Down Reset)时复位,这是一个典型的迟滞比较器,设置两个阀值的作用就是防止电压在某个阈值附近波动时造成输出也来回抖动,下面的复位信号Reset,是低电平有效的,所以在前面和后面,电压过低时,是复位的,中间电压正常的时候,不复位,那这个电压上限和下限,具体是多少V呢,还有这里解除复位,还有个滞后时间,是多久呢,可以看下STM32数据手册,在5.3.3内嵌复位和电源控制模块特性里有这个表这里写了上电掉电复位阀值下降沿,也就是PDR掉电复位的阈值下限典型值是1.88V,上开落,也就是POR上电复位的阈值上限典型值是1.92V,1.92-1.88就是迟滞的阈值,40mV,所以如果忽略迟滞的话,简单来说,就是大于1.9V上电,低于1.9V掉电,然后最后一行,就是TRSTTEMPO复位持续时间典型值是2.5ms

4.可编程电压监测器

下面这个是可编程电压监测器,简称PVD,它的工作流程和上面这个差不多,都是监测VDD和VDDA的供电电压,但是PVD的区别就是首先它这个闽值电压是可以使用程序指定的,可以自定义调节,调节的范围可以看一下数据手册,在这个表的上面就是PVD的阈值,配置PLS奇存器的3个位,可以选择着边这么多的值,因为这里也同样是迟滞比较所以有两个阈值,可选范围是2.2V到2.9V左右,PVD上限和下限之间的迟滞电压是100mV,可以看到,PVD的电压是比上电掉电复位电压要高的,画个图就是3.3V是正常的供电,当这个电压降低,在2.9V到2.2V之间,属于PVD监测的范围,可以通过PVD设置一个警告线,之后再降低,到1.9V就是复位电路的监测范围,低于1.9直接复位住,不让动了,这是这两个电屈监测的工作任务,那当然,PVD触发之后,芯片还是能常工作的,只不过是电源电压过低,该提醒一下用户了,所以看一下下面这个PVD输出,这个是正逻辑,电压过低时为1,电压常时为0,这个信号,可以去申请中断,在上升沿或者下降沿时,触发中断,以此提醒程序进行适当的处理,另外,这个PVD的中断申请,是通过外部中断实现的

外部中断基本结构可以看到,PVD输出的信号,是跑到这里来了,所以如果要使用PVD的话,记得要配置外部中断,然后下面这里还有RTC,这个是RTC的闹钟信号也有借道外部中断,其实RTC自己是有中断的,那为啥还要借道外部中断呢,因为低功耗模式设计的是只有外部中断可以唤醒停止模式,其他这些设备,也想唤醒停止模式的话,就可以通过借道外部中断来实现,其实后面这两个USB和ETH也都只有它们的WeakUp,唤醒信号接过来了,目的,就是为了唤醒停止模式

5.低功耗模式

首先,低功耗模式有三种睡眠、停机和待机,这三种模式,从上到下,关闭的电路越来越多,对应地,从上到下,是越来越省电,同时,从上到下,也是越来越难唤醒的,

首先看一下睡眠模式,这是浅睡眠,相当于打了个盹,如何进入呢?这里写了,直接调用WF或者WEE,即可进入,这两个东西是内核的指令,库函数有对应函数直接调用函数即可,其中WFl的意思是Wait For Interrupt,等待中断,意思就是,我先睡了如果有中断发生的话,再叫我起来,所以对应的唤醒条件是,任一中断,调用WFI进入的睡眠模式任何外设发生任何中断时,芯片都会立刻醒来,因为中断发生了,所以醒来之后的第一件事,般就是处理中断函数

然后下面WFE,意思是Wait For Event,等待事件,对应的唤醒条件是,唤醒事件,这个事件可以是外部中断配置为事件模式,也可以是使能了中断,但是没有配置NVIC,调用WEE进入的睡眠模式,产生唤醒事件时,会立刻醒来,醒来之后,一般不需要进中断函数,直接从睡的地方继续运行,这就是WF和WFE的作用,相同点是,调用任意一个之后芯片都进入睡眠,不同点是,WFI进入的得用中断唤醒,WEE进入的得用事件唤醒,之后看一下睡眠模式对电路的影响,对1.8V区域时钟的影响是,CPU时钟关,对其他时钟和ADC时钟无影响,对VDD区域时钟的影响是,无,对电压调节器的操作是,开,所以睡眠模式对电路的影响就是只把CPU时钟关了,对其他电路没有任何操作,CPU时钟关了,程序就会暂停,不会继续运行了,CPU不运行,芯片功耗就会降低,在省电程度上,评级为“一般省电“

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

然后第二个停机模式,进入首先SLEEPDEEP位设置为1,告诉CPU,你可以放心地睡,进入深度睡眠模式,另外PDDS这一位,用来区分它是停机模式还是下面的待机模式,PDDS=0,进入停机模式,PDDS=1,进入待机模式,所以要想进入停机模式,PDDS要事先设置为0,之后,LPDS,用来设置最后这个电压调节器,是开启,还是进入低功耗模式,LPDS=0,电压调节器开启,LPDS=1,电压调节器进入低功耗,最后,当我们把这些位提前设置好了,最后再调用WFl或者WFE,芯片就可以进入停止模式了,然后停止模式的唤醒,因为这个模式下,芯片睡的更深,关的东西更多,所以唤醒条件就苛刻一些,是任一外部中断,刚才睡眠模式是任一中断,所有外设的中断都行,现在停止模式,要求就是,只有外部中断才能唤醒了,刚刚说到PVD、RTC闹钟、USB唤醒、ETH唤醒借道了外部中断,所以这4个信号,也可以唤醒停止模式,另外这里并没有区分WFI和WFE,WFI要用外部中断的中断模式唤醒,WEE,要用外部中断的事件模式唤醒,这是对应的

之后看,停止模式对电路有哪些操作呢,首先,关闭所有1.8V区域的时钟,这意思就是,不仅CPU不能运行了,外设也运行不了了,定时器正在定时的会暂停,串口收发数据也会暂停,不过由于没关闭电源,所以CPU和外设的寄存器数据都是维持原状的,之后下一个,HSI和HSE的振荡器关团,既然CPU和外设时钟都关了,那这两个高速时钟,显然也没用了,所以HSI内部高速时钟和HSE外部高速时钟,会关团,当然,它没提到的LSI内部低速时钟和LSE外部低速时钟这两个并不会主动关团,如果开启过这两个时钟,还可以继续运行,最后,电压调节器这里可以选择是开启,或者处于低功耗模式,刚才说了,这个电压调节器是由这个LPDS位控制的,这个开启和低功耗模式有啥区别呢,其实区别不大,电压调节器无论是开启还是低功耗都可以维持1.8V区域寄存器和存储器的数据内容,区别就是,低功耗模式更省电一些,同时,低功耗模式在唤醒时,要花更多的时间,主要操作就是把运行的高速时钟都关了,CPU和外设,都暂停工作,但是电压调节器并没有关,存储器和寄存器数据可以维持原样,它的唤醒条件比较节刻,只能通过外部中断唤醒,所以停止模式,相当于整个人都罢工了,脑子不工作,身体也不工作,只有有人用外部中断过来敲我,我才会醒来干活,在省电程度上,评级为“非常省电“

最后我们看第三种待机模式,进入方式和停机模式差不多,首先SLEEPDEEP也是置1,即将深度睡眠,然后PDDS置1,表示即将进入待机模式,最后调用WFI或者WEE,就可以进入待机模式了,然后看一下唤醒条件,普通外设的中断和外部中断,都无法唤醒待机模式,待机模式,只有这几个指定的信号才能唤醒,第一个是WKUP引l脚的上升沿,WKUP引脚,可以看一下引脚定义这里,PA0-WKUP指示WKUP引l脚的位置,第二个,是RTC闹钟事件RTC闹钟可以唤醒待机模式,应用场景就是,芯片每隔一段时间自动工作一次,第三个,是NRST引l脚上的外部复位,意思就是,按一下复位键,它也是能唤醒的,最后一个,IWDG独立看门狗复位,可以看出,待机模式只有这指定的四个信号能唤醒,其他信号都唤醒不了,唤醒条件最为苛刻,之后待机模式,对电路的操作基本上是能关的全都关了,1.8V区域的时钟关闭,两个高速时钟关团,电压调节器关闭,这个意味着1.8V区域的电源关闭,内部的存储器和寄存器的数据全部丢失,但是和停止模式一样它并不会主动关团LSI和LSE两个低速时钟,因为这两个时钟还要维持RTC和独立看门狗的运行所以不会关闭,主要操作就是把能关的全都关掉,只保留几个唤醒的功能,当然,配合RTC和独立看门狗的低速时钟也可以正常工作,所以待机模式,相当于这个人直接下班回家睡觉了,没有指定的这几个事,他是不会轻易回来工作的,在省电程度上,待机模式评级为“极为省电”

6.模式选择

这两个指令是最终开启低功耗的触发条件,配置其他的寄存器,都要在这两个指令之前

首先,一旦WFI或者WFE执行了,芯片咋知道他要进入哪种低功耗模式呢,那它就会按照这个流程来判断,首先,看看SLEEPDEEP位是1还是0,如果SLEEPDEEP=0,就是浅睡眠,对应的就是睡眠模式,如果SLEEPDEEP=1,表示要进入深度睡眠模式,对应的是停机或者待机模式,停机和待机,都可以叫作深度睡眠模式,在普通的睡眠模式下还有一个细分的功能,通过SLEEPONEXIT位来决定,这一位等于0时,无论程序在哪里调用WFIFE,都会立刻进入睡眠,这一位等于1时,执行WFIWFE之后官会等待中断退出,等所有中断处理完成之后,再进入睡眠,这个可能考虑到中断还有一些紧急的任务,最好不要被睡眠打断了,当然这两种细分模式一般不用管,只要我们不在中断函数里调用WFWFE,那其实它们的效果是一样的,我们WFINFE可以放在主程序里,如果主程序执行到了,自然也代表中断处理完成了,如果你想在中断函数里调用WFI/WFE,并且想中断结束后再睡眠,才需要考虑下面这个模式

然后继续看进入深度睡眠模式,官会继续判断PDDS这一位,如果PDDS=0,就进入的是停机模式,如果PDDS=1,就进入的是待机模式,在停机模式下,官会继续判浙LPDS位,如果LPDS=0,就是停机模式且电压调节器开启,如果LPDS=1,就是停机模式且电压调节器低功耗,电压调节器低功耗的特性就是更省电,但是唤醒延迟更高

7.三种模式特性

7.1 睡眠模式

  • 执行完WFI/WFE指令后,STM32进入睡眠模式,程序暂停运行,唤醒后程序从暂停的地方继续运行
    • 般我们可以在主循环的最后,执行一下WFI/WFE,主循环执行一遍,就睡眠,然后唤醒之后,循环又会执行一遍,再睡眠,每唤醒一次,主循环执行一遍
  • SLEEPONEXIT位决定STM32执行完WFI或WFE后,是立刻进入睡眠还是等STM32从最低优先级的中断处理程序中退出时进入睡眠
  • 在睡眠模式下,所有的I0引脚都保持它们在运行模式时的状态
    • 比如,如果你在程序里进行点灯,灯点亮了,再进入睡眠,灯仍然是亮的,GPIO引脚的高低电平在睡眠时是维持原样的
  • WFI指令进入睡眠模式,可被任意一个NVIC响应的中断唤醒
  • WFE指令进入睡眠模式,可被唤醒事件唤醒

7.2 停止模式

  • 执行完WFI/VFE指令后,STM32进入停止模式,程序暂停运行,唤醒后程序从暂停的地方继续运行
    • 因为睡眠模式和停止模式存储器和寄存器的内容都可以维持,所以唤醒后,程序可以直接在暂停的地方继续运行
  • 1.8V供电区域的所有时钟都被停止,PLL、HSI和HSE被禁止,SRAM和寄存器内容被保留下来
  • 在停止模式下,所有的1/0引脚都保持它们在运行模式时的状态
  • 当一个中断或唤醒事件导致退出停止模式时,HSI被选为系统时钟
    • 我们的程序,默认在Svstemlnit函数里的配置,是使用的HSE外部高速时钟,通过PLL倍频,得到72MHz主频,但是进入停止模式后PLL和HSE都停止了,而且在退出停止模式时它并不会再自动帮我们开启PLL和HSE,而是默认用HSI的8MHZ,直接作为主频,所以如果你忽略了这个问题就会出现一个现象,你程序刚上电,是72MHz的主频,但是进入停止模式,再唤醒之后就变成8MHz的主频了,所以,我们一般在停止模式唤醒后,第一时间就是重新启动HSE,配置主频为72MHZ,这个操作也不麻烦配置的函数他都帮我们写好了,我们只需要再调用-下Systemlnit就行
  • 当电压调节器处于低功耗模式下,系统从停止模式退出时,会有段额外的启动延时
  • WFI指令进入停止模式,可被任意一个EXTI中断唤醒
  • WFE指令进入停止模式,可被任意一个EXTI事件唤醒

7.3 待机模式

  • 执行完WFI/WFE指令后,STM32进入待机模式,唤醒后程序从头开始运行
    • 这个和上面两个模式就有些区别了,待机模式下唤醒,程序是从头开始运行的,因为待机模式把内部大部分电路的电源直接断了,数据都丢失了,唤醒之后,程序也无法继续只能从头开始
  • 整个1.8V供电区域被断电,PLL、HSI和HSE也被断电,SRAM和寄存器内容丢失,只有备份的寄存器和待机电路维持供电
  • 在待机模式下,所有的1/0引脚变为高阻态(浮空输入)
    • 所以说,如果你提前点了个灯,进入待机模式后无论这个灯是高电平点亮还是低电平点亮,官都会熄灭,GPIO对外不输出高低电平,也不流过电流
  • WKUP引脚的上升沿、RTC闹钟事件的上升沿、NRST引脚上外部复位、IWDG复位退出待机模式(唤醒条件)

,,,,,,,,,,,,,,


原文地址:https://blog.csdn.net/m0_60322134/article/details/142911699

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!