1 MSP430省电方式简介
MSP430以其低功耗著称于世,它可以外接2个时钟源——XIN、XT2IN,内部还有1个DC0振荡器,可以产生高达8 MHz的内部时钟。一般XT2IN的频率为高频,按实际应用时的要求来选用;XIN为低频,可以是32 768Hz。XIN的用途主要是在低功耗时使系统保持“活着”。MSP430共有5种省电方式,即LPM0~4。其中,
LPM0:CPU、MCLK关闭,SMCLK、ACLK打开,功耗79uA;
LPM1:CPU、MCLK、DCO关闭,SMCLK、ACLK打开,功耗4luA;
LPM2:CPU、MCLK、SMCLK、DC0关闭,DC产生器、ACLK打开,功耗17uA;
LPM3:CPU、MCLK、SMCLK、DC0、DC产生器关闭,ACLK打开。功耗2uA;
LPM4:CPU及所有模块都关闭,功耗0.1 uA。
系统在LPMO-3方式下可以被唤醒,LPM4则不能。大多数应用场合都希望MSP430平时进入睡眠状态,降低功耗,而后定时或被外界中断唤醒,执行相应的程序后再次进入睡眠状态,然后再次被唤醒,其中因为LPM3是满足要求且功耗最低的一种方式,所以它被使用得最多。本文就来讨论这种方式下的睡眠与唤醒。
2 睡眠与唤醒
主程序循环运行的流程如图1所示。
每一次循环中都要判断睡眠条件是否成立,若成立则切换时钟,进入睡眠方式。至此,CPU不再执行任何程序,直到CPU被唤醒后才继续执行。唤醒条件可以是定时中断、外部I/O中断,或串行口中断。下面的PowerManagement代码为进入睡眠前后和被唤醒后执行的相应操作。SerialReceiveInterrupt代码为串行口接收到1个字符中断后进行的相应操作,TimerBInterrupt代码为定时器B5定时时间到后进行的相应操作。2个中断程序中,在唤醒CPU之前均将时钟调整到正常工作时的高速时钟源上,设置相应的标志,然后再执行唤醒子程序clrLPM3。编译软件为IAR embedded workbench 1.26。
3 睡眠时长
如果睡眠是靠串行口中断来唤醒,则睡眠时长为不定长,什么时候来了中断,什么时候醒来。所以在此只讨论定时器产生中断来唤醒的情况。
定时器B的控制寄存器的说明如图2所示。
图2 定时器B的控制寄存器
CNTLx:计数器长度,00=16位,MSP430定时器B的计数器TBR最大为0xFFFF;01=12位,TBR最大为0x0FFF,10=10位,TBR最大为0x03FF,11=8位,TBR最大为0xFF。
TBSSELx:定时器B的时钟源选择,00=TBCLK,01=ACLK,10=SMCLK,11=INCLK。
IDx:定时器B的时钟源分频因数,00=不分频,01=2分频,10=4分频,11=8分频。
MCx:定时器B的计数方式选择位,00=暂停计数,01=加计数方式,10=连续计数方式,11=加减计数方式。详细内容请参考MSP430的数据手册。
前述程序中定时器B的控制字TBCTL=TBSSEL0+ID0+ID1+MC1+TBCLR。定时器B的时钟源选择为TBSSEL0,该值在MSP430x14x.h头文件中的定义为0x0100,即选择的时钟源为ACLK(32768hz)。ID0在MSP430x14x.h定义为0x40,ID1在MSP430x14x.h定义为0x80,二者相加为0xC0,即定时器B的时钟源为8分频。MC1在MSP430x14x.h定义为0x20,即定时器B采用连续计数方式。
以上时钟选择了ACLK为32 768,再进行8分频,等于4 096,则定时器B的时钟最终运行频率为4 096 Hz,每计1个数所需时间为(1/4 096)S。又由于前面把定时器B5的计数值设为TBR-10=0xFFFF-10=0xFFF0=65 536-10=65 526,则计满65 526数需要的时间为65 526×(1/4 096)s=15.997 s≈16 s。因此,用定时器定时到产生中断作为唤醒源,最大睡眠时间不超过16 S。如果任务不需要这么快执行一次,可以每次醒来后先不去执行任务,而是给1个计数变量加1,然后继续进入睡眠状态,直到计数变量等于想要的时长后再执行。