模
式//TA 定时器溢出中断允许
CCTL0=CM0+CM1+SCS+CAP+CCIE; //上下升沿,异步,捕获,捕获中断允许cci0 CCTL1=CM0+SCS+CAP+CCIE; //上升沿,异步,捕获,捕获中断允许cci1 P1DIR=0x00; P1SEL=0xff; P3DIR=0xFF; P3OUT=0x00; _EINT(); for(;;) {
for(i=0;i<10000;i++) _NOP();
P3OUT^=0x02; //产生捕获信号源 } }
#pragma vector=TIMERA1_VECTOR // 定时器中断捕获__interrupt void TIMER_A(void) {
switch(TAIV) {
case 2:P3OUT^=0x04;
j=CCR1-j;//两次上升沿间隔 break;
case 4: break;
case 10: P3OUT^=0x02; break; } }
#pragma vector=TIMERA0_VECTOR __interrupt void TIMER_cc(void) {
P3OUT^=0x08;
k=CCR0-k;//上下升沿间隔 }
例2:
//CCI0、CCI1 设置为比较器模式, //CCR0 捕获产生中断
//CCI0 中断使得P3.3 闪,CCI1 中断使得P3.2 闪 #include
WDTCTL=WDTPW+WDTHOLD;
TACTL =TASSEL1+ID0+ID1+MC1+TACLR;//+TAIE;//MCLK,8 器溢出中断允许
CCTL0=CCIE; //cap=0 比较器模式 CCTL1=CCIE; //cap=0 比较器模式 CCR0=10000; CCR1=30000; P3DIR=0xFF; P3OUT=0x00; _EINT();
分频,CLEAR TAR,连续模式//TA 定时 for(;;) {
// for(i=0;i<10000;i++) _NOP();
// P3OUT^=0x02; //产生捕获信号源 } }
#pragma vector=TIMERA1_VECTOR //定时器比较器中断CCR1=TAR __interrupt void TIMER_A(void) {
switch(TAIV) {
case 2:P3OUT^=0x04;
CCR1+=60000;// 改变比较条件 break;
case 4: break;
case 10: P3OUT^=0x02; break; } }
#pragma vector=TIMERA0_VECTOR __interrupt void TIMER_cc(void) {
P3OUT^=0x08;
CCR0 +=20000;//上下升沿间隔 }
//利用Timer_A 输出周期为512 /32768 = 15.625ms、占空比分别为75%和25%的 PWM 矩形波: #include
WDTCTL = WDTPW +WDTHOLD;
TACTL = TASSEL0 + TACLR; // ACLK, 清除TAR CCTL0=0x00;//默认值,比较器模式 CCTL1=0x00;//默认值,比较器模式 CCR0 = 512-1; // PWM 周期 CCTL1 = OUTMOD_7;
CCR1 = 384; //占空比384/512=0.75
CCTL2 = OUTMOD_7;
CCR2 = 128; //占空比128/512=0.25 P1DIR |= 0x04; // P1.2 输出 P1SEL |= 0x04; // P1.2 TA1 out P2DIR |= 0x01; // P2.0 输出 P2SEL |= 0x01; // P2.0 TA2 out
TACTL |= MC0; // Timer_A 增计数模式 for (;;) {
_BIS_SR(LPM3_bits); // 进入LPM3 _NOP(); } }
7.3.5 应用举例
例1 利用定时器A 输出周期为2ms 的方波,并由端口P3 送出算法:采用定时器A 连 续计数模式。使用在P3 端口每隔1ms 将输出求反。背景条件:DCO 产生的频率为 800KHz。使用800KHz 的SMCLK 作为定时器的时钟源,则定时1ms 的计数值为: 1×0.001/(1/(800×1000)) =800。 例2 Timer_A 实现PWM 举例
例:设ACLK = TACLK = LFXT1 = 32768, MCLK = SMCLK = DCOCLK
= 32×ACLK =1.048576Mhz,利用Timer_A 输出周期为512 /32768 = 15.625ms、占空 比分别为75%和25%的PWM 矩形波: #include
WDTCTL = WDTPW +WDTHOLD; FLL_CTL0 |= XCAP14PF;
TACTL = TASSEL0 + TACLR; // ACLK, 清除TAR CCR0 = 512-1; // PWM 周期 CCTL1 = OUTMOD_7;
CCR1 = 384; //占空比384/512=0.75 CCTL2 = OUTMOD_7;
CCR2 = 128; //占空比128/512=0.25 P1DIR |= 0x04; // P1.2 输出 P1SEL |= 0x04; // P1.2 TA1 P2DIR |= 0x01; // P2.0 输出 P2SEL |= 0x01; // P2.0 TA2
TACTL |= MC0; // Timer_A 增计数模式 for (;;) {
_BIS_SR(LPM3_bits); // 进入LPM3 _NOP(); } }