实时应用开发
单片机中,功耗最低的单片机要MSP430单片机,这是做手持设备最优选择,MSP430中,用到5种低功耗,LPM0,LPM1,LPM2,LPM3,LPM4,这五种低功耗各种解释如下 :
CPU的活动状态称为AM(ACTVE MODE)模式。其中AM耗电最大,LPM4耗电最省,仅为0.1uA。另外工作电压对功耗的影响:电压越低功耗也越低。 系统PUC复位后,MSP430进入AM状态。在AM状态,程序可以选择进入任何一种低功耗模式,然后在适当的条件下,由外围模块的中断使CPU退出低功耗模式,返回AM模式,再由AM模式选择进入相应的低功耗模式,如此类推。
CPU的结构:16个寄存器R0-R15,16位算数逻辑单元ALU和一个指令控制单元。
。寄存器中R4-R15是通用寄存器没有特殊功能。
R0:程序计数器PC(Program counter),存放着下一条要从程序存储器中取出的指令的地址。
R1:堆栈指针SP(Stack Point),系统堆栈在系统调用子函数或者进入中断服务程序时,保护程序计数器PC。
R2:状态寄存器SR(State Register):
R3:常数发生器
状态寄存器SR
工作模式的选择由状态寄存器SR中的SCG1、SCG0、OSCOFF、CPUOFF位控制。由于在CPU的头文件中对CPU内的各寄存器和模块的各种工作模式都作了详尽的定义,所以编程时尽可能的利用就是了。如:要进入低功耗模式0,可在程序中直接写:LPM0; 。进入低功耗模式4,可以写:LMP4;就可以了。退出低功耗模式如下:
LPM0_EXIT; //退出低功耗模式0
LPM4_EXIT; //退出低功耗模式4
LPM0:CPU停止工作,MCLK时钟停止,SMCLK、ACLK时钟还在工作。
LPM1:CPU停止工作,MCLK时钟停止,在活动模式如果DCO没有作为MCLK和SMCLK时钟时,则直流发生器被禁止,否则就保持活动状态,SMCLK、ACLK时钟依然还在工作。
LPM2:CPU停止工作,MCLK、SMCLK时钟停止工作,如果DCO没有作为MCLK、SMCLK,自动被禁止直流发生器保持有效,ACLK还处于工作中。
LPM3:CPU停止工作,MCLK、SMCLK时钟停止工作,DCO时钟也停止工作,仅ACLK时钟还处于工作状态。
LPM4:CPU停止工作,MCLK、SMCLK时钟停止工作,DCO时钟也停止工作,ACLK也停止工作。此时功耗最低。
一般情况下,处理器进入低功耗模式后,由中断来唤醒,外部中断或内部中断。
如果想进入低功耗1,则程序可以为:_BIS_SR(LPM1_bits + GIE);退出低功耗1,则程序可以为:LPM1_EXIT; 进入其他低功耗和退出低功耗一样。
低功耗执行的一个过程:程序从main函数入口开始执行程序,当遇到进入低功耗程序时,如:_BIS_SR(LPM1_bits + GIE);此时相当于下面的程序处于停止状态不再执行,当有一个中断来到,则会进入中断处理程序,自动退出低功耗,如果在中断中没有没有退出低功耗,当中断服务程序执行完成后,又会重新进入低功耗。
不同的低功耗模式就是配置不同的SCG1,SCG0,OscOff,CPUOff.
SCG1:复位使能SMCLK,置位则禁止SMCLK.
SCG0:复位激活DCO,置位且DCOCLK不用于MCLK或SMCLK时禁止DCO。
OscOff:复位则LFXT激活,置位且LFXT不用于MCLK或SMCLK时,LFXT振荡器禁止--对应着ACLK。
CPUOff:复位则MCLK激活,置位则MCLK停止。
(1)POR:POWER ON RESET.上电或复位信号都可以发生POR。
PUC:POWER UP CLEAR.POR可以出发PUC,另外看门狗的事件可以出发PUC。
(2)AM:全部活动
LPM0:CPUOFF=1,CPU被禁止,即MCLK被禁止。
LPM1:CPUOFF=1,SCG0=1。CPU-MCLK禁止,且若DCO未用做MCLK或SMCLK,则DCO禁止。
LPM2:CPUOFF=1,SCG1=1。CPU-MCLK禁止,SMCLK禁止。(DCO未用作MCLK,SMCLK则自动禁止)
LPM3:CPUOFF=1,SCG1=1,SCG0=1.CPU-MCLK禁止,SMCLK禁止,DCO禁止。
LPM4:CPUOFF=1,SCG1=1,SCG0=1,OSCOFF=1.全部禁止,包括ACLK也禁止。
单片机各个模块运行完全独立。定时器,IO,AD,看门狗等都可以在主CPU休眠的状态下独立运行。
软件将CPU设定到某一低功耗工作模式下,在需要时使用中断将CPU从休眠状态中唤醒,完成工作后又进入相应的休眠状态。
系统响应中断的过程:如果在中断处理子程序中修改堆栈中SR的状态,那么中断返回后将不再是原来的SR状态。
PC入栈,SR入栈。
中断向量赋给PC。
GIE,CPUOFF,OSCOFF,SCG1清除。
IFG标志位清除。
执行中断处理子程序。
执行RETI指令,中断返回。
SR出栈
PC出栈
进入LPM3:SCG1+SCG0+CPUOFF:也就是只有ACLK是活动的,但是仍支持WDT,TIMER.
编译器支持直接对位赋值:_intrinsic unsigned short _BIS_SR(unsigned short),位于in430.h
同理要清除SR中某一位的话就用 _BIC_SR();
全部0条评论
快来发表一下你的评论吧 !