单片机STM32低功耗

单片机STM32低功耗,第1张

前言

本总结参考野火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设有单独的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 数据会被保存,不受功耗模式影响。

低功耗实现命令说明
  1. PVD 可监控 VDD 的电压,当它低于阈值时可产生 PVD 中断以让系统进行紧急处理。
  2. WFI 或 WFE 命令它们实质上都是内核指令,在库文件 core_cmInstr.h 中把这些指令封装成了函数,调用方式__WFI()、__WFE()
停止模式配置

进入停止模式前的寄存器配置,通过函数PWR_EnterSTOPMode()进行实现,关于函数说明请参考库函数注释

前面提到在停止模式中还可以控制内部 FLASH 的供电,控制 FLASH 是进入掉电状态还是正常供电状态,这可以使用库函数 PWR_FlashPowerDownCmd 配置。

待机模式配置

待机模式对应的函数PWR_EnterSTANDBYMode(),由于这个函数没有 *** 作 WUF 寄存器位,所以在实际应用中,调用本函数前,还需要清空 WUF 寄存器位才能进入待机模式。

在进入待机模式后,除了被使能了的用于唤醒的 I/O,其余 I/O 都进入高阻态,而从待机模式唤醒后,相当于复位 STM32 芯片,程序重新从头开始执行。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/718603.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-25
下一篇 2022-04-25

发表评论

登录后才能评论

评论列表(0条)

保存