无论嵌入式系统是使用电池运行还是连接到电网,设计绿色系统并最大限度地降低能耗是大多数系统的常见要求。现代嵌入式系统中最大的能源消费者之一是微控制器,并且了解如何最小化其能耗是至关重要的。即使您查看单个微控制器系列,每个处理器架构的低功耗也会略有不同。在这篇文章中,我们将介绍Arm Cortex-M处理器内核中的基本低功耗模式以及如何使用它们。
基本的低能量模式
每个基于Arm Cortex-M处理器的微控制器至少具有三种电源模式; 跑步,睡眠和深度睡眠。显然,运行模式是处理器完全上电并执行嵌入式系统设计的所有操作。休眠模式将暂停CPU时钟,但会使系统时钟,闪存和外设时钟运行。深度睡眠模式不仅会停止CPU时钟,还会关闭系统时钟,闪存和PLL。
微控制器供应商能够完全定制其低功耗模块,以提供不同程度的低功耗。重要的是要注意微控制器进入睡眠时间越深,完全关闭就越接近。这一点很重要,因为当您使用越来越深的睡眠模式时,为微控制器供电并开始执行指令所需的时间会急剧增加。一些提供非常深的功耗模式的处理器需要与处理器引导序列相同的时间才能再次运行。根据您的应用程序,这可能会对系统的实时性能产生重大影响。
进入低功耗模式
开发人员可以使用两种不同的指令将系统置于低功耗状态;等待事件(WFE)和等待中断(WFI)。执行WFE指令时,它会检查系统控制块(SCB)中事件位的值。如果未设置该位,则系统将进入睡眠模式。事件可以由外部源生成,也可以使用发送事件(SEV)指令生成。在大多数情况下,我见过或写过的99%的应用程序都使用了WFI指令。
当遇到WFI指令时,处理器将立即进入SCB中配置的低功耗休眠模式,除非有待处理的中断。一旦处理器处于休眠状态,它将在触发中断时唤醒。某些处理器甚至可能有一个可选的唤醒中断控制器,它允许开发人员配置允许唤醒处理器的源。这为开发人员提供了更精细的控制,使他们的系统能够保持最低功耗睡眠模式的时间。
进入所需睡眠模式的C代码非常简单。在大多数开发环境中需要做的就是编写以下代码行:
__WFI;
如果您正在使用CMSIS,您还可以通过编写以下内容来调用WFI函数:
__WFI();
现在您可能想知道如何配置输入的低功耗模式。在SCB寄存器中有一个SLEEPDEEP位,如果设置为1将使处理器进入深度睡眠模式。如果该位清零,则处理器将进入休眠模式。正如我之前提到的,硅片供应商通常会增强睡眠模式,因此还需要根据设计微控制器的人员来配置其他寄存器。
额外的低功耗功能
除了能够进入低功耗模式之外,还有另一个有趣的低功耗模式功能,称为Sleep-On-Exit。Sleep-On-Exit允许处理器在正在执行的中断完成后立即返回休眠状态。这允许开发人员通过避免主应用程序和中断之间不必要的上下文切换来节省时间,并且在这种情况下时间是能量。允许处理器在中断时唤醒,执行必要的工作然后返回休眠状态。
结论
Cortex-M处理器的低功耗模式是降低嵌入式系统使用的能耗的主要关键之一。正如我们所看到的,开发人员可以使用WFI指令将系统置于低功耗模式,然后一旦触发了先前配置的唤醒事件或中断,系统就会唤醒。每个微控制器供应商都能够自定义其功耗模式,我们将看到具有三种默认功耗模式的微控制器,通过具有十几种功耗模式和复杂状态机的部件,可以简化处理器从一种模式移动到下一种模式的方式。