[CortexM0--stm32f0308]Low Power Mode

问题描述

stm32f0308正常是运行在Run mode下,这种mode是在reset之后的默认模式。Low Power Mode,即低功耗模式,用于在IC空闲时可以考虑选择进入,使系统耗能降低,在必要的时候通过唤醒在进入Run mode正常工作。Low Power Mode,在嵌入式系统中考虑的很多,也很关键,因为一般都是用移动电源供电,合理使用Low Power Mode,会很好的提高设备的续航能力。

Low Power Mode方式

  1. Sleep Mode:CPU时钟关闭,所有peripheral时钟运行;
  2. Stop Mode:所有时钟均停止;
  3. Standby Mode:1.8 V domain power-off,这里domain power-off应当是相当于关闭了给IC供电的电源。
    另外,如果在Run Mode下,也可以通过如下手段来降低功耗:
  4. 降低System Clock的速度,即通过Clock的配置,利用分频的作用,将系统Clock从最高的48MHz降低,这部分的配置可以参考Clock相关文档或文章;
  5. 当不使用APB或AHB peripheral时,使用门控时钟的方式。在peripheral配置使用时,一般会先通过RCC_AH/PBClockCmd(xx,Enable)之类的接口来使能peripheral时钟,有时候,可能这个peripheral并没有再使用了,那可以通过RCC_AH/PBClockCmd(xx,Disable)的接口将其关闭,也可以省些电。这里的RCC_AH/PBClockCmd()是stm32的固件库中提供的,需要了解细节的可以看下stm32固件库,其中主要是通过对RCC_APBENR和RCC_AHBENR register操作来使能/禁止某项peripheral的时钟的。
    几种Low Power Mode的比较如下:
    这里写图片描述

Sleep Mode

如何进入Sleep Mode?

执行WFI (Wait For Interrupt) 指令或WFE (Wait for Event)指令。进入Sleep Mode的机制可以通过Cortex-M0 System Control register的SLEEPONEXIT bit来选择:
6. Sleep-now:SLEEPONEXIT bit置零,在WFI/WFE指令执行之后立即进Sleep Mode;
7. Sleep-on-exit:SLEEPONEXIT bit置1,在MCU退出了最低优先级的ISR之后,即系统没有任何ISR在处理时,就会进入Sleep Mode。

如何退出Sleep Mode?

退出Sleep Mode的方式和使用的进入Sleep Mode的指令WFI和WFE有关,使用WFI进入Sleep Mode,任何中断的发生都会导致退出Sleep Mode,而WFE指令进入的Sleep Mode,在event发生时会退出Sleep Mode,对于WFE指令进入Sleep Mode的方式,需要使用如下两种方式配置其退出Sleep Mode:
8. 使能一个peripheral中断(非NVIC中断),使能Cortex-M0 System Control register的SEVONPEND bit,当MCU从WFE Sleep Mode醒来时,需要清掉peripheral interrupt pending bit和peripheral NVIC IRQ channel pending bit ;
9. 配置一个外部或内部EXTI line为event模式。

Sleep Mode进入退出场景比较

这里写图片描述
这里写图片描述

Stop Mode

比Sleep Mode更进一步,IC内部Clock应当都停止了,SRAM和register,IO口状态是保持在上一刻进入Stop Mode时的状态。

Stop Mode进出场景比较

这里写图片描述

Standby Mode

比Stop Mode更省电,SRAM和register只有部分维持数据(需看下register表,应当有标明为Standby Circuitry的)。

Standby Mode进出场景比较

这里写图片描述
在上面的Stop Mode和Standby Mode中, 貌似IWDG,RTC,LSI和LSE还是由这几个peripheral各自的register编程设定而受控制的,因为即使是进入了Low Power Mode,RTC的功能还是需要的,因为要计时,这很重要。

Low Power Mode下的debug问题

因为进入Stop Mode和Standby Mode后,Cortex M0其实已经停止了(Clock关闭了),因此用swd此时应当是没办法debug的,不过stm32f0308的资料说,通过设置DBGMCU_CR register的一些配置,还是可以debug的,但是没有进一步详细的说明了……不过,对于stm32f0308这颗IC,貌似在进入Low Power Mode后,也没必要去debug,因为Stop Mode和Standby Mode本来就没有代码在执行了,除非是stm自己在开发和验证IC时,可能需要做些debug,所以这里对使用者来说,应当没有什么所谓了。

Low Power Mode的RTC唤醒方式

RTC alarm方式可以用来唤醒Stop mode和Standby Mode,RTC时钟源可以选择LSE,也可以是LSI,这两个低速时钟都适合用于低功耗的。
对于RTC alarm唤醒Stop Mode,需要:
10. 配置EXTI line 17为上升沿;
11. 配置RTC可产生RTC alarm。
对于RTC alarm唤醒Standby Mode,则只需要RTC可产生RTC alarm即可。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

技塑未来-苏导

你的鼓励是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值