#include <msp430x16x.h>
void bcs_init()
{
unsigned char i;
BCSCTL1 &= ~XT2OFF;//打开XT
do
{
IFG1 &= ~OFIFG;//清除振荡失效
for(i = 0xff; i > 0; i--);//等待
}
while((IFG1 & OFIFG) != 0);
BCSCTL2 |= SELM_2 + SELS + DIVS_3;//MCLK = SMCLK = XT2,三分频
}
void timera_init()
{
P1SEL |= BIT0 + BIT1 + BIT2;
P4DIR |= BIT0 + BIT1 + BIT2;
TACTL |= TASSEL_2 + ID_3 ;//时钟源为SMCLK再三分频
TACCTL1 |= CM_2 + SCS + CAP + CCIE;//捕获模式,同步捕获,中断打开,下降沿捕获
TACCTL2 |= CM_2 + SCS + CAP + CCIE;//捕获模式,同步捕获,中断打开,下降沿捕获
_EINT();//开总中断
}
void main()
{
WDTCTL = WDTPW + WDTHOLD;//关狗
bcs_init();
timera_init();
while(1);
}
#pragma vector = TIMERA0_VECTOR
__interrupt void timera0_vec()
{
P4OUT ^= BIT0;
}
#pragma vector = TIMERA1_VECTOR
__interrupt void timera1_vec()
{
switch(TAIV)
{
case 2: if(TACCTL1 & CM_2)//上升沿
{
TACCTL1 = (CCTL1 & (~CM_2) | CM_1);//改成下降沿
P4OUT ^= BIT1;//LDE翻转
CCTL1 &= ~CCIFG;//清除中断标志
}
else if(TACCTL1 & CM_1)//下降沿
{
P4OUT ^= BIT1;//LDE翻转
TACCTL1 = (CCTL1 &(~CM_1) | CM_2);//改成上升沿
P4OUT ^= BIT2;//LDE翻转
CCTL1 &= ~CCIFG;//清除中断标志
}
break;
case 4: if(TACCTL2 & CM_2)//上升沿
{
TACCTL2 = (CCTL2 & (~CM_2) | CM_1);//改成下降沿
P4OUT ^= BIT1;//LDE翻转
CCTL2 &= ~CCIFG;//清除中断标志
}
else if(TACCTL2 & CM_1)//下降沿
{
P4OUT ^= BIT1;//LDE翻转
TACCTL2 = (CCTL2 &(~CM_1) | CM_2);//改成下降沿
P4OUT ^= BIT2;//LDE翻转
CCTL2 &= ~CCIFG;//清除中断标志
}
break;
case 10: break;
}
}
|