微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > msp430工作笔记二

msp430工作笔记二

时间:11-13 来源:互联网 点击:

而各种低功耗模式又可通过中断的方式会到活动模式。

在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管脚的功能,可以选择它为复位管脚,也可以选择它产生不可屏蔽中断,例子如下:

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top