MSP430 工作笔记一(转)
T(CALBC1_8MHZ);
SFR_8BIT(CALDCO_1MHZ);
SFR_8BIT(CALBC1_1MHZ);
#endif
5,使用超低功耗低频振荡器VLO可以很大程度地降低系统功耗,下面的例子是设置ACLK为VLO,MCLK为VLO的8分频:
#include
//1延时
//#defineCPU_F((double)16000000)//cpufrequency16000000
#defineCPU_F((double)1630)//cpufrequency1630//CPU的实际MCLK大约为13.05/8=1.63KHz
#definedelay_us(x)__delay_cycles((long)(CPU_F*(double)x/1000000.0))
#definedelay_ms(x)__delay_cycles((long)(CPU_F*(double)x/1000.0))
voidmain(void)
{
volatileunsignedinti;//Volatiletopreventremoval
WDTCTL=WDTPW+WDTHOLD;//Stopwatchdogtimer
BCSCTL3|=LFXT1S_2;//LFXT1=VLO低频时钟选择为VLOACLK选为VLO
IFG1&=~OFIFG;//ClearOSCFaultflag清除振荡器错误中断标志
__bis_SR_register(SCG1+SCG0);//StopDCOSCG1禁止SMCLKSCG0禁止DCO
BCSCTL2|=SELM_3+divM_3;//MCLK=LFXT1/8
//因为前面已经选择了LFXT1=VLO所以MCLK选为VLO8分频所以CPU的MCLK大约为1.5KHz
P1DIR=0xFF;//AllP1.xoutputs
P1OUT=0;//AllP1.xreset
P2DIR=0xFF;//AllP2.xoutputs
P2OUT=0;//AllP2.xreset
P1SEL|=BIT0+BIT4;//P10P14options功能选择为外围模块
//p10输出ACLK,来自VLO,p14输出SMCLK,因为禁止了SMCLK,所以P14脚无波形输出
//VLO典型值为12KHz实际用示波器测得为:13.05KHz左右波动
//所以CPU的实际MCLK大约为13.05/8=1.63KHz
for(;;)
{
P1OUT^=BIT6;//P1.6闪烁
delay_ms(1000);
}
}
6,如上面的程序所示,其中的延迟函数用那种方法,使用系统的延迟周期函数__delay_cycles(intn);可以达到比较精确的延迟,如下:
//more_
//1延时
//#defineCPU_F((double)16000000)//cpufrequency16000000
#defineCPU_F((double)12000000)//cpufrequency12000000
#definedelay_us(x)__delay_cycles((long)(CPU_F*(double)x/1000000.0))
#definedelay_ms(x)__delay_cycles((long)(CPU_F*(double)x/1000.0))
//2空函数
#definenop()_NOP();
7,系统上电后默认使用的是DCO时钟,DCO默认的频率大概为800KHz,但我用示波器观察的为1.086MHz左右,当DCO设置的过高时,用示波器可以看到波形不再是方波,而是类似于正弦波。
(三),定时器Timer_A
1,MSP430g2553具有两个16位的定时器:Timer0_ATimer1_A。分别具有三个捕捉/比较寄存器,具有输入捕捉,输出比较功能。可以产生定时中断,也可以产生PWM。
2,产生PWM,例子如下:
#include
voidTimer_A0_1_init()//TA0.1输出PWM
{
TACTL|=TASSEL_1+MC_1;//ACLK,增计数
CCTL1=OUTMOD_7;//输出模式为复位/置位
CCR0=328;//时钟频率为32768HZ,100HZ
//CCR1=164;//时钟频率为32768HZ,占空比CCR1/CCR0=50%
CCR1=109;//占空比CCR1/CCR0=1/3TA0.1由P1.2P1.6输出
}
voidTimer_A1_2_init()//TA1.2输出PWM
{
TA1CTL|=TASSEL_1+MC_1;//ACLK,增计数
TA1CCTL2=OUTMOD_7;//输出模式为复位/置位,注意CCTL2要写为TA1CCTL2
TA1CCR0=164;//时钟频率为32768HZ,波形32768/CCR0=199HZ
TA1CCR2=41;//占空比CCR2/CCR0=1/4,注意CCR2要写成TA1CCR2TA1.2由P2.4P2.5输出
}
voidTimer_A1_1_init()//TA1.1输出PWM
{
TA1CCTL1=OUTMOD_7;
TA1CCR1=123;//占空比CCR1/CCR0=3/4,注意CCR1要写成TA1CCR1TA1.1由P2.1P2.2输出
}
voidIO_init()
{
P1SEL|=BIT2+BIT6;
P1DIR|=BIT2+BIT6;//P1.2P1.6输出TA0.1OUT1
P2SEL|=BIT4+BIT5;
P2DIR|=BIT4+BIT5;//P2.4P2.5输出TA1.2OUT2
P2SEL|=BIT1+BIT2;
P2DIR|=BIT1+BIT2;//P2.1P2.2输出TA1.1OUT1
}
voidmain(void){
WDTCTL=WDTPW+WDTHOLD;
IO_init();
Timer_A0_1_init();
Timer_A1_2_init();
Timer_A1_1_init();
_BIS_SR(CPUOFF);//EnterLPM0进入低功耗模式0SMCLKON,ACLKON
}
3,Timer_A的捕获/比较寄存器
TAR寄存器是Timer_A的16位的计数寄存器。TACCRx是Timer_A的捕获/比较寄存器,当为捕获模式时:当捕获发生时,把TAR的值装载到TACCRx中。当为比较模式时:TACCRx中装的是要与TAR寄存器相比较的值。
4,捕获模式
捕获外部输入的信号的上升沿或下降沿或上升沿下降沿都捕捉,当捕捉发生时,把TAR的值装载到TACCRx中,同时也可以进入中断,执行相应的操作。这样利用捕捉上升沿或下降沿就可以计算外部输入信号的周期,得出频率。利用捕捉上升沿和下降沿可以得出输入信号的高电平或低电平的持续时间。也可以算出占空比。下面是一个例子,是Timer_A捕获初始化的程序:
voidtimer_init()//使用Timer1_A时要特别注意各个寄存器的写法,因为Timer0_A的寄存器都简写了,所以在写
//Timer1_A的寄存器时,要特别
msp430工作笔 相关文章:
- msp430工作笔记二(11-13)
- msp430工作笔记3(11-13)
- msp430工作笔记4(11-13)
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)