stm32不同系列芯片支持的低功耗模式各有差异,本文以F103系列芯片为例,简单讲解不同低功耗模式的特点和使用方法。
二、低功耗 简述默认情况下,系统或电源复位后,微控制器处于Run模式。当CPU不需要保持运行时(例如等待外部事件时),可以使用几种低功耗模式来节省电源。这取决于用户选择的模式,以提供低功耗、较短启动时间和可用的唤醒源之间的最佳折衷。
stm32f10xxx 设备有三种低功耗模式:
- 睡眠模式
这种模式会关闭cpu时钟,但是所有外设包括M3内核的外设(NVIC、SysTick等等)都不会受到影响,保持运行 - 停止模式
所有时钟都会关闭 - 待机模式
1.8供电区域断电
另外,mcu在运行模式(run)下也可以通过以下方式降低功耗:
- 降低系统时钟频率
- 关闭一些不使用的外设的时钟
上面这三种低功耗模式的具体描述可以看下面这个图,觉得阅读英文不方便的话请自行翻译,我觉得这更有助于你去理解这几个模式的特点。
下面这张表更好的汇总了各种低功耗模式的特点:
下面会简单介绍各种降低功耗的方法,包括run、sleep、stop、standby。
run模式下1、Slowing down system clocks(run模式下降低功耗)
run模式下,我们可以通过对预分频器编程来降低系统时钟(SYSCLK, HCLK, PCLK1, PCLK2);
在进入sleep模式之前,我们也可以对预分频器编程来降低外设时钟。
详细请查阅RCC_CFGR寄存器,这里不展开描述。
2、 Peripheral clock gating(外围时钟门控)
在Run模式下,每个外设和存储器的HCLK和PCLKx可以随时停止,以降低功耗。
在sleep模式下,在执行WFI或者WFE内核指令之前我们可以关闭一些不需要使用的外设时钟来进一步降低功耗。
通过执行WFI (Wait For Interrupt)或WFE (Wait For Event)指令进入Sleep模式。根据Cortex®-M3系统控制寄存器中的SLEEPONEXIT位,有两种选项可用于选择Sleep模式进入机制:
-
Sleep-now:如果清除SLEEPONEXIT位,则在执行WFI或WFE指令时,MCU马上进入Sleep模式。
-
Sleep-on-exit:如果设置了SLEEPONEXIT位,则MCU在退出最低优先级ISR时进入Sleep模式。
在休眠模式下,所有I/O引脚保持与运行模式相同的状态。
如果使用WFI指令进入睡眠模式,任何被NVIC确认的外设中断都可以从睡眠模式唤醒设备。
如果使用WFE指令进入Sleep模式,则在事件发生时,MCU将立即退出Sleep模式。唤醒事件可以通过以下任意一种方式产生:
-
在外设控制寄存器中启用中断,但在NVIC中不启用,并在Cortex®-M3系统控制寄存器中启用SEVONPEND位。当MCU从WFE恢复时,必须清除外设中断悬挂位(pending)和外设NVIC IRQ通道悬挂位(pending)(在NVIC中断清除悬挂寄存器中)。
-
在事件模式下配置外部或内部EXTI line。当CPU从WFE恢复时,由于事件行对应的挂起位没有设置,不需要清除外设中断挂起位或NVIC IRQ通道挂起位。
所有进入和退出休眠的细节汇总成以下表格:
停止模式是基于Cortex®-M3深度睡眠模式结合外围时钟门控。电压调节器可以配置在普通模式或低功率模式。
在停止模式下,1.8 V域中的所有时钟都停止,锁相环、HSI和HSE RC振荡器都被禁用。SRAM和寄存器的内容被保留。
在停止模式下,所有I/O引脚保持与运行模式相同的状态。
进入停止模式- 为了进一步减少功耗,可以设置电压调节器工作在低功耗模式,这需要配置PWR_CR的LPDS位。
- 如果闪存编程正在进行,停止模式的进入将被延迟,直到内存访问完成。
- 如果对APB域的访问正在进行,停止模式的进入将延迟到对APB的访问完成。
在停止模式下,可以通过编程单个控制位来选择以下特性:
- Independent watchdog (IWDG)
- Real-time clock (RTC)
- Internal RC oscillator (LSI RC)
- External 32.768 kHz oscillator (LSE OSC)
此外,ADC或DAC在停止模式下也会消耗电能,除非他们在进入停止模式之前被禁用。
要禁用它们,ADC_CR2寄存器中的ADON位和DAC_CR寄存器中的ENx位必须都写为0。
当通过发出中断或唤醒事件退出Stop模式时,HSI RC振荡器被选为系统时钟。
当电压调节器在低功率模式下运行时,当从停止模式唤醒时,会产生额外的启动延迟。通过在停止模式期间保持内部调节器(这里是指电压调节器)处于ON状态,虽然减少了启动时间,但消耗更高。
下图汇总了停止模式进入和退出的细节信息。
注意:
- 在进入停止模式之前,要清除所有中断挂起位,如上图所述。
- 唤醒之后记得要重新配置系统时钟。
“待机”模式可以实现最低的功耗。它基于Cortex®-M3深度睡眠模式,禁用电压调节器。导致1.8 V域下电。锁相环、HSI振荡器和HSE振荡器也处于关闭状态。除了备份域和备用电路中的寄存器外,SRAM和寄存器的内容都会丢失。
进入待机模式在待机模式下,可以通过编程单个控制位来选择以下特性:
- Independent watchdog (IWDG)
- Real-time clock (RTC)
- Internal RC oscillator (LSI RC)
- External 32.768 kHz oscillator (LSE OSC)
当外部复位(NRST引脚)、IWDG复位、WKUP引脚上升沿或RTC告警上升沿发生时,微控制器退出待机模式。
除电源控制/状态寄存器(PWR_CSR)外,所有寄存器都在Standby唤醒后重置。
从待机模式唤醒后,程序跟复位后一样重新启动。电源控制/状态寄存器(PWR_CSR)中的SBF状态标志表示MCU处于待机模式。所以程序重新运行后我们可以读取这个状态标志SBF来判断是否从待机模式唤醒。
下图汇总了待机模式进入和退出的细节信息。
注意:
在待机模式下,所有I/O引脚都是高阻态的,除了:
- 复位引脚(仍可用)
- 干预引脚,如果配置为干预或校准输出
- WKUP引脚,如果使能了
调试模式
默认情况下,如果应用程序在调试功能使用时将MCU置于停止或待机模式,调试连接将丢失。这是因为Cortex®-M3内核停止工作了。
但是,通过在DBGMCU_CR寄存器中设置一些配置位,即使正在使用低功耗模式,也可以对软件进行调试。
核心不允许在调试会话期间关闭FCLK或HCLK。因为这些是调试器连接所需的,所以在调试期间,它们必须保持活动状态。单片机集成了特殊的方法,允许用户在低功耗模式下调试软件。为此,调试器主机必须首先设置一些调试配置寄存器来改变低功耗模式的行为:
-
在Sleep模式下,DBGMCU_CR寄存器的DBG_SLEEP位必须事先由调试器设置。这将提供给HCLK与提供给FCLK相同的时钟(系统时钟以前由软件配置)。
-
在停止模式下,DBG_STOP位必须由调试器预先设置。这将
使内部RC振荡器时钟在停止模式下供给FCLK和HCLK。
这里不开展描述,有兴趣请参考相关用户手册。
从低功耗模式自动唤醒(AWU)RTC可以用来从低功耗模式唤醒MCU,而不依赖外部中断(自动唤醒模式)。
RTC提供了一个可编程的时间基准,从停止或待机模式在定期间隔唤醒。
为此,可以通过对备份域控制寄存器(RCC_BDCR)中的RTCSEL[1:0]位进行编程来选择三个RTC时钟源中的两个,如下图:
-
32.768 kHz外部晶体振荡器(LSE OSC)。该时钟源提供了精确的时间基准,功耗极低(典型情况下增加不超过1µa)。
-
RC内部振荡器(LSI RC)。该时钟源具有节省32.768 kHz晶体成本的优点。这种内部RC振荡器的设计是为了增加最小的功耗。
要使用RTC闹钟事件从Stop模式唤醒,需要:
1、将EXTI Line 17设置为对上升沿敏感
2、配置RTC产生RTC闹钟
从Standby模式中唤醒,不需要配置EXTI Line 17。
下面汇总一些各个低功耗模式的特点和使用方法:
本文简单介绍了STM32F1系列低功耗模式的特点和使用方法,使本人加深了对这些低功耗模式涉及的对象的理解,便于后续的低功耗设计和应用。
好记性不如烂笔头。
参考手册
datasheet
编程手册