本总结参考野火STM32开发教程,由于原文档描述过于繁琐,且前后联系容易遗忘,故本人在理解之后进行总结。尽量把事情说的简单通透
提起到低功耗,大家应该就能想到一部分实现的方法,可以让一些外设不工作,而这一般都涉及到电源系统,STM32的电源分类相对于51丰富的多,所以我们将从电源系统分类说起
电源系统分类备份域电路、内核电路、ADC电路
备份域电路STM32 的 LSE 振荡器、RTC、备份寄存器及备份 SRAM 这些器件被包含进备份域电路中,这部分的电路可以通过 STM32 的 VBAT 引脚获取供电电源,在实际应用中一般会使用 3V 的钮扣电池对该引脚供电。
下图为备份域的供电来源,1接VBAT电源(比如纽扣电池),2接VDD,3连接备份域。
备份域的作用:保留关键数据。
内核电路在内核电路中有一个调压器,调压器为备份域(上面所说的VDD)及待机电路以外的所以数字电路进行供电,调压器的输出电压约为1.2V,所以使用调压器进行供电的区域被称为1.2V域。
调压器有三种运行状态:“运行模式”、“停止模式”以及“待机模式”。
- 运行模式下:1.2V域全功率运行
- 停止模式下:1.2V 区域的所有时钟都被关闭,也就是说所有外设关闭,但部分寄存器和RAM数据保留,像时间静止
- 待机模式下:1.2V域断电,所有寄存器和RAM数据丢失
为了保证ADC的转换精度,方便进行滤波,所有为ADC设有单独的ADC电源(VDDA引脚提供),使用 VSSA 作为独立的地连接,VREF 引脚则为ADC 提供测量使用的参考电压。
STM32的工作模式STM32 具有运行、睡眠、停止和待机四种工作模式(按功耗大小顺序列出)
睡眠模式关闭内核时钟,内核停止工作(由于时钟是驱动运行的根基,所以没用时钟就停止使用),片上外设正常运转。
睡眠模式的特性及使用见下图
特性 | 说明 |
---|---|
立即睡眠 | 在执行WFI(wait for interrupt)或WFE(等待事件)指令时立即进入睡眠模式。 |
退出时睡眠 | 在退出优先级最低的中断服务程序后才进入睡眠模式。 |
进入方式 | 内核寄存器的SLEEPDEEP=0,然后调用WFI或WFE指令即可进入睡眠模式; 另外若内核寄存器的SLEEPONEXIT=0时,进入“立即睡眠”模式 SLEEPONEXIT=1时,进入“退出时睡眠”模式。 |
唤醒方式 | 如果是使用WFI指令睡眠的,则可使用任意中断唤醒; 如果是使用WFE指令睡眠的,则由事件唤醒。 |
唤醒延迟 | 无延迟。 |
唤醒后 | 若由中断唤醒,先进入中断,退出中断服务程序后,接着执行WFI指令后的程序; 若由事件唤醒,直接接着执行WFE后的程序。 |
停止模式下,所有的外设时钟也被关闭,但1.2V区域部分电源还在正常工作,故内核的寄存器、RAM信息还保存着数据。从停止模式恢复后可继续执行,停止模式可以由任意一个外部中断唤醒。在停止模式中可以选择电压调节器为开模式或低功耗模式(低功耗模式应该就是上面所说的调压器的停止模式,纯个人猜测),可选择内部 FLASH 工作在正常模式或掉电模式。
特性 | 说明 |
---|---|
调压器低功耗模式 | 在停止模式下调压器可工作在正常模式或低功耗模式,可进一步降低功耗 |
FLASH掉电模式 | 在停止模式下 FLASH可工作在正常模式或掉电模式,可进一步降低功耗 |
进入方式 | 内核寄存器的 SLEEPDEEP=1,PWR CR寄存器中的PDDS=0,然后调用WFI 或WFE指令即可进入停止模式; PWR CR寄存器的LPDS=0时,调压器工作在正常模式,LPDS=1时工作在低功耗模式; PWR CR寄存器的 FPDS=0时,FLASH工作在正常模式,FPDS=1时进入掉电模式。 |
唤醒方式 | 如果是使用WFI指令睡眠的,可使用任意EXTI线的中断唤醒;如果是使用WFE 指令睡眠的, 可使用任意配置为事件模式的EXTI线事件唤醒。 |
停止时 | 内核停止,片上外设也停止。这个状态会保留停止前的内核寄存器、内存的数据。 |
唤醒延迟 | 基础延迟为 HSI振荡器的启动时间,若调压器工作在低功耗模式,还需要加上调压器从低功耗切换正常模式下的时间,若 FLASH工作在掉电模式,还需要加上 FLASH从掉电模式唤醒的时间。 |
唤醒后 | 若由中断唤醒,先进入中断,退出中断服务程序后,接着执行WFI指令后的程序;若由事件唤醒,直接接着执行WFE后的程序。唤醒后,STM32 会使用HIS作为系统时钟。 |
相对于停止模式,待机模式下所有的1.2V区域的电源全部关闭,内核RAM数据丢失,由于没有之前代码的运行记录,只能对芯片复位然后重新从头开始执行程序。
它有四种唤醒方式,分别是 WKUP(PA0) 引脚的上升沿,RTC 闹钟事件,NRST 引脚的复位和 IWDG(独立看门狗) 复位。
特性 | 说明 |
---|---|
进入方式 | 内核寄存器的 SLEEPDEEP=1,PWR CR寄存器中的 PDDS=1,PWR_CR寄存器中的唤醒状态位WUF=0,然后调用WFI或WFE指令即可进入待机模式; |
唤醒方式 | 通过WKUP引脚的上升沿,,RTC闹钟、唤醒、入侵、时间戳事件或NRST引脚外部复位及IWDG复位唤醒。 |
待机时 | 内核停止,片上外设也停止;内核寄存器、内存的数据会丢失;除复位引脚、RTC AF1引脚及WKUP引脚,其它 I/O口均工作在高阻态。 |
唤醒延迟 | 芯片复位的时间 |
唤醒后 | 相当于芯片复位,在程序表现为从头开始执行代码。 |
在以上讲解的睡眠模式、停止模式及待机模式中,在备份域电源正常供电,备份域内的 RTC 都可以正常运行、备份域内的寄存器及备份域内的 SRAM 数据会被保存,不受功耗模式影响。
低功耗实现命令说明- PVD 可监控 VDD 的电压,当它低于阈值时可产生 PVD 中断以让系统进行紧急处理。
- WFI 或 WFE 命令它们实质上都是内核指令,在库文件 core_cmInstr.h 中把这些指令封装成了函数,调用方式__WFI()、__WFE()
进入停止模式前的寄存器配置,通过函数PWR_EnterSTOPMode()进行实现,关于函数说明请参考库函数注释
前面提到在停止模式中还可以控制内部 FLASH 的供电,控制 FLASH 是进入掉电状态还是正常供电状态,这可以使用库函数 PWR_FlashPowerDownCmd 配置。
待机模式配置待机模式对应的函数PWR_EnterSTANDBYMode(),由于这个函数没有 *** 作 WUF 寄存器位,所以在实际应用中,调用本函数前,还需要清空 WUF 寄存器位才能进入待机模式。
在进入待机模式后,除了被使能了的用于唤醒的 I/O,其余 I/O 都进入高阻态,而从待机模式唤醒后,相当于复位 STM32 芯片,程序重新从头开始执行。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)