一、电源介绍

1.1 STM32下的电源管理

电源框图

image

电源标号说明

image

电压调节器

复位后调节器总是使能。以3种不同的模式工作。

  • 运转模式:调节器以正常功耗模式提供1.8V电源(内核,内存和外设)。
  • 停止模式:调节器以低功耗模式提供1.8V电源,以保存寄存器和SRAM的内容。
  • 待机模式:调节器停止供电。除了备用电路和备份域外,寄存器和SRAM的内容全部丢失。

上电复位(POR)和掉电复位(PDR)

image

可编程电压监测器(PVD)

二、低功耗

image

STM32F10xxx有三种低功耗模式:

  • 睡眠模式(M3内核停止,所有外设包括Cortex-M3核心的外设,如NVIC、系统时钟(SysTick)等仍在运行)
  • 停止模式(所有的时钟都已停止)
  • 待机模式(1.8V电源关闭) 在运行模式下,可以通过以下方式中的一种降低功耗:
  • 降低系统时钟
  • 关闭APB和AHB总线上未被使用的外设时钟。

2.1 降低系统时钟

  • 对预分频寄存器进行编程,降低任意一个系统(SYSCLK、HCLK、PCLK1、PCLK2)的速度。

2.2 外部时钟的控制

  • 进入睡眠模式前,利用预分频器来降低外设的时钟。
  • 在执行WFI或WFE指令前关闭所有外设的时钟

如何设置?

  • 通过设置AHB外设时钟使能寄存器 (RCC_AHBENR)、APB2外设时钟使能寄存器(RCC_APB2ENR)和APB1外设时钟使能寄存器(RCC_APB1ENR)来开关各个外设模块的时钟。

三、三种模式

3.1 睡眠模式

该模式唤醒所需的时间最短,因为没有时间损失在中断的进入或退出上。

进入睡眠模式?

执行WFI或WFE指令进入睡眠状态。 选择睡眠模式进入机制:

  • SLEEP-NOW:SLEEPONEXIT位置0,当WRI或WFE被执行时,微控制器立即进入睡眠模式。
  • SLEEP-ON-EXIT:SLEEPONEXIT位置1,系统从最低优先级的中断处理程序中退出时,微控制器进入睡眠模式。

在睡眠模式下,所有的I/O引脚都保持它们在运行模式时的状态。

image image

退出睡眠模式?

  • 执行WFI指令进入睡眠模式,任意一个被嵌套向量中断控制器响应的外设中断都能将系统从睡眠模式唤醒
  • 执行WFE指令进入睡眠模式,一旦发生唤醒事件时,微处理器都将从睡眠模式退出。

唤醒事件可以通过下述方式产生:

  • 外设控制寄存器中使能一个中断,不是在NVIC中使能,在Cortex-M3系统控制寄存器中使能SEVONPEND位唤醒后处理:MCU从WFE中唤醒后,外设的中断挂起位和外设的NVIC中断通道挂起位(在NVIC中断清除挂起寄存器中)必须被清除

  • 配置一个外部或内部的EXIT线为事件模式唤醒后不需要处理:当MCU从WFE中唤醒后,因为与事件线对应的挂起位未被设置,不必清除外设的中断挂起位或外设的NVIC中断通道挂起位。

image image

3.2 停止模式

停止模式是睡眠模式的进一步应用,在停止模式下电压调节器可运行在正常或低功耗模式。此时在1.8V供电区域的的所有时钟被停止PLL、HSI和HSE RC振荡器的功能被禁止SRAM和寄存器内容被保留下来在停止模式下,所有的I/O引脚都保持它们在运行模式时的状态。

进入停止模式?

  • 设置进入睡眠模式、设置电源控制寄存器(PWR_CR)的LPDS位使内部调节器进入低功耗模式,能够降低更多的功耗。

  • 正在进行闪存编程,直到对内存访问完成,系统才进入停止模式。

  • 正在进行对APB的访问,直到对APB访问完成,系统才进入停止模式。

通过对独立的控制位进行编程,可选择以下功能:

  • 独立看门狗(IWDG):写入看门狗的键寄存器或硬件选择来启动IWDG。一旦启动了独立看门狗,除了系统复位,它不能再被停止。
  • 实时时钟(RTC):通过备份域控制寄存器 (RCC_BDCR)的RTCEN位来设置。
  • 内部RC振荡器(LSI RC):通过控制/状态寄存器 (RCC_CSR)的LSION位来设置。
  • 外部32.768kHz振荡器(LSE):通过备份域控制寄存器 (RCC_BDCR)的LSEON位设置。

注意:进入该模式前ADC和DAC没有被关闭,那么这些外设仍然消耗电流。通过设置寄存器ADC_CR2的ADON位和寄存器DAC_CR的ENx位为0可关闭这2个外设。

退出停止模式?

  • 一个中断或唤醒事件导致退出停止模式时,HSI RC振荡器被选为系统时钟。启动后默认HSI RC为系统时钟,需要重新配置

如何解决唤醒后的启动延时?

  • 电压调节器处于低功耗模式下,当系统从停止模式退出时,会有一段额外的启动延时

  • 在停止模式期间保持内部调节器开启,则退出启动时间会缩短,但相应的功耗增加

image

3.3 待机模式

待机模式可实现系统的最低功耗。该模式是在深睡眠模式时进一步关闭了电压调节器。整个1.8V供电区域被断电。PLL、HSI和HSE振荡器也被断电。SRAM和寄存器内容丢失。 只有备份的寄存器和待机电路维持供电(外部电池)。

进入待机模式?

image

设置独立的控制位,选择以下待机模式的功能保留的功能):

  • 独立看门狗(IWDG):通过写入看门狗的键寄存器或硬件选择来启动IWDG。一旦启动了独立看门狗,除了系统复位,它不能再被停止。
  • 实时时钟(RTC):通过备用区域控制寄存器(RCC_BDCR)的RTCEN位来设置。
  • 内部RC振荡器(LSI RC):通过控制/状态寄存器(RCC_CSR)的LSION位来设置。
  • 外部32.768kHz振荡器(LSE):通过备用区域控制寄存器(RCC_BDCR)的LSEON位设置。

退出待机模式?

  • 一个外部复位(NRST引脚)、IWDG复位、WKUP引脚上的上升沿或RTC闹钟事件的上升沿发生时,微控制器从待机模式退出。
  • 待机唤醒后,除了电源控制/状态寄存器(PWR_CSR),所有寄存器被复位
  • 从待机模式唤醒后的代码执行等同于复位后的执行(采样启动模式引脚、读取复位向量等)。电源控制/状态寄存器(PWR_CSR)将会指示内核由待机状态退出。 image

待机模式下的输入/输出端口状态

在待机模式下,所有的I/O引脚处于高阻态,除了以下的引脚:

  • 复位引脚(始终有效)
  • 当被设置为防侵入或校准输出时的TAMPER引脚
  • 使能的唤醒引脚

调试模式

在进行调试微处理器时,使微处理器进入停止或待机模式,将失去调试连接,因为Cortex™-M3的内核失去了时钟

  • 设置DBGMCU_CR寄存器中的某些配置位,可以在使用低功耗模式下调试软件

四、低功耗模式下的自动唤醒(AWU)

RTC可以在不需要依赖外部中断的情况下唤醒低功耗模式下的微控制器(自动唤醒模式)。

  • RTC提供一个可编程的时间基数,用于周期性从停止或待机模式下唤醒

  • 通过备份区域控制寄存器(RCC_BDCR)的RTCSEL[1:0]位的编程,三个RTC时钟源中的二个时钟源可以选作实现此功能。

  • 低功耗32.768kHz外部晶振(LSE):该时钟源提供了一个低功耗且精确的时间基准。(在典型情形下消耗小于1μA) ● - 低功耗内部RC振荡器(LSI RC):使用该时钟源,节省了一个32.768kHz晶振的成本。但是RC振荡器将少许增加电源消耗。

为了用RTC闹钟事件将系统从停止模式下唤醒,必须进行如下操作:

  • 配置外部中断线17为上升沿触发。
  • 配置RTC使其可产生RTC闹钟事件。

如果要从待机模式中唤醒,不必配置外部中断线17

五、寄存器

5.1 电源控制寄存器(PWR_CR)

image

image

5.2 电源控制/状态寄存器(PWR_CSR)

image

image

5.3 配置

睡眠中断唤醒进入:执行WFI 、SLEEPDEEP = 0 、SLEEPONEXIT = 0 睡眠中断唤醒退出:中断

停止中断唤醒进入:执行WFI 、SLEEPDEEP位 、 PWR_CR中的PDDS、 PWR_CR中LPDS 停止中断唤醒退出:中断

待机中断唤醒进入:执行WFI 、SLEEPDEEP位 、 PWR_CR中的PDDS、 PWR_CSR中的WUF=0 待机中断唤醒退出:WKUP引脚的上升沿、RTC闹钟事件的上升沿、NRST引脚上外部复位、IWDG复位

作者:|登云上人间|,原文链接: https://www.cnblogs.com/lj15941314/p/lowPower.html

文章推荐

分库分表用这个就够了

RocketMQ的简单使用

ClickHouse主键索引最佳实践

一天吃透JVM面试八股文

C# 如何设计一个好用的日志库?【架构篇】

安装Zookeeper和Kafka集群

从一道面试题来学习前台进程和后台进程、孤儿进程和僵尸进程

day03-搭建微服务基础环境02

NodeJS V8引擎的内存和垃圾回收器(GC)

驱动开发:内核测试模式过DSE签名

boost::bind 不能处理函数重载 (error: no matching functio...

linux系统下文件误删除该如何恢复?