自打第一天接触430系列开始,430低功耗一直是深深地留在我的印象里,每当工作中要求功耗比较严格时,MSP430一直是偶考虑的首选。更让偶惊叹的是看到丁工讲的Launchpad视频教程时,用苹果串起来对控制液晶显示模块供电(偶猜测它的主控芯片是L092系列的,因为这个系列的供电只有0.9v),让偶对低3功耗的充满着一片想象。现在我从以下几个方面来我眼中的430为什么会那么低功耗(比如一颗纽扣电池能用10年之久)。
首先用同一标准来衡量430。自己算计系统中通常采用W/MIPS来衡量处理器的功耗与性能关系的。我们大部分人都用过x86结构的51,它是CICS架构,使用的是集中指令,通俗的讲,就是它内部通过硬件实现了很多特殊的功能,我们通过CICS,简单几句就可以完成对数据的操作存储,CICS架构的功耗普遍不会很低,我记得去年做的一个项目中,用了ST的芯片,用公司的内部仪器测试了它全速运行的动态电流,基本上到达了15mA/MIPS。而采用RICS架构的单片机则有MSP430与MICROCHIP(不好意思,到现在为止,我只接触过这两种RICS架构的mcu,如果还有其他单片机也是这个架构的,希望跟帖回复),去年年底的时候,microchip公司发布了PIC24F列的某款芯片,官网介绍说它在全速运行时达到了150uA/MHZ,而TI的FRAM则是低于110uA/MHZ,据官网上的说法是这个月供货的以MSP430FR58xx系列金刚狼MCU到达了有可能更低的功耗,可以说MSP430的功耗平台确实无人能及。偶在不断惊叹的同时,也是不断对TI的崇拜。
上面采用了对架构,功耗与性能之比对mcu进行了分析。现在对内部硬件模块进行分析。由于msp430具有不同模块,疑问?MSP430为什么会有不同模块,因为在这个模拟量的现实世界中,存在着不同频率的信号,有高至很高的,也有底至很低的。在mcu与外部接口中,大部分的信号相对cpu与ram的存取与读写信号来说是低速信号,由于速度越高,需要的电流越大,功耗越大。所以在单片机中不需要以同样高的速度给外围接口提供时钟,这没必要,也是浪费,在功耗要求很严格的地方这也是致命伤,这时就出现了时钟分频,提供给不同模块,给不同时钟,甚至不工作的模块可以停止掉,对于无时不刻都在运行的mcu来讲这就省下了很多的能源了,所以请不要小看低功耗,这个将成为未来评价单片机的重要参数。如果还不是很清楚,不同的时钟信号,我可以举个通俗的例子,比如我们的电脑主板,主板上三大用电大户,大家应该知道吧,用电大小依次从大到小排列,cpu,北桥,南桥。我们可以把cpu比喻成皇帝,北桥比喻成各个吏部,而南桥比喻成各个衙门,皇帝是不会与衙门打交道,一般都是通过各个吏部来处理事情的,cpu也基本上很少和南桥打交道的,cpu
是和北桥打交道的,cpu都是通过北桥来间接处理时间的,这就对cpu起到了一个隔离的保护,因为它能处理更多更复杂的事情,如果你让它给你处理检测键盘按键的功能,那实在是太浪费这里的cpu了,这里的cpu根本不是这块料(就像皇帝都不直接给人民办好事)。吏部主要做些什么,在主板中处理高速信号,比如,ddr的读写,显卡的操作,再就是与cpu进行通信,与cpu主要讲这些事情,显卡怎么读,送多少东西给显卡,显卡现在运行到了什么状态,内存从哪里开始,是读还是写,这个结果放到哪里去等等,提供给它们的信号就是告诉的,因为它们能在同一个频率对话,也就是它们为什么用电这么大的原因,南桥主要处理开关机电路,键盘,usb,鼠标等相对于cpu和北桥信号的低速信号。南桥衙门就每天设立在哪里,看看每天有谁谁告状,简单的偷鸡摸狗的事,该打的打,改关的关,一般能处理掉。实在处理不了的交给吏部,吏部解决不了的再给皇上,如果衙门直接交给皇上,这就叫跨级上奏,大部分都要死翘翘了。所以在主板上,cpu散热时加个风扇,北桥就加个大型散热片,南桥用小型的散热片,设置看到过有的南桥直接裸露在外面。
接下来的问题是,我们拥有了这么低的低功耗平台,作为使用者,我们有权利也有这个义务将这个低功耗发挥到极致。丁工在视频中讲过,msp430中有5个低功耗等级,但常用的是LPM0,LPM3,LPM4.LMP1和LPM0相近,LPM2与LPM3相近,他俩不常用,常用其他等级的低功耗模式代替了。下面我通过Launchpad板,对LED1的闪烁进行低功耗编制如下:
#include <msp430g2553.h>
void main(void)
{
int i ;
BCSTL1 != DIVA_1; //ACLK/2
BCSTL3 !
=LFXT1S_2; //ACLK = VLO
WDTCTL =
WD_ADLY_1000;//看门狗工作于定时器模式
IE1 != WDTIE; //看门狗中断允许
P1DIR = 0XFF; //设置Led1为输出
P1OUT != 0X01; //驱动输出高电平
while(1)
{
P1OUT = ~P1OUT; //灯状态取反
for(i = 1000;i
> 0;i--)
{
;
}
_BIS_SR(LPM3_bits
+ GIE); //进入LPM3,AClk活动的
}
#pragma vector =
WDT_VECTOR//看门狗中断处理
__interrupt void
watchdog_timer(void)
{
_BIC_SR_IRQ(LPM3_bits); //清除LPM3,唤醒cpu
}
第一次的新发帖,如果写的不好与错误的地方,站内短信通知我,我将尽快修改,以免误导其他读者,谢谢。