0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

如何让MCU进入睡眠状态节省能耗?

jf_pJlTbmA9 来源:jf_pJlTbmA9 作者:jf_pJlTbmA9 2023-08-04 14:27 次阅读

在我的上一篇文章《ARM Cortex-M低功耗模式基本原理》中,我们探讨了在每种Arm Cortex-M处理器上可以找到的低功耗模式的基本原理,以及如何使用WFI和WFE指令让处理器进入睡眠模式。实际上我们真正要了解的是,低功耗模式如何在真正的微控制器上实现?这些模式是如何影响嵌入式系统的?在这篇文章中,我们将更详细探讨如何让微控制器进入睡眠状态并看看到底能够节省多少能耗。

低功耗模式实验

探索低功耗模式的最佳方法是选择一个微控制器并以各种低功耗模式实际运行该处理器。本文中,我决定翻出积尘已久的NXP Kinetis-L Freedom电路板,我曾经不仅用它进行过实验,而且还应用于许多产品、应用和课程。无论对错,我决定不仅要测量微控制器的能耗,还要测量整个开发板的能耗。MCU通常是电路板上的耗能大户之一,但测量整个系统的电流经常提醒我它并不是电路板上唯一的耗电器件。微控制器的优化长路迢迢,但其实它并不是唯一需要优化能耗的器件。

从基线测量开始

每当我努力优化一个产品的能耗时,我首先会从基线能量测量开始。通常我会通过分析几秒或几分钟内设备的电流消耗来了解应该从哪里开始。在我的开发板实验中,将Kinetis-L置于运行模式,无睡眠模式,所有外设均运行并设置电路板定期切换LED。通过采用IAR嵌入式工作台的I-Jet调试器以及I-Scope,我可以为该电路板配置一个简单基线,即LED关闭时电流消耗大约为16.9mA,LED打开时大约为18.0mA,如图1所示。显然,从哪里开始进行测量很重要,否则分析结果可能明显偏离。

wKgZomS-QmCADFF0AAFAKz9joVg342.png

图1:开发板的电流测量,LED每秒切换一次。 (来源:作者)

采用等待模式和深度睡眠模式优化能耗

节省能耗最快的方法是执行等待或深度睡眠模式。研究Kinetis-L处理器的数据表可以得出,等待模式的能耗在3伏电压下的电流介于3.7和5.0mA之间。在此模式下,CPU和外设时钟被禁用,而闪存处于休眠模式,此时允许处理器在中断时间范围内(12-15个时钟周期)仍然可以被唤醒。等待模式易于实现,设置进入等待模式的代码如下所示:

void Sleep_Wait(void)
{
SCB_SCR &=~ SCB_SCR_SLEEPDEEP_MASK;
asm(“WFI”);
}

只需这两行代码,开发板的电流消耗就从18.0mA降至15.9mA。电流消耗减少了11.6%! 如果电路板由680mA电池供电,则该设备的电池寿命将从37.8小时变为42.8小时!两行代码就可以将电池寿命延长五小时!

这些高级电源模式的好处在于我们可以轻松地再向前迈一步。我们可以使用以下代码将处理器置于深度睡眠等待模式,而不仅仅是等待模式:

void Sleep_Deep(void)
{
SCB_SCR |= SCB_SCR_SLEEPDEEP_MASK;
asm(“WFI”);
}

我们所做的仅仅是调整了SCB_SCR寄存器中的一位,就已经将最初的18mA电流消耗减少为14.8mA。电流消耗减少了17.8%!同样,假设电路板由680mA电池供电,电池寿命现在已经从37.8小时增长为46小时!只需几行代码就可以节省大量能耗,而这只是冰山一角!

利用Stop模式和VLLS模式实现微安级电流消耗

采用停止模式可以禁用内核和系统时钟,这有可能将MCU电流消耗再进一步降低两毫安。 你会发现,功耗模式越低,实现它所需的代码就越多,而唤醒系统恢复工作的代码就越复杂。令Kinetis-L进入停止模式的代码如下所示:

void Sleep_Stop(void)
{
volatile unsigned int dummyread = 0;
SMC_PMCTRL &=~ SMC_PMCTRL_STOPM_MASK;
SMC_PMCTRL |= SMC_PMCTRL_STOPM(0);
dummyread = SMC_PMCTRL;
Sleep_Deep();
}

请注意,停止模式通过电源管理控制寄存器控制,一旦状态被设置,就会调用Sleep_Deep函数来完成电源模式的设置并执行WFI。

到目前为止,我们一直在谈论1~2mA的MCU能耗。现代微控制器将提供仅消耗微安甚至毫微安的电源模式!Kinetis-L处理器于2013年左右首次亮相,其超低漏电停止(VLLS)模式仅耗能135至496微安!初始化此电源模式的代码如下所示:

void Sleep_VLLS1(void)
{
volatile unsigned int dummyread = 0;
SMC_PMCTRL &=~ SMC_PMCTRL_STOPM_MASK;
SMC_PMCTRL |= SMC_PMCTRL_STOPM(0x4);
SMC_VLLSTRL = SMC_VLLSCTRL_LLSM(1);
dummyread = VLLS_CTRL;
Sleep_Deep();
}
讲到这里,你会发现微控制器已经几乎不消耗任何能量了!

低功耗模式对唤醒延迟的影响

正如我们目前所看到的那样,将处理器设置为越来越低的电源模式是节省能源的好方法,但这是需要付出代价的。处理器的能量状态越低,唤醒处理器恢复工作所需的时间就越长。例如,如果我使用标准停止模式,则处理器被唤醒并再次开始执行代码需要2μs加上中断延迟,这还可以接受。但是,如果在Kinetis-L上设置了其中一种VLLS模式,将需要启动处理器的唤醒延迟再加上额外的53到115微秒!有些应用可能无法接受这种状况。图2显示了Kinetis-L从低功耗模式到运行状态的各种转换。

wKgZomS-QnCAMYslAAJFdiVdxsw521.png

图2:Kinetis-L从低功耗模式到各种模式的转换时间。 (来源:Kinetis-L数据表)

结论

Arm微控制器都具有标准的低功耗模式,但每个芯片厂商都会定制开发人员可用的更多低功耗模式。正如我们所看到的,芯片供应商通常会提供几种容易实现的模式,对唤醒延迟的影响最小。他们还会提供几种超低功耗模式,几乎可以关闭处理器并且仅消耗几百微安或更少能量!开发人员通常需要在能耗和系统被唤醒需要的时长以及响应事件的速度之间进行权衡。而权衡一定是基于应用的,所以不要指望能够在每个产品和应用上都执行最低功耗模式。

审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • mcu
    mcu
    +关注

    关注

    146

    文章

    16984

    浏览量

    350244
  • 电路板
    +关注

    关注

    140

    文章

    4903

    浏览量

    97376
  • 低功耗
    +关注

    关注

    10

    文章

    2362

    浏览量

    103583
收藏 人收藏

    评论

    相关推荐

    cc2650如何在使能串口同时,设备进入睡眠模式?

    本帖最后由 冒汗的心情 于 2016-3-29 11:47 编辑 cc2650如何能在使能串口的同时,其设备完全进入睡眠模式?使能串口后不能完全进入睡眠,只能
    发表于 03-29 11:45

    STM8AF52AATCY如何控制器进入睡眠模式

    尊敬的先生/女士,如何控制器进入睡眠模式。您能否给我信息或发送给我任何源代码链接。在这里,我使用halt()进入睡眠状态;禁用外围设备的模式,但我在想是否还有其他配置需要做。请建议我
    发表于 01-07 16:14

    如何MCU进入睡眠状态节省能耗

    如何使用WFI和WFE指令处理器进入睡眠模式。实际上我们真正要了解的是,低功耗模式如何在真正的微控制器上实现?这些模式是如何影响嵌入式系统的?在这篇文章中,我们将更详细探讨如何微控制器进入
    发表于 08-15 13:24

    请问CC2530进入睡眠状态时看门狗能起作用吗?

    CC2530使用睡眠定时器,在进入睡眠状态看门狗能起作用吗?会不会冲突?比如说系统睡眠5分钟,看门狗要怎么设置?在哪里喂狗?(新人,对看门狗不怎么了解)
    发表于 08-19 02:01

    STM32F429进入睡眠的方式

    睡眠进入睡眠的方式很简单:只需要调用WFI 或WFE 命令,在睡眠模式中,内核停止,但是所有外设,包括M4 核心的外设均处于工作状态中。唤醒睡眠
    发表于 08-11 06:38

    如何NY8A054D进入睡眠模式?

    如何NY8A054D进入睡眠模式?
    发表于 09-27 06:02

    如何微控制器进入睡眠状态并看看到底能够节省多少能耗

    ?这些模式是如何影响嵌入式系统的?在这篇文章中,我们将更详细探讨如何微控制器进入睡眠状态并看看到底能够节省多少能耗。在我的上一篇文章《AR
    发表于 11-04 07:39

    RTX使用RTC1中断导致频繁唤醒,无法进入睡眠状态怎么解决?

    RTX使用RTC1中断导致频繁唤醒,无法进入睡眠状态怎么解决?
    发表于 02-23 07:21

    如和STM8S与STM8L安全地进入睡眠状态呢?

    评估期间设置标志,并且存在风险,即 MCU 会在升起一些标志的情况下进入睡眠状态。是否有任何机制如何 STM8S(可能还有 STM8L)安全地睡眠
    发表于 12-08 06:12

    STM32L071CB如何MCU进入睡眠状态呢?又是如何唤醒它的呢?

    MCU 需要设置为睡眠模式以最小化功耗。到现在为止,除了将 MCU 设置为睡眠模式之外,其他一切都已正确完成。但是我不清楚如何
    发表于 12-09 08:10

    请问s32k3 mcu进入睡眠模式后flexcan可以工作吗?

    s32k3 mcu进入睡眠模式后flexcan可以工作吗?客户希望通过 flexcan 唤醒 MCU
    发表于 03-23 07:58

    如何Arduino进入睡眠状态

    子,Uno在清醒时使用30-40 mA,在睡眠时使用约19 mA。 Pro Mini在唤醒时使用25mA,在睡眠时使用0.57 mA。由于每个mA在连接到电池时都很重要,你可以看到没有比赛,Arduino Pro Mini是赢家。
    的头像 发表于 08-26 08:54 1w次阅读

    32 系统进入stop模式_如何MCU进入睡眠状态节省能耗

    ?这些模式是如何影响嵌入式系统的?在这篇文章中,我们将更详细探讨如何微控制器进入睡眠状态并看看到底能够节省多少能耗。在我的上一篇文章《AR
    发表于 11-01 16:08 5次下载
    32 系统<b class='flag-5'>进入</b>stop模式_如何<b class='flag-5'>让</b><b class='flag-5'>MCU</b><b class='flag-5'>进入睡眠</b><b class='flag-5'>状态</b><b class='flag-5'>节省</b><b class='flag-5'>能耗</b>?

    如何阻止电脑进入睡眠或者休眠

    通常我们使用电脑过程中会设置多长时间不操作,电脑就会灭屏、睡眠甚至是休眠。如果电脑进入睡眠或者休眠模式,电脑运行的程序将不再执行。如果我们设计的桌面程序一直在执行某种操作,比如持续的USB通信,操作人可能会离开很久,这个时候,我们不希望电脑
    的头像 发表于 02-28 14:30 2598次阅读

    如何MCU进入睡眠状态,看到底能节省多少能耗

    产品、应用和课程。无论对错,我决定不仅要测量微控制器的能耗,还要测量整个开发板的能耗MCU通常是电路板上的耗能大户之一,但测量整个系统的电流经常提醒我它并不是电路板上唯一的耗电器件。微控制器的优化长路迢迢,但其实它并不是唯一
    的头像 发表于 07-24 17:21 1158次阅读
    如何<b class='flag-5'>让</b><b class='flag-5'>MCU</b><b class='flag-5'>进入睡眠</b><b class='flag-5'>状态</b>,看到底能<b class='flag-5'>节省</b>多少<b class='flag-5'>能耗</b>?