aerkate

MSP430Timer_A example(原创)

0
阅读(2146)

 

 

前面我们对定时器A计数模块有了一定的认识,下面让我们通过三个例子来对其的使用了解一下。

为了让大家对定时器A的中断有一个比较贴切的认识,我们首先给出一个小的例子一,定时器A自动溢出。

#include<msp430x24x.h>

void main(void)

{

     WDTCTL = WDTPW + WDTHOLD;

     P1DIR|= 0x01;

     TACTL = TASSEL_1 + MC_2+ TAIE;

     _BIS_SR(LPM3_bits+GIE);

}

//Timer_A3 中断向量(TAIV)处理程序

#pragma vector = TIMERA1_VECTOR

__interrupt void Timer_A(void)

{

     Switch(TAIV)

     {

         case 2:break;  //CCR1比较/捕获寄存器的中断入口,本例未使用

         case 4:break;  //CCR2比较/捕获寄存器的中断入口,本例未使用

         case 10: P1OUT^=0x01;break; //定时器A在溢出中断向量入口,本例使用

}

}

本例使用的是定时器A的溢出中断来实现的功能。

 

第二个例子我们使用定时器A的增计数模式,选择外接信号源的ACLK信号作为计数器的信号源,信号源为32KHZ的手表晶振,通过定时器A模块中的CCR0捕获/比较寄存器的值与定时器A的值进行比较。如果比较相等就产生CCR0中断,进入TimerA中断服务程序进行中断处理。产生计数中断时候通过P1.0的取反表现出来。

/*************************************************************************

说明:用32kHZ钟表晶振和定时器中断实现精度秒的LED闪烁

************************************************************************/

#include<msp430x24x.h>

voidmain(void)

{

  WDTCTL=WDTPW+WDTHOLD; //关闭看门狗

  TACTL=TASSEL0+TACLR;    //ACLK,清TAR

  CCTL0=CCIE;             //CCR0中断允许

  CCR0 = 16384;           //设定中断间隔,kHZ晶振,0.5s

  P1DIR |= 0x01;          //P1.0为输出

  TACTL = MC0;            //Timer_A为增计数模式

  _EINT();                //中断允许

  for(;;)

  {

    _BIS_SR(CPUOFF);

    _NOP();

  }

}

#pragmavector= TIMERA0_VECTOR    //Timer_A中断函数

__interrupt void Timer_A(void)

{

  P1OUT ^= BIT0;

}

 

例子三通过定时器A输出周期一定占空比不同的两个PWM矩形波,使用到了计数模块,捕获/比较模块,以及输出模块。

/*************************************************************************

*名称:pwm

*功能:利用Timer_A输出周期为512/32768=15.625ms、占空比分别为75%和25%的PWM矩形波

*入口参数:无

*出口参数:无

*说明:处于仿真的需要使用P1.0口属于Timer_A的系统时钟,使用的msp249可以选择多组

pwm输出 在此 使用P1.2和P1.3

************************************************************************/

#include<msp430x24x.h>

void main(void)

{

  WDTCTL=WDTPW+WDTHOLD;

  TACTL=TACLR;

  CCR0 = 512-1;

  CCTL1=OUTMOD_7;

  CCR1=384;

  CCTL2=OUTMOD_7;

  CCR2=128;

  P1DIR|= 0x04;

  P1SEL|= 0x04;

  P1DIR|= 0x08;

  P1SEL|= 0x08;

  TACTL |= MC0;

  for(;;)

  {

    _BIS_SR(LPM3_bits);

    _NOP();

  }

}

由仿真图可以对运行结果有直观的查看,P1.2输出了占空比为75%的PWM矩形波,P1.3输出了占空比为25%的矩形波。