MCU低功耗设计(二)实践
引言:
用电池供电的产品来说能耗是一个重大的问题,一旦电能耗尽设备将“罢工”。在《MCU低功耗设计(一)理论》中,我们介绍了节能的原理,本文用万用表和MCU电路板,真刀真枪地测试功耗值。简单,但绝对真实的测试数据,看看官方宣称低功耗与实测结果有多大差距,Let’s go!
说明:
博客的书写工具对于图片的编辑支持力度不够,喜欢本博文的读者可以从以下链接下载PDF版本的博文,那将是一个更好的排版文档。
http://download.csdn.net/detail/jiangjunjie_2005/8966291
一. 搭建测试环境
1.硬件平台:
选用“长沙市锐米通信科技有限公司(www.rimelink.com)”的无线通信模块iWL881A(下图左),考虑只测试MCU能耗,特地将无线电射频模块去除(下图右),MCU为ST公司超低功耗STM8L151C8T6。
2.软件平台:
开发平台选用IAR集成开发环境,它的具体型号如右图:
3.测试工具:
超高精度测低功耗,需要电池模拟器,那玩意可是RMB二十多万一台;老外(如Contiki之父Adam Dunkels)经常接100欧姆电阻,用示波器算积分,比较繁杂;我们使用最简单的办法,串联电流表,不要小看它,测量到uA的精度是可行的。测试环境搭建如下图所示
二. 低功耗模式下功耗测试
测试MCU低功耗比较科学的办法是,采用加法原则,即,首先测试最低工作状态下功耗,然后累加外设或I/O引脚,一步一步测试使能部件的功耗值。
为更好地测试STM8L151C8的功耗,我们写了一个C语言测试软件,它把MCU的5种低功耗运行模式都包括在内。当测试对应的运行模式时,只需要修改宏定义:#define MCU_MODE MODE_xxxxxx。
读者可以从以下链接直接下载该测试代码:
http://download.csdn.net/detail/jiangjunjie_2005/8959145
以下链接下载本博文的姊妹篇:《MCU低功耗设计(一)理论》
http://download.csdn.net/detail/jiangjunjie_2005/8957767
1.Halt功耗
将测试代码宏定义设置为:
#define MCU_MODE MODE_HALT
编译并烧录到MCU中,并电流表调整到2mA量程。可以看到,HALT模式下,功耗为0.4uA。
ST公司产品手册:Halt(400 nA)
看来,有信仰的民族(西欧基本都是基督教徒)更容易说真话呀!
2.Active-Halt功耗
将测试代码宏定义设置为:#defineMCU_MODE MODE_ACTIVE_HALT,编译并烧录到MCU中,电流表仍为2mA量程。可以看到,Active-Halt模式下,功耗为1.0uA和2.2uA,为什么会有2个值呢?
如果您看过本系列的第一篇博文《MCU低功耗设计(一)理论》,那就知道,较低的功耗(1.0uA)是Halt状态,而较高的功耗(2.2uA)是唤醒状态。为什么同样是停止,Active-Halt(1.0uA)比Halt(0.4uA)功耗要高呢?答案是,前者有一个38kHz的内部RC晶振在运行,它给RTC提供时钟源,它也需要电能哦!
ST公司产品手册:Active-halt with full RTC(1.4 uA)
如果我们把1.0uA和2.2uA简单地取个平均,那将是1.6uA,和官方数据还是接近吧。当然,要更精确测量,需要拿示波器记录唤醒时间的占空比,这个工作留给更严谨的后续者来完成吧(记得给读者发博文,科技报国,需要身体力行!)。
3.LowPowerWait功耗
将测试代码宏定义设置为:
#define MCU_MODE
MODE_LOW_POWER_WAIT,
可以看到功耗为:2.7uA。
ST公司产品手册:Low power wait(3 uA)
那个0.3uA可以算测试误差否?欢迎讨论。
4.LowPowerRun功耗
将宏定义设置为:
#define MCU_MODE
MODE_LOW_POWER_RUN
该模式下功耗为:4.6uA。
ST公司产品手册:Low power run(5.9 uA).
实测功耗比官方宣称功耗还低1.3uA。
我们一起看看该模式下MCU的工作原理。
①进入“Low power run”模式的代码序列:
l跳转到RAM;
l切换系统时钟到LSI或LSE;
l关闭高速晶振、ADC和没有使用的外设;
l屏蔽所有中断;
l关闭FLASH和EEPROM;(添加软件延时,确保关闭成功)
l配置低功耗电压调节器。
②退出“Low power run”模式的代码序列:
l打开主电压调节器;
l打开FLASH和EEPROM;
l使能所有中断;
l打开需要使用的外设,如有必要跳转到FLASH和EEPROM。
特别注意的是,Lowpower run模式下,MCU是从RAM(不是ROM)取指令解析执行,因为需要将该代码段定位到RAM中。在IAR环境下,将代码段定位于RAM,需要在函数前加关键字“__ramfunc”。实例函数申明如下:
__ramfunc void LPR_Ram(void)
5.Wait功耗
看过第一篇博文《MCU低功耗设计(一)理论》的读者会了解到,Wait模式下仅CPU暂停运行,这样一来晶振可以是HSI(内部高速)或LSI(内部低速)。我们先测试HIS模式下功耗,设置模式:#define MCU_MOD
MCU低功耗设 相关文章:
- MCU低功耗设计(一)理论(11-11)
- MCU低功耗设计(三)产品(11-11)
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)