MSP430單片機(jī)16 位定時(shí)器Timer_A 操作
/**********(一)定時(shí)器A比較模式*************/
intmain(void)
{
WDTCTL=WDTPW+WDTHOLD;//關(guān)看門狗
BCSCTL1=CALBC1_1MHz;//設(shè)定DCO為1MHZ
DCOCTL=CALBC1_1MHZ;
P1DIR|=BIT0;//LED使能
TACTL=TASSEL1+TACLR;//定時(shí)器A時(shí)鐘源為SMCLK,并清TAR
CCTL0|=CCIE;//CCR0中斷使能
CCR0=50000;//計(jì)數(shù)值為50000個(gè)SMCLK周期
TACTL|=MC1;//啟動(dòng)定時(shí)器A為連續(xù)計(jì)數(shù)模式
_BIS_SR(GIE+CPUOFF);
return0;
}
#pragmavector=TIMERA0_VECTOR//ccr0中斷服務(wù)
__interruptvoidta0_isr(void)
{
P1OUT^=BIT0;//LED翻轉(zhuǎn)
CCR0+=50000;//定時(shí)補(bǔ)償
}
/**********(二)定時(shí)器A捕獲模式************/
volatileunsignedintcap_value;//存兩次捕值之差
intmain(void)
{
volatileunsignedintfirst_value,second_value,n;
WDTCTL=WDTPW+WDTHOLD;//關(guān)看門狗
BCSCTL1=CALBC1_8MHZ;//設(shè)定DCO為1MHZ
DCOCTL=CALBC1_8MHZ;
BCSCTL1|=DIVA_3;//ACLK輸入八分頻
do//等待晶振穩(wěn)定
{
IFG1&=~OFIFG;
for(n=5000;n>0;n--);
}while(OFIFG&IFG1);
TACCTL2=CM1+CCIS_1+CAP;//捕獲模式,捕獲上升沿,捕獲內(nèi)部ACLK
TACTL=TASSEL_2+MC_2+TACLR;//定時(shí)器時(shí)鐘源為SMCLK,啟動(dòng)連續(xù)計(jì)數(shù),清TAR
TACCTL2&=~CCIFG;//清CCR2的標(biāo)志位
while(!(CCIFG&TACCTL2));//查CCR2標(biāo)志位
first_value=TACCR2;//第一個(gè)捕獲值存入first_value
TACCTL2&=~CCIFG;//清CCR2的標(biāo)志位
while(!(CCIFG&TACCTL2));//查CCR2標(biāo)志位
second_value=TACCR2;//第二個(gè)捕獲值存入second_value
TACCTL2&=~CCIFG;//清CCR2的標(biāo)志位
TACCTL2&=~MC1;//關(guān)定時(shí)器A
cap_value=(second_value-first_value);
return0;
}
/************(三)定時(shí)器PWM輸出程序*****************/
intmain(void)
{
WDTCTL=WDTPW+WDTHOLD;//關(guān)看門狗
BCSCTL1=CALBC1_1MHZ;//設(shè)定DCO為1MHZ
DCOCTL=CALBC1_1MHZ;
TACTL=TASSEL1+TAR;//SMCLK為時(shí)鐘源,清TAR
CCR0=512;//設(shè)定PWM周期
CCTL1|=OUTMOD_7;//CCR1輸出為reset/set模式
CCR1=384;//CCR1的PWM占空比設(shè)定
CCTL2|=OUTMOD_7;//CCR2輸出為reset/set模式
CCR2=128;//CCR2的PWM占空比設(shè)定
P1SEL|=BIT2+BIT3;//TA1,TA2輸出功能
P1DIR|=BIT2+BIT3;
TACTL|=MC0;//啟動(dòng)定時(shí)器A增計(jì)數(shù)模式
_BIS_SR(CPUOFF);
return0;
}