目录

STM32模块022-PWR电源控制

STM32模块:022 PWR电源控制

PWR介绍

PWR简介

https://i-blog.csdnimg.cn/direct/12b64aad409c443a9f9c0ef1cc538343.png

处于3种低功耗模式下系统无法烧录程序,可长按复位键时下载。

电源框图

https://i-blog.csdnimg.cn/direct/6f4611b69d33400c92266603b6574c63.png

Vref+和Vref-为AD转换器参考供电,引脚少时与ADDA和ASSA连接。

RCC BDCR为RCC的寄存器,即备份域控制寄存器。

低电压检测器可选择后备供电区域的电源来源。

PWR功能

1.可编程电压检测器

1)上电复位和掉电复位&可编程电压检测器介绍

https://i-blog.csdnimg.cn/direct/95f630f31a6449db96025e6b645428da.png

https://i-blog.csdnimg.cn/direct/0245c4577c634d49aac46f69ae0c75da.png

https://i-blog.csdnimg.cn/direct/1366848ed1014a1b97d691d4e6424341.png

PVD的上下限电压可通过程序设置,2图中的具体数值可参考参考手册5.3.3。

PVD电压比上电掉电复位电压高,当电压从3.3v降低时先达到PVD检测阈值,可通过PVD设置警告,此时电压再降才进入复位电压值。

4种使用外部中断不一定代表其没有自己的中断,仅仅因为外部中断可唤醒停止状态下的设备。PVD可申请中断,其中断通过外部中断实现。而RTC不仅有自己的中断,也可使用外部中断,用于唤醒停止模式设备,RTC闹钟事件可唤醒待机模式。USB和ETH也只能通过WeakUp引脚触发外部中断才能唤醒停止模式。

https://i-blog.csdnimg.cn/direct/045c48ff1e78430aa9cb54b0201a314c.png

2.低功耗模式

1)低功耗模式简介

https://i-blog.csdnimg.cn/direct/34a08e84518947c0b36e7b0236d3792e.png

https://i-blog.csdnimg.cn/direct/cc31e061bba644678e70a6c75468ba1c.png

中断唤醒(触发中断并进入中断函数):中断唤醒设备时,本应从进入睡眠的地方开始执行,但此时触发了中断,使用设备第一时间处理中断函数,再从睡眠地方开始执行,直至处理到睡眠函数再次睡眠(待机模式执行完中断从头开始执行)。

事件唤醒(触发中断不进入中断函数,或硬件电路产生事件):触发方法1.将外部中断配置为事件模式 。 方法2.使能中断,配置为中断模式,但不配置NVIC。通过该唤醒事件唤醒设备时,不进入中断函数,从睡的地方部分继续执行,直至下一个睡眠函数(待机模式从头开始执行)。

关闭电路降低功耗的两种方式:1.关闭时钟(图4,5列) 2.关闭电源(图6列),关闭时钟所有运算和设计时序的操作停止,关闭电源不仅关闭时钟同时还会失去寄存器和存储器里的数据,因此关闭电源更省电。

停机模式和待机模式中LSI和LSE并没有停止运行,因此RTC和看门狗可以运行。电压调节器低功耗模式副影响是延长停机模式的唤醒时间。

睡眠和停止模式仅关闭时钟,对VDD中的IO无影响,待机模式下关闭了电源,使得IO外部中断无法唤醒睡眠,同时IO不能维持睡眠前电平,而是变成了高阻态。

2)模式选择

https://i-blog.csdnimg.cn/direct/494acedb8810454383e634779c5f6120.png

所有配置指令都需在WFI/WFE指令之前。SLEEPONEXIT=1时,若在中断里写WIF/WFE,则系统会执行完中断进入睡眠模式,只要不在中断里设置睡眠模式,则SLEEPONEXIT的2个值功能效果相同。

3)模式特性
(1).睡眠模式
(2).停止模式

https://i-blog.csdnimg.cn/direct/cbfa0eba24104b1a837821d1ad0e7a0c.png

停止模式唤醒时,默认HSI为系统时钟,此时要手动重新启动HSE和PLL,配置主频为72MHZ。

(3).待机模式

https://i-blog.csdnimg.cn/direct/b24b704920f14e1a9514a4fe5f28f535.png

4)各模式耗电情况

https://i-blog.csdnimg.cn/direct/f91ae5d003de4f37b375b244ae1087dd.pnghttps://i-blog.csdnimg.cn/direct/0b18aecfa2294fe88ebd1644d94e431f.png

https://i-blog.csdnimg.cn/direct/03e8351a38094c20ada5079a9e95f31e.png

https://i-blog.csdnimg.cn/direct/1ff9e74c659d4f0d9711bd317f69cd9c.png

由图可知,若正常运行能维持10小时,停机模式能维持约1w小时,待机模式能维持10w小时。图中也表明备份区域的供应电流极低,不用担心备用电池电量耗尽。

PWR寄存器

https://i-blog.csdnimg.cn/direct/7071307cf2aa4fd0ba049098a8885ed2.png

https://i-blog.csdnimg.cn/direct/503f75a4ec3e4c018757cb56c80a6348.png

PWR函数介绍

https://i-blog.csdnimg.cn/direct/5dc1ae28d0674ccb97af5ebfb43b6250.png

System_stm32f10x.c/h文件介绍

**文件作用:**用于配置系统时钟,即配置RCC时钟树,其中i2s的时钟直接来源于sysclk,USB的时钟直接来源于PLL。其中系统默认配置为外部晶振8Mhz,系统主频72Mhz,AHB,APB2为72Mhz,APB1为36Mhz。

https://i-blog.csdnimg.cn/direct/79defedef4d94783b44d4ed94aed45c5.png

文件功能:提供两个外部可调用函数和一个外部可调用的变量。即

https://i-blog.csdnimg.cn/direct/e7eea04afa1c4f9ba2b4fae7ad8869d7.png

SystemInit用于配置时钟树,在系统复位后main函数执行前自动调用,

SystemCoreClock为主频的值。若在初始化后更改主频,则需手动更新SystemCoreClock值。

SystemCoreClockUpdate用于更新SystemCoreClock,SystemCoreClock,只能反映初始化时的主频值,当改变主频值时,SystemCoreClock不会同步更新,需调用SystemCoreClockUpdate函数手动更新。

https://i-blog.csdnimg.cn/direct/993175c330c0444db0479113c9e7b4d0.png

通过更改宏定义的注释,更改主频。#if为预编译,兼容不同型号设备。 VL为超值系列,只有两种主频配置。若该文件为只读无法更改,可右键文件——>属性,取消勾选只读即可。

SystemInit

第一步开启HSI,第二步恢复各种参数的缺省配置,第三步调用SetSysClock函数,该函数为分配函数,根据不同宏定义选择不同的配置函数。 第四步执行配置函数,如配置72Mhz时的SetSysClockTo72函数,该函数先使能HSE,然后循环等待HSE使能结果,若成功则继续配置HCLK(AHB时钟),PCLK2(APB2时钟),PCLK1(APB1时钟)分频器, 默认为1,1,2,再然后配置锁相环PLL,接着选择锁相环作为系统时钟,最后等待锁相环成为系统时钟。

https://i-blog.csdnimg.cn/direct/60a9c3ca17ba40df88f9c57423862382.png

https://i-blog.csdnimg.cn/direct/90abe581f89c442faebff0b2be6099f7.png

https://i-blog.csdnimg.cn/direct/8803b580e8b9427b83ef97baaf0f86d7.png

https://i-blog.csdnimg.cn/direct/405accf8930b4138bf4188b9cdeb3b5a.png

https://i-blog.csdnimg.cn/direct/c783a96ca6a44d8795231d9f2c8db051.png

https://i-blog.csdnimg.cn/direct/5d5181b93aa341b8903bb27c92c89e5b.png

https://i-blog.csdnimg.cn/direct/b7b4294a88d84eacb513239bc0ff07c3.png

https://i-blog.csdnimg.cn/direct/7361c147f8204cad915b7c15495c8ce6.png

https://i-blog.csdnimg.cn/direct/845d2231a270497693b4fa853a872059.png

实验模块

实验一:修改主频

1)接线图

https://i-blog.csdnimg.cn/direct/17c140f84940481baa0261d1dbd0ed54.png

2)代码

https://i-blog.csdnimg.cn/direct/29cfaceb0e8540d4a0851f258c3230c1.png

3)更改主频

https://i-blog.csdnimg.cn/direct/dd764826d4444d068b43b1cc449cb768.png

https://i-blog.csdnimg.cn/direct/5a80adb754024756853c31a6bc873e27.png

4)实验现象

https://i-blog.csdnimg.cn/direct/78013b53823740f0bbad89de84c801d9.png

修改主频后,Running显示时间和消失时间都变为了原来的2倍,即1秒,则实验成功。

实验二:睡眠模式+串口发送和接收

当程序只需发生中断的时候工作(进入中断函数并执行有限次数的主函数和其中的while函数),其他时候不工作时,可考虑使用低功耗模式,否则while会不断循环执行不需要重复执行的任务,造成更多不必要的耗电。

1)接线图

https://i-blog.csdnimg.cn/direct/382a309fddc34951aeb7b897271f415a.png

2)代码

https://i-blog.csdnimg.cn/direct/ae0f8b5459184df98b85dbe22a3f5284.png

https://i-blog.csdnimg.cn/direct/a47a02de9c58426ba6558980f2dc53f5.png

https://i-blog.csdnimg.cn/direct/a71b3a28b0214f748faa462264fdb03a.png

注:__WFI对应cpu的睡眠汇编指令

https://i-blog.csdnimg.cn/direct/c48efde33f5d493b8006cf9b21704796.png

3)实验现象

https://i-blog.csdnimg.cn/direct/e977569ff722415c9e0a7a3223b912b6.png

使用串口助手发送数据时,Running显示,随后消失,则实验成功。睡眠模式进入时引脚电平无变化,所以RxData常亮。

实验三:停止模式+对射式红外传感器计次

EXTI不需要使用也无需开启时钟,因此在关闭所有外设时钟的停止模式下依旧可以被使用。

1)接线图

https://i-blog.csdnimg.cn/direct/8f58e3ca30c147a5a579a509931821d2.png

2)代码

停止模式和待机模式与睡眠模式不同,需要PWR的参与,因此需要开启PWR时钟。

配置各种寄存器和调用指令都在最后一个开启函数中,因此只需调用该函数即可,下图为开启函数的内部结构。

https://i-blog.csdnimg.cn/direct/8092714665cb48fe8623ff8dcbb79bcf.pnghttps://i-blog.csdnimg.cn/direct/1e01e1c82e1642eda52722ca4c8a5695.png

https://i-blog.csdnimg.cn/direct/fa9462e5b062404cb1d7d5ad495d10c0.png

3)实验现象

https://i-blog.csdnimg.cn/direct/bef69a145540441dbce679c4aea6e45d.png

每次遮挡传感器时闪烁Running,同时计数值+1,则实验成功。

4)恢复时钟

复位时Running闪烁较快,因为此时时钟为72Mhz,遮挡闪烁较慢,因为进入停止模式再退出时默认时钟变为HSI,为8Mhz。在启动函数后增加时钟配置函数即可。

https://i-blog.csdnimg.cn/direct/36b13834d9e943478ff717b12fd1959e.png

实验四:待机模式+实时时钟

第一步:设置RTC闹钟 第二步:进入待机模式 第三步:使用闹钟信号,唤醒待机模式。

待机模式没有区分WFI和WFE,因为其唤醒方式已经指定为4种确定信号。调用WFI进入待机即可。

使用wakeup引脚无需初始化GPIO和其时钟,因为使能WAKEUP引脚后,其被强置为输入下拉模式。

待机模式由于没有保存寄存器和各参数的值,退出时会从头开始执行,因此无需像停止模式一样重新写入SystemInit函数。并且待机模式的启动函数之后的代码永远无法执行。

寄存器下方可显示其读写特性,如:

只写

https://i-blog.csdnimg.cn/direct/9190c5ad62a34102a26f3db0c8284129.png

读写

https://i-blog.csdnimg.cn/direct/6d5f46020c7a40fb941e934c6a205f76.png

https://i-blog.csdnimg.cn/direct/024d535da13549198aacba91b20cdade.png

由于闹钟函数配置的闹钟寄存器为只写函数,因此无法读取其的值,因此最好定义变量,在写入前先保存其值到变量中。

https://i-blog.csdnimg.cn/direct/644b004cdca240258ee9ee6bfa5a9e29.png

1)接线图

https://i-blog.csdnimg.cn/direct/5d6adf27e46b4f33b2ac6f68b422f094.png

2)代码

https://i-blog.csdnimg.cn/direct/5f2a0938861c42cd9bd75a551d3f14b2.png

https://i-blog.csdnimg.cn/direct/4aa272de42fe4584811ec6f492d89aa6.png

3)实验现象

https://i-blog.csdnimg.cn/direct/1f035a178e2d45f9b0e1979177f51c64.png

每过10s闹钟触发或wakeup引脚接入高电平,显示屏显示图中内容,随后Running率先消失,其他字符接着消失,此时显示屏无内容。则实验成功。

(知识自学习专题,课程资料来源于江协科技)