(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 ~30ms SMCLK计时
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管脚的功能,可以选择它为复位管脚,也可以选择它产生不可屏蔽中断,例子如下:
//第16脚是RST/NMI/SBWTDIO 在本程序中,如果按下RESER键,会进入非可屏蔽中断,使P10 led闪烁
#include
void main(void) {
WDTCTL = WDTPW + WDTHOLD + WDTNMI + WDTNMIES; // WDT off NMI hi/lo
//WDTHOLD停止看门狗定时器 WDTNMI选择RST/NMI pin为NMI功能 WDTNMIES选择下降沿触发NMI
P1DIR |= 0x01; // Set P1.0 to output direction P1OUT &= ~0x01; // Clear P1.0 LED off
IE1 |= NMIIE; // Enable NMI 不可屏蔽中断使能
_BIS_SR(LPM0_bits); // Enter LPM0 因为是非可屏蔽中断,所以不用打开总中断 }
#pragma vector=NMI_VECTOR __interrupt void nmi_ (void) {
volatile unsigned int i;
P1OUT |= 0x01; // Set P1.0 LED on for (i = 20000; i > 0; i--); // Delay
P1OUT &= ~0x01; // Clear P1.0 LED off
IFG1 &= ~NMIIFG; // Reclear NMI flag in case bounce //NMI中断标志位必须要软件清除
IE1 |= NMIIE; // Enable NMI
//当非可屏蔽中断被相应,所有的NMI使能位都会自动地被复位,所以NMI相应之后,用户必须软件重新使能需要的NMI }