MSP430单片机16 位定时器Timer_A 操作
扫描二维码
随时随地手机看文章
/**********(一)定时器A比较模式*************/
intmain(void)
{
WDTCTL=WDTPW+WDTHOLD;//关看门狗
BCSCTL1=CALBC1_1MHz;//设定DCO为1MHZ
DCOCTL=CALBC1_1MHZ;
P1DIR|=BIT0;//LED使能
TACTL=TASSEL1+TACLR;//定时器A时钟源为SMCLK,并清TAR
CCTL0|=CCIE;//CCR0中断使能
CCR0=50000;//计数值为50000个SMCLK周期
TACTL|=MC1;//启动定时器A为连续计数模式
_BIS_SR(GIE+CPUOFF);
return0;
}
#pragmavector=TIMERA0_VECTOR//ccr0中断服务
__interruptvoidta0_isr(void)
{
P1OUT^=BIT0;//LED翻转
CCR0+=50000;//定时补偿
}
/**********(二)定时器A捕获模式************/
volatileunsignedintcap_value;//存两次捕值之差
intmain(void)
{
volatileunsignedintfirst_value,second_value,n;
WDTCTL=WDTPW+WDTHOLD;//关看门狗
BCSCTL1=CALBC1_8MHZ;//设定DCO为1MHZ
DCOCTL=CALBC1_8MHZ;
BCSCTL1|=DIVA_3;//ACLK输入八分频
do//等待晶振稳定
{
IFG1&=~OFIFG;
for(n=5000;n>0;n--);
}while(OFIFG&IFG1);
TACCTL2=CM1+CCIS_1+CAP;//捕获模式,捕获上升沿,捕获内部ACLK
TACTL=TASSEL_2+MC_2+TACLR;//定时器时钟源为SMCLK,启动连续计数,清TAR
TACCTL2&=~CCIFG;//清CCR2的标志位
while(!(CCIFG&TACCTL2));//查CCR2标志位
first_value=TACCR2;//第一个捕获值存入first_value
TACCTL2&=~CCIFG;//清CCR2的标志位
while(!(CCIFG&TACCTL2));//查CCR2标志位
second_value=TACCR2;//第二个捕获值存入second_value
TACCTL2&=~CCIFG;//清CCR2的标志位
TACCTL2&=~MC1;//关定时器A
cap_value=(second_value-first_value);
return0;
}
/************(三)定时器PWM输出程序*****************/
intmain(void)
{
WDTCTL=WDTPW+WDTHOLD;//关看门狗
BCSCTL1=CALBC1_1MHZ;//设定DCO为1MHZ
DCOCTL=CALBC1_1MHZ;
TACTL=TASSEL1+TAR;//SMCLK为时钟源,清TAR
CCR0=512;//设定PWM周期
CCTL1|=OUTMOD_7;//CCR1输出为reset/set模式
CCR1=384;//CCR1的PWM占空比设定
CCTL2|=OUTMOD_7;//CCR2输出为reset/set模式
CCR2=128;//CCR2的PWM占空比设定
P1SEL|=BIT2+BIT3;//TA1,TA2输出功能
P1DIR|=BIT2+BIT3;
TACTL|=MC0;//启动定时器A增计数模式
_BIS_SR(CPUOFF);
return0;
}