而各种低功耗模式又可通过中断的方式会到活动模式。
在CCS的编译系统中,已经做好了各种低功耗模式的宏定义,在软件中直接调用就可以了,宏定义如下:
#ifdef __ASM_HEADER__
#define LPM0(CPUOFF)
#define LPM1(SCG0+CPUOFF)
#define LPM2(SCG1+CPUOFF)
#define LPM3(SCG1+SCG0+CPUOFF)
#define LPM4(SCG1+SCG0+OSCOFF+CPUOFF)
#else
#define LPM0_bits(CPUOFF)
#define LPM1_bits(SCG0+CPUOFF)
#define LPM2_bits(SCG1+CPUOFF)
#define LPM3_bits(SCG1+SCG0+CPUOFF)
#define LPM4_bits(SCG1+SCG0+OSCOFF+CPUOFF)
#include "in430.h"
#define LPM0_bis_SR_register(LPM0_bits)
#define LPM0_EXIT_bic_SR_register_on_exit(LPM0_bits)
#define LPM1_bis_SR_register(LPM1_bits)
#define LPM1_EXIT_bic_SR_register_on_exit(LPM1_bits)
#define LPM2_bis_SR_register(LPM2_bits)
#define LPM2_EXIT_bic_SR_register_on_exit(LPM2_bits)
#define LPM3_bis_SR_register(LPM3_bits)
#define LPM3_EXIT_bic_SR_register_on_exit(LPM3_bits)
#define LPM4_bis_SR_register(LPM4_bits)
#define LPM4_EXIT_bic_SR_register_on_exit(LPM4_bits)
#endif
6,具体的例子就不再举了,就是在CPU不需要工作的时候进入低功耗模式,在需要工作的时候,通过中断唤醒。
下面说说一般的低功耗的原则:
(1),最大化LPM3的时间,用32KHz晶振作为ACLK时钟,DCO用于CPU激活后的突发短暂运行。
(2),用接口模块代替软件驱动功能。
(3),用中断控制程序运行。
(4),用可计算的分支代替标志位测试产生的分支。
(5),用快速查表代替冗长的软件计算。
(6),在冗长的软件计算中使用单周的CPU寄存器。
(7),避免频繁的子程序和函数调用。
(8),尽可能直接用电池供电。
此外,在设计外设时还有一些常规原则:
(1),将不用的FETI输入端连接到Vss。
(2),JTAG端口TMS, TCK和TDI不要连接到Vss。
(3),CMOS输入端不能有浮空节点,将所有输入端接适当的电平。
(4),不论对于内核还是对于各外围模块,选择尽可能低的运行频率,如果不影响功能应设计自动关机。
(八),看门狗定时器
1,单片机的看门狗定时器的原始功能是防止程序出错跑飞,但是在系统的研发阶段,一般不使用看门狗的。
2,msp的看门狗可以工作在看门狗模式和间隔定时器模式,在间隔定时器模式下,就可以当一个普通的定时器使用。其中工作模式的宏定义如下:
#define __MSP430_HAS_WDT__
SFR_16BIT(WDTCTL);
#define WDTIS0(0x0001)
#define WDTIS1(0x0002)
#define WDTSSEL(0x0004)
#define WDTCNTCL(0x0008)
#define WDTTMSEL(0x0010)
#define WDTNMI(0x0020)
#define WDTNMIES(0x0040)
#define WDTHOLD(0x0080)
#define WDTPW(0x5A00)
#define WDT_MDLY_32(WDTPW+WDTTMSEL+WDTCNTCL)
#define WDT_MDLY_8(WDTPW+WDTTMSEL+WDTCNTCL+WDTIS0)
#define WDT_MDLY_0_5(WDTPW+WDTTMSEL+WDTCNTCL+WDTIS1)
#define WDT_MDLY_0_064(WDTPW+WDTTMSEL+WDTCNTCL+WDTIS1+WDTIS0)
#define WDT_ADLY_1000(WDTPW+WDTTMSEL+WDTCNTCL+WDTSSEL)
#define WDT_ADLY_250(WDTPW+WDTTMSEL+WDTCNTCL+WDTSSEL+WDTIS0)
#define WDT_ADLY_16(WDTPW+WDTTMSEL+WDTCNTCL+WDTSSEL+WDTIS1)
#define WDT_ADLY_1_9(WDTPW+WDTTMSEL+WDTCNTCL+WDTSSEL+WDTIS1+WDTIS0)
#define WDT_MRST_32(WDTPW+WDTCNTCL)
#define WDT_MRST_8(WDTPW+WDTCNTCL+WDTIS0)
#define WDT_MRST_0_5(WDTPW+WDTCNTCL+WDTIS1)
#define WDT_MRST_0_064(WDTPW+WDTCNTCL+WDTIS1+WDTIS0)
#define WDT_ARST_1000(WDTPW+WDTCNTCL+WDTSSEL)
#define WDT_ARST_250(WDTPW+WDTCNTCL+WDTSSEL+WDTIS0)
#define WDT_ARST_16(WDTPW+WDTCNTCL+WDTSSEL+WDTIS1)
#define WDT_ARST_1_9(WDTPW+WDTCNTCL+WDTSSEL+WDTIS1+WDTIS0)
下面举一个看门狗工作于间隔定时器模式下的例子:
#include
void main(void)
{
WDTCTL = WDT_MDLY_32;// Set Watchdog Timer interval to ~30msSMCLK计时
IE1 |= WDTIE;// Enable WDT interrupt 间隔定时器模式中断使能
P1DIR |= 0x01;// Set P1.0 to output direction
_BIS_SR(LPM0_bits + GIE);// Enter LPM0 w/ interrupt
}
// Watchdog Timer interrupt service routine
#pragma vector=WDT_VECTOR
__interrupt void watchdog_timer(void)//WDTIFG中断标志自动清除
{
P1OUT ^= 0x01;// Toggle P1.0 using exclusive-OR
}
3,上电以后看门狗默认是打开的,如果不用的话就将其关闭:
WDTCTL = WDTPW + WDTHOLD;
4,看门狗控制寄存器还控制着RST/NMI管脚的功能,可以选择它为复位管脚,也可以选择它产生不可屏蔽中断,例子如下: