一.MCU耗能因素
现代的MCU一般使用CMOS技术,耗能包括2种,静态消耗和动态消耗。
总电能消耗=静态消耗+动态消耗,
即:IDD=f×IDynamicRun[uA/MHz]+IStatic[uA].
静态消耗:主要是晶体管消耗能量;
因此,电能消耗依赖于:
1.MCU芯片尺寸 或者说晶体管的数目;
2.MCU供电电压 降低电压可以成平方级别地降低电能消耗;
3.时钟频率 可以把时钟频率降低到刚好满足应用需要;
4.外设数目,使能的外设越多,耗能越大;
5.运行模式 合理选择工作模式可以大幅节能,如,全速工作极短时间后进入睡眠模式
二.节能方法
1.关闭不需要使用的外设;
2.所有未使用的引脚必须连接到一个确定的逻辑电平;
3.当有外设必须保持激活时,使用Wait模式来获得低功耗;
4.使用合适的VDD值;
5.尽可能地使用低功耗运行模式;
6.如果不能使用低功耗模式,那就将主频降低到满足应用的最小值;
7.如果可能,使用动态控制I/O引脚的上拉功能。
三.低功耗模式
支持低功耗的MCU一般都有好几种运行模式,以ST公司的STM8L为例,它支持5种低功耗模式:
等待、低功耗运行、低功耗等待、主动停止、停止模式。
表1:STM8L低功耗运行模式:每一种模式的进入方式,节能级别和外设工作要求
模式 | 等待模式(wait) | 低功耗运行 | 低功耗等待 | 主动停止 | 停机模式 | |
入口 | WF(I由中断唤醒) | WFE(则由事件唤醒) | 软件代码 | 软件代码+WFE | HALT | HALT |
晶振 | 开 | 开 | LSI或LSE | LSI或LSE | LSI或LSE | 关 |
CPU | 关 | 关 | 开 | 关 | 关 | 关 |
外设 | 开 | 开 | 开 | 开 | 关,仅RTC开 | 关 |
唤醒 | 所有内部和外部中断,复位 | 所有内部和外部中断,复位,唤醒事件 | 软件代码,复位 | 内部和外部事件,复位 | 外部中断,RTC中断,复位 | 外部中断,复位 |
电压调节器 | MVR | MVR | ULP | ULP | CLK_ICKCR | ULP |
程序执行区 | FLASH | FLASH | RAM | RAM | FLASH | FLASH |
FLASH+E2 | 开 | 开 | 关 | 关 | 关 | 关 |
中断 | 允许 | 允许 | 禁止 | 禁止 | 允许 | 允许 |
中断服务后 返回状态 | AL=0:main AL=1:WFI | WFE | / | / | AL=0:main AL=1主动停止 | AL=0:main AL=1:停止 |
事件处理后 返回状态 | / | Main | / | 低功耗运行 | / | / |
RAM+寄存器 | 保留 | 保留 | 保留 | 保留 | 保留 | 保留 |
@3V/25℃ | 5.9uA | 5.4uA | 3.3uA | 1.0uA | 0.4uA | |
特殊事项 | / | / | 禁止ADC | / | 清除外设悬挂中断标志位 |
单片机中的WFI/WFE指令
进入低功耗模式的两个指令,
WFI进入则可由任意中断唤醒,WFE进入则由事件唤醒
WFI = wait for interrupt 等待中断,即下一次中断发生前都在此hold住不干活
WFE = wait for event 等待事件,即下一次事件发生前都在此hold住不干活
执行这两条语句后CPU功耗会降低,通常用这两条语句来省电。
表2选择合理的STM8L节能模式
节能要求 | 应用场合 | 睡眠时长 | 唤醒方式 | 恢复时长 | 运行模式 |
苛刻 | CPU空闲,等待外部信号唤醒 | 长 | 外部中断 | ≥2.8us | HALT(停机模式) |
苛刻 | CPU空闲,等待时钟周期唤醒 | 长 | RTC周期 | ≥2.8us | Active-halt活跃停机模式 |
严格 | CPU有持续、微负荷任务运行 | / | / | ≥2.8us | 低功耗运行 |
严格 | CPU短暂等待中断发生 | 短 | 任意中断 | 短 | 等待中断 |
严格 | CPU短暂等待事件发生 | 短 | 注册事件 | 短 | 等待事件 |
需要 | CPU有持续、轻负荷任务运行 | / | / | / | 调整主频 |
简单地来说,就是:
1)wait(等待模式):时钟关闭、外设可用。通过中断、外部中断、复位,能退出本模式。
2)Active-halt(活跃停机模式):时钟关闭、外设关闭、RTC开启。通过RTC中断、外部中断、复位,能退出本模式。
3)Halt(停机模式)(功耗最低):时钟关闭、外设关闭。通过外部中断、复位,能退出本模式。
另外,上图同时说明了默认上电时是运行模式,在运行模式时可通过如下方法降低功耗:
1)降低时钟频率。
2)关闭没用的外设时钟。
3)(香瓜补充)无用的IO口配置为输出低。
四、调试低功耗的调试一般分为以下几个步骤:
答
1、休眠模式的设置;2、I/O口状态的配置;3、硬件电路的调试;4、各个功能之间的工作间隙。
五.进入低功耗模式与低功耗唤醒流程的具体步骤?
答:
1)进入低功耗模式的流程
①关闭外设时钟。
②所有IO设置为输出低(注意低电平使能的得设置为输出高)。
③初始化中断口的IO。
④时钟频率降至最低(2M)。
⑤打开中断总开关。
⑥调用停机模式的函数。
2)低功耗唤醒的流程
①初始化系统时钟。
②初始化用到的外设。
所有中断允许处理器从等待模式退出。只有重置或事件允许处理器从低功率等待模式退出。这种模式在低功率运行模式下执行WFE指令。一个事件的唤醒使系统回到低功率运行模式(参见更多细节)。只有外部和其他特定的中断允许处理器从停止和active暂停模式退出(请参阅中断,并在中断向量表中从主动暂停中唤醒。数据表)。当从停止模式中醒来时,当几个未决中断出现时,第一个中断中断服务只能是一种中断模式功能的中断。这是选择通过图30所示的决策过程。如果最高优先级的中断不能从停止模式唤醒设备,它将会被服务。如果有任何内部或外部中断(例如,在计时器中)发生中断指令正在执行,停止指令已经完成,但是中断调用了在停止指令完成后立即启动唤醒进程。在这种情况下MCU实际上是从暂停模式唤醒到运行模式,并有相应的延迟在数据表中指定的tWUH。在执行停止指令之前,用户程序必须清除任何未决的外围设备中断(在相应的外围配置中清除未决的中断寄存器)。否则,停止指令就不会执行,程序执行也不会执行仍在继续。
MCU激活级别是通过在cfggcr寄存器中编程AL位来配置的(参见全局配置寄存器(cfggcr))。这个钻头用于控制MCU的低功率模式。在非常低的功率应用中,MCU大部分时间都在wfi/暂停模式下,并被唤醒(通过中断)特定的时刻,以执行特定的任务。其中一些重复的任务是足够短的时间可以直接在ISR中进行处理(中断服务程序),而不是继续回到主程序。为了解决这个问题,你可以在进入低之前设置AL位电源模式(通过执行wfi/停止指令)。因此,中断例程使设备恢复到低功率模式。然后中断例程直接返回到低功耗模式。由于寄存器的事实,运行时/isr的执行减少了上下文只在第一次中断时保存。因此,所有的操作都可以在非常简单的应用程序中在ISR中执行。在更复杂的,中断例程可以通过简单的重置重新启动主程序美联。例如,一个应用程序可能需要被自动唤醒单元(AWU)唤醒。每隔50毫秒,就可以检查一些针/传感器/按钮的状态。大部分的时间,因为这些大头针不活跃,MCU可以在不运行的情况下返回到低功率模式主程序。如果其中一个大头针是活动的,ISR就会决定启动主程序通过重置AL位。