现代的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 = 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位。