MCU终端低功耗实训

2018年11月19日 538点热度 0人点赞 0条评论

开发平台:HX戊戌-ZERO

低功耗模式简介

在ST官方文档中,STM32L系列提供了5种基本低功耗模式。它们分别是:

  1. Sleep mode(睡眠模式)
  2. Low-power run mode(低功耗运行模式)
  3. Low-power sleep mode(低功耗睡眠模式)
  4. Stop mode(停止模式)
  5. Standby mode (待机模式)

以上5中低功耗模式中,MCU功耗依次降低,官方给出的典型参考值如表7-5-1:

模式 STM32L15x 典型值
运行模式,主时钟频率为16 MHz,关所有外设时钟 4mA
睡眠模式功耗,主时钟频率为16 MHz,关所有外设时钟 1000µA
低功耗运行模式功耗,32kHz运行频率 9~12µA
低功耗睡眠模式功耗,主时钟频率为32KHz,运行一个32KHz的定时器 4.4µA
停止模式功耗,实时时钟(RTC)运行,保存上下文,保留RAM内容 1.6~4μA
停止模式功耗,无实时时钟运行,保存上下文,保留RAM内容 1.1~2.2 μA
待机模式功耗,使能RTC 1.33~2.9µA
待机模式功耗,使用低速内部振荡器,不使能独立看门狗,关闭RTC 0.3~0.55µA

表 7-5-1

STM32L提供的这5种低功耗模式,每种模式的工作特点和对系统时钟的影响也不一样,见表 7-5-2。

Standby mode(待机模式)电流最低,但是在待机模式时MCU处于不受控制的状态,所有I/O口都保持在高阻状态,而且只有几个专用的引脚或者用RTC事件能够将MCU唤醒,而且每次唤醒相当于程序重启,RAM中的数据全部丢失,在有外部器件连接的情况下,器件引脚可能会吸收大量的电流,反而达不到低功耗要求。所以使用待机模式需要对硬件设计有比较高的要求。

Stop mode(停止模式)的功耗仅次于待机模式。在停止模式下,PLL[1], MSI, HSI和HSE晶体振荡器都被停止,但是RAM和寄存器的值保留。停止模式可以理解为当程序进入停止模式后会暂停运行,直到中断触发退出停止模式,程序会从刚刚停止的地方继续运行。此时STM32L1默认的时钟源变为HSI (16 MHz),因此若要让STM32回到运行模式并正常工作,必须恢复STM32L1在停止模式前的时钟配置。

Sleep mode(睡眠模式)的功耗最高,所以对系统的影响也最小。在睡眠模式下只有CPU时钟停止,不影响其他时钟,而且所有外设都可以继续工作。

综上所述,我们在做具体的低功耗项目时推荐使用停止模式。因为停止模式功耗较低,而且可用任一中断或事件唤醒,实时性高。待机模式虽然功耗最低,但是与停止模式的差距也不大,而且对硬件的设计和程序的处理都有比较高的要求,实时性也不是很好。不过,如果需要CPU一直工作,那么就应该选择低功耗运行模式和低功耗睡眠模式比较合适,因为这两种模式都限制了CPU的最大运行速度。

[1] STM32 有五个时钟源,为HSI、HSE、LSI、LSE、PLL

HSI是高速内部时钟,RC振荡器,频率为8MHz。

HSE是高速外部时钟,可接石英/陶瓷谐振器,或者接外部时钟源,频率范围为4MHz~16MHz。

LSI是低速内部时钟,RC振荡器,频率为~37kHz。

LSE是低速外部时钟,接频率为32.768kHz的石英晶体。

PLL为锁相环倍频输出,其时钟输入源可选择为HSI/2、HSE或者HSE/2。倍频可选择为2~16倍,但是其输出频率最大不得超过72MHz

模式 唤醒 时钟影响 I/O状态
低功耗运行模式 恢复系统时钟和内部电源变换器的工作模式 所有I/O口的状态和运行时保持一致
睡眠模式 任意中断/唤醒事件 CPU时钟关闭,不影响其它时钟
低功耗睡眠模式 任意中断/唤醒事件
停止模式 任意EXTI中断 所有的VCORE域时钟都关闭
待机模式 WKUP引脚的上升沿,RTC事件,NRST引脚的外部复位,IWDG复位 所有I/O口都保持在高阻状态

表 7-5-2

低功耗唤醒源简介

在MCU进入低功耗模式运行时,STM32L系列支持多种唤醒源,可以将芯片从超低功耗模式下唤醒。我们经常会使用到的分别是:

  • 3个唤醒引脚(WKUP1/ WKUP2/ WKUP3),即通过外部中断唤醒芯片。
  • 两个RTC闹钟信号 (Alarm A 和 Alarm B)
  • RTC唤醒时钟
  • RTC侵入检测事件
  • RTC时间戳检测事件

通过唤醒引脚的外部中断唤醒芯片比较容易理解,这里重点说明一下RTC事件唤醒芯片的模式。

STM32L系列MCU中内置有低功耗RTC日历。RTC时钟源可以是LSE、LSI、HSE。为了降低功耗,预分频器被分成两个预分频器。一个7位的异步预分频器,一个13位同步预分频器。

RTC提供有两个可编程闹钟信号模块(ALARM A 和ALARM B),可以理解成为程序设置了一个闹钟,当RTC日历中的日期、小时、分钟和秒与警报寄存器(ALRM A /ALRM B)中的值相同时,警报标志位会被置位并产生中断。

RTC提供16位的可编程自动装载计数器(WUTR寄存器)用于产生唤醒中断请求,可编程的唤醒时间范围从120µs到 36小时。

RTC侵入检测事件和时间戳检测事件告警可映射到特殊的RTC_AF1(PC13)引脚,该管脚可配置为RTC侵入检测、时间戳事件和校准输出。

RTC中断EXTI线路连接方式如下:

  • EXTI17 连接到RTC闹钟事件中断
  • EXTI19 连接到RTC入侵检测和时间戳事件中断
  • EXTI20 连接到RTC定时唤醒事件中断

在配置可编程自动装载计数器的时钟输入时,可以设置的参数如下:

  • 2、4、8 或 16 分频的 RTC 时钟 (RTCCLK),对应的参数为

#define RTC_WakeUpClock_RTCCLK_Div2

#define RTC_WakeUpClock_RTCCLK_Div4

#define RTC_WakeUpClock_RTCCLK_Div8

#define RTC_WakeUpClock_RTCCLK_Div16

当 RTCCLK 为 LSE (32.768 kHz) 时,可配置的唤醒中断周期介于 120μs 和 32 s 之间,且分辨率低至 61μs。 计算方法如下:

例如:设置为RTC_WakeUpClock_RTCCLK_Div16,即RTCCLK的16分频,频率值为32.768kHz/16 = 2048Hz,定时时长最大值为(0xFFFF+1)/2048Hz = 32s

  • ck_spre(通常为 1 Hz 内部时钟),对应的参数为

#define RTC_WakeUpClock_CK_SPRE_16bits

#define RTC_WakeUpClock_CK_SPRE_17bits

当 ck_spre 频率为 1 Hz 时,可得到的唤醒时间为 1s 到 36h 左右,分辨率为 1 秒。这一较大的可编程时间范围分为两部分:

RTC_WakeUpClock_CK_SPRE_16bits 即WUCKSEL [2:1] = 10 时为 1s 到 18h。

RTC_WakeUpClock_CK_SPRE_17bits 即WUCKSEL [2:1] = 11 时约为 18h 到 36h

可编程自动装载计数器基本使用步骤如下:

  1. 设置RTC时钟源:RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);

用外部32.768kHz石英晶体作为时钟源。时钟源选择 LSE(外部时钟),比LSI(内部时钟~37KHz)更为精准;根据自己使用的晶振的不同会有不同的频率值。

  1. 设置唤醒时钟源:RTC_WakeUpClockConfig(RTC_WakeUpClock_RTCCLK_Div16);
  2. 设置唤醒时长配置值0x1FFF(4s):RTC_SetWakeUpCounter(0x1FFF);

计算方法: 4s = (0x1FFF+1)×(1/2048)

低功耗编程实例

从官方提供的固件库stm32l1xx_pwr.c中,我们可以找到进入各种低功耗模式的接口函数:

  • 睡眠模式

void PWR_EnterSleepMode(uint32_t PWR_Regulator, uint8_t PWR_SLEEPEntry);

  • 停止模式

void PWR_EnterSTOPMode(uint32_t PWR_Regulator, uint8_t PWR_STOPEntry);

  • 待机模式

void PWR_EnterSTANDBYMode(void);

其中参数PWR_Regulator选择电源是否进入低功耗。

#define PWR_Regulator_ON

#define PWR_Regulator_LowPower

参数PWR_ SLEEPEntry选择睡眠模式唤醒方式是中断还是事件。

#define PWR_SLEEPEntry_WFI     //中断唤醒

#define PWR_SLEEPEntry_WFE     //事件唤醒

参数PWR_ STOPEntry 选择停止模式唤醒方式是中断还是事件。

#define PWR_STOPEntry_WFI         //中断唤醒

#define PWR_STOPEntry_WFE        //事件唤醒

STOP模式实例代码介绍

启动STOP模式

退出STOP模式后需要恢复系统时钟到运行模式

 

在唤醒中断函数中清除中断标志位

从测试工具中可以看到,当程序进入STOP模式后,等待60s被RTC唤醒程序继续运行。

文章评论