上次我们完成了BKP和RCT实时闹钟的学习,这次为我们完成PWR电源控制的学习。
一.PWR简介
1.简介

第一条的作用是,只要我们直到,可编程电压检测器和低功耗模式。
第二条我们需要注意的是。假如一个设备,使用电池供电,或者对安全要求比较高的设备,如果供电电压再不断下降,再电压过低的情况下,可能回导致外部或者内部电路发生不确定的错误,为了避免不确定因素,在电源电压低于设置的阈值时,我们可以主动出击,提前发出警告,并且关闭比较危险设备。
第三条,睡眠模式,停机模式,待机模式。尤其是像是一些,使用电池供电的设备,对空闲时候的耗电量是有极大要求的。比如设备采集设备,车钥匙,遥控器,报警器等等。这些产品都有各自的特点,就是在他们的声明周期里,绝大部分时间都是空闲状态。
但是我们知道,单片机程序一旦开始,在正常运行的情况下,程序永远都不会停下来。所以主程序的最后一般都是一个死循环。但是程序运行就会耗电,空循环的耗电量也是很大的。比如遥控器,如果程序用不到他的时候,他一直空循环,那么用不了多久就没电了。这显然是不行的,所以我们就需要引入,低功耗模式,在空闲状态时,关闭不必要的硬件。
但是在低功耗模式下,我们也需要保留唤醒电路,比如说串口接收数据的唤醒,外部中断唤醒。RTC闹钟唤醒等等。
2电源框图
这个图就是STM32内部的供电方案

(1)模拟部分供电VDDA

这其中PLL是锁相环。VDDA是供电正极,VSSA是供电负极。其中A/D转换器还有两根参考电压的供电引脚VREF+,VREF-。这两个引脚会在引脚多的时候单独印出来,但是我们的C8T6中VREF+,VREF-在内部就接到了VDDA和VSSA中了。
(2)数字部分供电VDD

这一部分有两个部分组成,一个是VDD供电区域,其中包括了I/O电路,待机电路,唤醒逻辑和独立看门狗,右边是VDD通过电压调节器,降低到1.8V,提供给后面的1.8V供电区域。
可以看到在STM32中存储器和外设,都是以1.8V的低电压运行的,当这些外设需要与外界进行交流时候。才会通过I/O电路转哈的3.3V。使用低电压运行的目的是降低功耗
我们只需要记住,CPU核心存储器和数字外设都属于1.8V供电区。然后电压调节器,他的作用是给1.8V区域供电
(3)后备供电

RTC BDCR是RCC的寄存器叫备份域控制寄存器,也是和后备域有关的寄存器所以也可以由VBAT供电。然后这里有个低电压检测器,可以控制前面的开关。VDD有电时由VDD供电,VDD没电时候,由VBAT供电。
3.上电复位和掉电复位

这个意思时当VDD或者VDDA电压过低时,内部电路自动产生复位,让STM32复位住,不要乱操作。这个复位和不复位之间,设置了一个40mv迟滞电压。大于上线POR时解除复位,小于下限PDR时复位。这是一个典型的迟滞比较器。设置两个阈值的作用就是为了防止,电压在某个阈值附近波动。造成输也来回抖动。下面的复位信号Reset是低电平有效的。所以在前面和后面,电压过低时是复位。中间电压正常时候不复位。那么这个电压上线和下限是多少V呢,还有滞后时间是多久呢。

我们可以查一下手册,可以看到这里写了上电或掉电的复位阈值。下降沿是POR掉电复位的阈值下限,上升沿是是POR上电复位的阈值上限。下限典型就是1.88V。上限典型就是1.92V。1.92-1.88就是迟滞的阈值,40mV。如果忽略迟滞的话就是大于1.9V上电,低于19V掉电。接着是复位持续时间,典型值是1.9ms。
4.可编程电压检测器

可编程电压检测器简称PVD。他的工作流程和上面差不多。都是检测VDD和VDDA的供电电压。但是PVD的区别就是,首先他这个阈值电压是可以使用程序指定的。调节的范围可以看一下数据手册。


配置PLS的三个位就可以选择右边这么多的阈值。因为这里也同样是迟滞比较。所以有两个阈值。
可选范围是2.2V到2.9V左右。

PVD上限和下限的迟滞电压是100mV。可以看到PVD的电压是比上电掉电复位的电压要高的。
画个图就是,3.3V是正常供电,当这个电压降低。在2.9V到2.2V之间,属于PVD监测的范围。可以通过PVD设置一个警告线,之后再降低,到1.9V就是复位电路的监测范围。低于1.9V直接复位住,不允许动作。这就是这两个电压检测的任务。
当然PVD触发之后,芯片还是能正常工作的。只不过是电源电压降低,该提醒用户了。所以下面的PVD输出是正逻辑,电压过低时候为1,正常时候为0。这个信号可以申请中断,再上升沿或者下降沿时,触发中断。以此提醒程序进行适当的处理。另外这个PVD的中断申请是通过外部中断来实现的。

我们可以看一下外部中断这个图,发现PVD中断在这里,所以我们要使用中断的话,记得配置一下外部中断。
然后下面这里还有RTC,这个是RTC的闹钟信号。也有进到外部中断。其实RTC自己是有中断的。那么为什么还要接到外部中断呢。这个等下就知道了,因为低功耗的模式设计的是,只有外部中断可以唤醒停止模式。其他设备也想唤醒停止模式的话,都可以通过借助外部中断来实现。
剩下的USB和ETH也都是之后他们的WeakUp唤醒信号接过来了,目的也是为了唤醒停止模式。
二.低功耗模式(重点)
1.低功耗模式一揽
第一列就是有哪几种模式。第二列是如何配置才能进入我们想要的模式。第三列是进入这些模式之后如何进行唤醒。最后三列是每种模式对电路的操作。关闭了那些东西,就是那些电路就不能用了保留了那些东西,就是那些电路可以工作。
首先低功耗模式有3钟,越往下关闭的电路越多。对应的从上到下是越来越省电。同时从上到下也是越来越难唤醒的。

2.睡眠模式
小睡一会。

如何进入呢,这里写了,直接调用WFI或者WFE,即可进入。这两个东西是内核的指令。对应库函数里也有对应的函数。直接调用函数即可,其中WFI的意思是Wait ForInterrupt,等待中断。意思就是先睡眠,如果有中断发生的话,再叫我起来,所以对应的唤醒条件就是任意中断。任何外设的任何中断发生时芯片都会醒来,所以醒来之后的第一件事就是处理中断。
WFE是Wait For Event,等待事件。对应的唤醒条件是唤醒事件。这个事件可以是外部中断配置为事件模式。也可以是使能了中断,但是没有配置NVIC。调用WFE配置的睡眠模式,产生唤醒事件时候,会立刻醒来。醒来之后一般不需要进中断函数。直接从睡得地方继续运行。
WFI和WFE相同点是,调用任意一个之后芯片都会进入睡眠,不同点是WFI进入需要中断唤醒,WFE进入的得用事件唤醒。
我们看一下影响,可以看到的是,睡眠模式只会把CPU时钟关了,对其他电路没有任何操作。CPU时钟关了,程序就会暂停,不会继续运行了。CPU不运行,功耗就会降低。这里还可以看出,关闭电路通常有两个做法,一个是关闭时钟,一个是关闭电源。
关闭时钟,所有的运算和涉及程序的操作都会暂停。但是寄存器里面的数据还可以维持,不会消失。关闭电源,就是电路直接断电,电路的操作和数据都会直接丢失。所以关闭电源比关闭时钟更省电。
电压调节器,实际上就是1.8V区域的电源,电压调节器关,就相当于把1.8V区域断电。
3.停机模式


首先,SLEEPDEEP设置为就是告诉CPU你可以深度睡眠了。PDDS这一位用来区分是停机模式还是待机模式。PDDS=0进入停机模式,PDDS=1进入待机模式。所以想要进入停机模式PDDS要预先设置为0。LPDS用来设置电压调节器。开启或者进入低功耗模式。LPDS=0电压调节器开启,LPDS=1电压调节器进入低功耗。
最后我们把所有位设置好了,在调用WFI或者WFE芯片就可以进入停止模式了。
因为这个模式下,芯片睡得更深。关的东西更多,所以唤醒条件就苛刻一些。是任一外部中断,刚刚我们提到的PVD,RTC闹钟,USB唤醒,ETH唤醒,借到了外部中断,所以这四个信号也可以唤醒停止模式。另外这里并没有区分WFI和WFE。也可以想象的到,WFI要用外部中断的中段模式唤醒,WFE要用外部中断的事件模式唤醒。
首先关闭所有1.8V区域的时钟。这里的意思就是,不仅CPU不能运行了,就连外设也不可以运行了。定时器正在定时的会暂停,串口收发数据也会暂停。不过由于没有关闭电源。所以CPU和外设的寄存器数据都是维持原状的。
既然CPU和外设时钟都关了,那么HSI和HSE这两个告诉时钟也没必要了,所以HSI内部高速时钟,和HSE外部高速时钟也都会关闭。当然没有提到的LSI内部低速时钟,和LSE外部低速时钟这两个并不会主动关闭。如果开启了这两个时钟,那么还可以继续运行。
之后电压调节器可以选择开启,或者低功耗。刚刚说了这个电压调节器,是由LPDS位控制的,这个开启和低功耗模式有什么区别呢。其实区别不大,因为电压调节器无论是开启还是低功耗,都可以维持1.8V区域寄存器和寄存器数据内容。区别就是低功耗模式更省电一些。同时低功耗模式在唤醒时,要花更多的时间。相反开启的话,就是唤醒更快,但是功耗高一些。
4.待机模式


进入模式,首先SLEEPDEEP位置1,进入深度睡眠模式。PDDS位置1,表示进入待机模式,最后调用WFI和WFE。
然后看一下唤醒条件。普通外设的中断和外设中断,都无法唤醒待机模式。待机模式只有这几个指定的信号才可以唤醒。第一个是WKUP引脚的上升沿。

可以看一下就是PA0的上升沿。
第二个是RTC闹钟事件。第三个是NRST引脚上的外部复位。意思就是按一下复位键,也是可以唤醒的。最后一个IWDG独立看门狗复位,之后我们会介绍。
之后待机模式,对能关的电路都关了,1.8V区域时钟关闭,两个高速时钟关闭,电压调节器关闭。这就意味着1.8V区域的电源关闭。内部存储器和寄存器数据全部丢失。但是和停止模式一样,并不会主动关闭,LSI和LSE这两个低速时钟。因为这两个时钟还要维持RTC和独立看门狗的运行。
三.总结一下
1.模式选择问题
WFI和WFE这两条指令是触发STM32低功耗模式的触发条件。配置其他的寄存器要在这两个指令之前。一旦WFI或者WFE执行了,系统怎么判断是哪个模式呢。

首先会判断SLEEPDEEP位是1还是0,等于0就是浅睡眠,等于1就是深睡眠,对应额度就是停机/待机模式。在普通睡眠模式下,还有一个划分就是SLEEPONEXTI来决定,SLEEPONEXTI=0时无论程序在哪里调用WFI/WFE时候都会立刻进入睡眠模式。SLEEPONEXTI=1时,执行WFI/WFE之后,会等待中断退出,等所有中断处理完成之后,在进入睡眠。这个考虑到中断还有一些紧急的任务。最好不要被睡眠打断了。这两个我们一般不用管,只要不在中断函数里调用WFI或者WFE,其实他们效果时一样的。我们可以把WFI和WFE放在主程序里,如果执行主程序了,那么中断肯定完成了。
下面的进入深度睡眠模式,他会进一步判断,PDDS位,如果PDDS=0,就进入的时停机模式,如果PDDS=1,就进入的是待机模式,在停机模式下,会继续判断LPDS位,如果LPDS=0就是电压调节器开启,如果LPDS=1,就是电压调节器低功耗。电压调节器低功耗的特性就是更省电,但是唤醒延迟更高。
2.睡眠模式特性

第一条,一般我们可以在主循环最后,执行以下WFI/WFE。主循环执行一遍就睡眠。然后唤一次后,主循环又会执行一边,在睡眠。每唤醒一次,主循环执行一遍。
第二条,上面讲过。
第三条,比如在程序里点灯,灯点亮了在进行睡眠,灯仍然是亮的GPIO引脚的高低电平,在进入睡眠时是维持原样的。
最后两条,这个唤醒事件还是有些复杂的。可以看一下手册。

在手册睡眠模式这一节,有详细说明。

3.停止模式特性

第一条,因为水淼模式和停止模式,存储器的内容都可以维持,所以唤醒后程序可以在暂停的地方继续运行。
第二条,CPU和外设的时钟都停止,但是没有断电,SRAM和寄存器的数据还可以维持。
第三条,这个和睡眠模式一样,因为没有关闭电源,所以GPIO在进入睡眠或者停止模式时暂停。并且高低电平,维持暂停前一时刻的状态。
第四条,这一条是设计编程的注意事项。我们的程序默认是使用SystemInit里面的配置是使用的HSE外部高速时钟,通过PLL(锁相环)倍频,得到72Mhz主频,但是进入停止模式后,PLL和HSE都停止了而且在退出停止模式时候,它并不会自动帮我们开启PLL和HSE,而是默认用HSI的8MHz直接作为主频。所以如果忽略了这个问题,就会有一个现象。程序刚上电是72Mhz主频,但是进入停止模式,再唤醒之后就是8MHz的主频了这是一个问题,所以我们一般在停止模式唤醒之后第一时间就是重新启动HSE,配置主频为72MHz。这个也不麻烦,配置函数已经被写好了,我们只需要调用SystemInit函数就可以了。
第五条,这个就是电压调节器开启或低功耗模式的区别。
最后两条就是WFI和WFE的区别。
4.待机模式特性

第一条,待机模式唤醒,程序是从新开始执行。因为待机模式把内部的电源大部分都断了,数据也消失了,所以需要从头开启。
第二条,除了备用部分,基本上都断电,断时钟。
第三条,不是所有io口,这里是错误的,只有未被配置的io口会是高阻态。比如提前点灯,进入待机模式后,无论高电平还是低电平点亮,都是会熄灭,GPIO对外不输出高低电平,也不流过电流
第四条,就是待机模式的唤醒条件。
四.查看手册
1.数据手册

点击
这个是从flash运行的耗电数据

正常模式下的电流。可以看到降低主频是非常省电的,如果对频率要求不高,可以适当降低主频。
从SRAM运行的耗电数据

和上面差别不大

主频,温度和耗电的关系。


睡眠模式下的电流。

停机模式下的供应电流和待机模式下的供应电流,可以看到相当省电了。这个电流的单位是uA级别,正常模式和睡眠模式的电流都是mA级别。举个例子,比如有一个300mA的电池,然后正常模式是30mA可以用10小时,停机模式电流是30uA能用10000小时,待机模式电流是3uA能用100000个小时。
最后可以看到备用区域的电流也非常低,RTC开启的时候才1.4uA。
2.参考手册

点击,


这时VERF和VDDA引脚的介绍。

电池备份区域。这里有一些警告和建议。

还有一个注,是需要注意的。这里特别提示了PC13和PC15端口绝对不能驱动LED。但是我们最小系统板,有两个LED,一个是电源指示灯,一个是接在GPIO口的测试灯。并且接在GPIO口的测试灯,正好接在PC13口。所以说这个STM32的最小系统设计违背了这一注意事项,不过好在,贴片LED的电流要求不大,目前没有什么问题。

接着是电压调节器。

这个介绍有两个图,我们上面提到过。

这个图上面也提到过。

之后就是低功耗模式的介绍了。

下面是一些省电建议。刚刚我们也看过降频后功耗明显会降低。然后就是外部时钟控制,不需要的时钟,我们可以直接关掉,减少功耗。另外在睡眠之前也可以关闭所有外设时钟来省电。不过这样,睡眠模式下的威慑就不干活了。

之后是睡眠模式介绍。

退出睡眠也介绍过。

之后是停止模式。

待机模式。

之后是低功耗下自动唤醒。这里的意思就是使用RTC可以在停止模式或者待机模式下,定期唤醒芯片。

剩下就是一些寄存器的描述。

DBP取消写保护,PLS:PVD电平选择。

还有这两个。

里面是一些标志位和控制位。

寄存器总表。