可以控制到多低(功率)?
可以控制到多低(功率)?
How low (power) can you go?
在我的上一篇文章“Arm Cortex-M低功耗模式基础知识”中,我们探讨了在每个Arm Cortex-M处理器上都可以找到的低功耗模式的基本原理,以及如何利用WFI和WFE指令使处理器进入休眠状态。但真正的问题是这些低功耗模式是如何在一个真正的微控制器上实现的,以及这些模式如何影响我们的嵌入式系统?在这篇文章中,我们将更详细地探讨如何让微控制器进入睡眠状态,看看能给我们带来多少能量。
低功率模式实验
探索低功耗模式的最佳方法是选择一个微控制器,并在各种低功耗模式下实际运行处理器。在这篇文章中,我决定抹去我久经考验的NXP Kinetis-L Freedom board,我不仅用过它,还用在了许多产品、应用程序和课程中。我还决定,不管是对是错,不仅要测量微控制器消耗的能量,还要测量整个开发板。MCU通常是电路板上最耗电的设备之一,但我经常发现,测量整个系统的电流提醒我,它并不是电路板上唯一的能源消耗者。优化微控制器可以带你走很长的路,但它并不总是唯一需要能量优化的设备。
从基准测量开始
每当我在优化产品的能源消耗时,我首先从基准能量测量开始。这通常是通过分析几秒钟或几分钟内设备的电流消耗来完成的,以了解我们从何处开始。在我的开发板实验中,我让Kinetis-L处于运行模式,没有实现睡眠,所有外围设备都打开了,并设置板定期切换LED。使用带有I-Jet调试器和I-Scope的IAR Embedded Workbench,我能够为我的电路板描绘一个简单的基准,当LED熄灭时为16.9毫安,当LED亮起时为18.0毫安,如下图1所示。正如你所看到的,重要的是要注意你的测量从哪里来,否则你的分析可能会有很大的偏差。
Figure 1. A current measurement of the development board with an LED toggling once per second.
利用等待和深度睡眠模式优化能量
要想节省一些能量,最快的方法是实施等待或深度睡眠模式。对Kinetis-L处理器数据表的检查表明,在3伏电压下,等待模式在3.7到5.0毫安之间。在这种模式下,CPU和外围时钟被禁用,但闪存处于打瞌睡模式,允许处理器在中断时间范围内(12-15个时钟周期)唤醒。等待模式易于实现,进入等待模式的代码如下:
void Sleep_Wait(void)
{
SCB_SCR &=~ SCB_SCR_SLEEPDEEP_MASK;
asm(“WFI”);
}
只有这两行代码,开发板的电流消耗从18.0毫安下降到15.9毫安。现在的消费量下降了11.6%!如果主板由680毫安的电池供电,那么该设备的电池寿命将从37.8小时延长到42.8小时!只需两行代码就可以增加5个小时!
这些高级功率模式的优点在于我们可以轻松地将这一点再进一步。我们可以使用以下代码将处理器转入深度休眠等待模式,而不是将处理器置于等待模式:
void Sleep_Deep(void)
{
SCB_SCR |= SCB_SCR_SLEEPDEEP_MASK;
asm(“WFI”);
}
我们所做的只是调整SCB_SCR寄存器中的一个位,现在我们已经从原来的18毫安电流消耗变为14.8毫安。现在的消费量下降了17.8%!同样,假设主板由680毫安的电池供电,电池寿命将从37.8小时延长到46小时!只需几行代码就可以节省大量成本,这只是冰山一角!
利用停机和VLLS模式进行uA电流消耗
使用停止模式有可能通过禁用核心和系统时钟进一步降低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-2毫安的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 us加上中断延迟。还不错。然而,如果我使用Kinetis-L上的VLLS模式之一,我将有一个启动处理器的唤醒延迟加上另外53到115微秒!这可能是不可接受的,具体取决于应用程序。图2显示了Kinetis-L上从低功耗模式到运行状态的其他转换。
Figure 2. Transition times from low power modes to various modes on the Kinetis-L.
结论
Arm微控制器都有标准的低功耗模式,但是每个硅晶片厂商都定制了低功耗模式,供开发者使用。正如我们所看到的,硅晶片供应商通常提供几种模式,它们可以作为低挂起的水果,对唤醒延迟的影响最小。它们还提供了几种非常低功耗的模式,几乎可以关闭处理器,只需要几百微安或更少!开发人员通常需要平衡他们想要的能量和他们需要系统以多快的速度唤醒和响应事件。这种取舍肯定是特定于应用程序的,所以不要指望能够在每个产品和应用程序上运行最低功耗模式。