CPU|嵌入式开发:Arm Cortex-M低功耗模式基本原理

CPU|嵌入式开发:Arm Cortex-M低功耗模式基本原理

无论嵌入式系统是使用电池运行还是连接到电网 , 设计一个绿色且能耗最低的系统是大多数系统的共同要求 。 现代嵌入式系统中最大的能源消耗者之一是微控制器 , 了解如何将其能源消耗降至最低至关重要 。 每个处理器体系结构都将具有略微不同的低功耗功能 , 即使是在单个微控制器系列中 。 在这篇文章中 , 我们将介绍ArmCortex-M处理器核心的基本低功耗模式 , 以及嵌入式开发人员如何使用它们 。
基本低能模式
基于ArmCortex-M处理器的每个微控制器将至少具有三种电源模式;跑步 , 睡觉 , 深度睡眠 。 显然 , 运行模式是处理器完全通电并执行嵌入式系统设计的所有操作 。 睡眠模式将停止CPU时钟 , 但将使系统时钟、闪存和外围时钟保持工作状态 。 深度睡眠模式不仅会停止CPU时钟 , 还会关闭系统时钟、闪存和PLL 。
微控制器供应商能够完全定制其低功耗模块 , 以提供不同程度的低功耗 。 例如 , NXPKinetis-L处理器不仅具有标准Cortex-M低功耗模式 , 还具有低泄漏睡眠模式和极低泄漏睡眠模式等模式 , 这些模式仅消耗微安或纳安的电流 。
需要注意的是 , 微控制器进入睡眠状态越深 , 就越接近完全关闭 。 实现这一点很重要 , 因为嵌入式开发人员使用越来越深的睡眠模式时 , 微控制器启动和开始执行指令所需的时间可能会急剧增加 。 一些提供深度电源模式的处理器需要与处理器引导序列相同的时间才能再次运行 。 根据你的应用程序 , 这可能会对系统的实时性能产生重大影响 。

进入低功耗模式
开发人员可以使用两种不同的指令将系统置于低功耗状态;等待事件(WFE)和等待中断(WFI) 。 当执行WFE指令时 , 它检查系统控制块(SCB)中事件位的值 。 如果未设置该位 , 则系统将进入睡眠模式 。 事件可以由外部源或使用SendEvent(SEV)指令生成 。 在大多数情况下 , 我看到或编写的应用程序中99%都使用了WFI指令 。
当遇到WFI指令时 , 处理器将立即进入SCB中配置的低功耗休眠模式 , 除非有挂起的中断 。 一旦处理器进入休眠状态 , 它将在触发中断时唤醒 。 一些处理器甚至可能有一个可选的唤醒中断控制器 , 允许开发人员配置允许唤醒处理器的源 。 这为嵌入式开发人员提供了更精细的控制 , 可以控制系统在最低功耗睡眠模式下保持多长时间 。
进入所需睡眠模式的C代码非常简单 。 在大多数开发环境中 , 只需编写以下代码行:
__WFI;
如果你使用的是CMSIS , 你也可以通过编写以下命令来调用WFI函数:
__WFI();
现在你可能想知道如何配置进入的低功耗模式 。 在SCB寄存器中有一个SLEEPDEEP位 , 如果设置为1 , 将使处理器进入深度睡眠模式 。 如果位被清除为0 , 处理器将进入睡眠模式 。 正如我前面提到的 , 硅供应商通常会增强睡眠模式 , 因此还需要根据微控制器的设计人员配置额外的寄存器 。
额外的低功耗功能
除了能够进入低功耗模式外 , 还有另一个有趣的低功耗模式功能 , 称为退出时睡眠 。 退出时睡眠允许处理器在执行的中断完成后立即返回睡眠状态 。 这允许嵌入式开发人员通过避免在主应用程序和中断之间进行不必要的上下文切换来节省时间 , 在这种情况下 , 时间就是能量 。 允许处理器在中断中唤醒 , 完成必要的工作 , 然后返回睡眠状态 。
结论
【CPU|嵌入式开发:Arm Cortex-M低功耗模式基本原理】Cortex-M处理器上的低功耗模式是降低嵌入式系统能耗的主要关键之一 。 正如我们所看到的 , 嵌入式开发人员可以使用WFI指令将其系统置于低功耗模式 , 一旦触发先前配置的唤醒事件或中断 , 系统将立即唤醒 。 每个微控制器供应商都能够定制其电源模式 , 我们将看到微控制器在整个过程中只有三种默认电源模式 , 包括十几种电源模式和复杂的状态机 , 以便于处理器从一种模式移动到下一种模式 。