典型的低消耗,省粮食模式,套用到电子技术就是低功耗,省点模式。这很重要,因为在某些情况下,系统用电的确是数着u库伦过日子。MSP430就是个过日子的好手。 数米过日子,处理器有几个考虑,一个是降低工作电压;第二个就是把暂时不用的模块功能关闭掉;使之不耗电,第三个方法就是降低工作时钟频率。
MSP430的电压已经降到了3.3v,虽然不是最低的(arm的部分芯片内核工作电压降到了1.8v),但是这已经是比较低的了;MSP430比较出彩的地方一个是把一颗芯片分成了N个不同的模块部分,不用的部分功能模块可以关闭掉,电流近似为零;另一个出彩的地方是,可以有三个时钟源,并产生更多的内部可用工作频率,让内部各个模块工作在不同的频率,不用的时钟还可以关掉(具体参看上一节MSP430之系统时钟篇)。后两种方法主要是通过软件的方式进行设置的,具体来讲,MSP430可以有6种不同的工作模式:
补充:设置其工作模式主要是设置寄存器SR的SCG0、SCG1、OscOff、CPUOff位。SCG0=1且DCOCLK没有用于MCLK和SMCLK时,直流发生器禁止;SCG1=1时,SMCLK禁止; CPUOff=1时,MCLK被禁止;只有CPUOff=1时,OscOff才可以=1,此时晶振被禁止。
1、活动模式-----AM
正常的工作模式,这时CPU消耗的电能最大.
2、低功耗模式0-----
LPM0
CPUOff置位,CPU停止活动,但外围模块继续工作,ACLK和MCLK信号保持活动,MCLK的锁频坏控制正常工作.有关控制位设置为:SCG0=0,SCG1=0,OscOff=0,CPUOff=1。
3、低功耗模式1-----LPM1
CPUOff置位,CPU停止活动,但外围模块继续工作,MCLK的锁频环控制停止工作,ACLK与MCLK保持活动,有关控制位设置为:SCG0=0,SCG1=1,OscOff=0,CPUOff=1。
4、低功耗模式2-----LPM2
CPUOff置位,CPU停止活动,但外围模块继续工作,MCLK的锁频环控制停止,ACLK活动,MCLK停止,有关控制位设置为:SCG0=0,SCG1=1,OscOff=0,CPUOff=1。
5、低功耗模式3-----LPM3
CPUOff置位,CPU停止活动,但外围模块继续工作,MCLK的锁频环控制和MCLK停止工作,DCO的DC发生器关闭,但ACLK信号仍保持活动,有关控制位设置为:SCG0=1,SCG1=1,OscOff=0,CPUOff=1。
6、低功耗模式4-----LPM4
CPUOff置位,CPU停止活动,但外围模块继续工作,MCLK的锁频环控制和MCLK停止工作,晶振停止,有关控制位设置为:SCG0=x,SCG1=x,OscOff=1,CPUOff=1。
处理器进入低功耗模式以后,一般由中断来唤醒。可以是外部中断,也可以是内部的定时器等中断。
范例:
#include
void main(void)
{
WDTCTL = WDT_ADLY_250; // 看门狗定时250mS
IE1 |= WDTIE; // 使能看门狗中断
FLL_CTL0 |= XCAP14PF; // 装载匹配电容
P2DIR |= 0x02; // 设置P2.1输出方向
_BIS_SR(LPM3_bits + GIE); //进入低功耗3,允许可屏蔽中断响应
}
// Watchdog Timer interrupt service routine
#pragma vector=WDT_VECTOR
__interrupt void watchdog_timer(void)
{
P2OUT ^= 0x02; // 定时翻转P2.1
}
在上面的程序中,main函数执行完毕之后即进入了低功耗模式,只是在中断中,才能执行功能操作。其次,可以看出:1、从中断返回后,依然是中断状态;2、main函数永远不会返回,因为_BIS_SR(LPM3_bits + GIE)之后的语句永远不可能执行。
思考:怎么才能够在满足某些条件下,main之后的程序继续执行呢?
讨论:要想执行main之后的程序,那么就需要在程序从中断返回后摆脱低功耗状态,这就需要修改SR寄存器;进一步,考虑到中断的响应是自动保存PC和SR寄存器,所以只需要在中断程序中修改堆栈中保存的SR即可。显然,在C语言中解决堆栈操作问题不是一件容易的事情