206|0

726

帖子

0

资源

纯净的硅(初级)

MSP430G2553 定时器中断实例

#include "MSP430G2553.h"

void led_init();
void timer0_init();

void main( void )
{
  // Stop watchdog timer to prevent time out reset
  WDTCTL = WDTPW + WDTHOLD;

  //--配置时钟-----
  BCSCTL1=CALBC1_1MHZ;
  DCOCTL=CALDCO_1MHZ;

  //--LED初始化----
  led_init();     

  //--定时器0初始化----
  timer0_init();

  //---开中断------
  _EINT();      //开中断

  LPM3;


}

/*
 *    定时器0中断函数
 */
#pragma vector=TIMER0_A0_VECTOR
__interrupt void Timer0_A0(void)    //TACCR0中断

  P1OUT^=(1<<6);    //LED反转
}

#pragma vector=TIMER0_A1_VECTOR
__interrupt void Timer0_A1(void)    //TACCR1中断,TACCR2中断和TA0溢出中断共用一个中断向量

  switch(TAIV)
  {
  case 2:                           //TACCR1中断
    P1OUT^=(1<<6);    //LED反转
    break;
  case 4:                           //TACCR2中断
    P1OUT^=(1<<6);    //LED反转
    break;
  case 10:                          //TAIFG 溢出中断
    P1OUT^=(1<<6);    //LED反转
    break;
  default:
    break;
  }

}

// LED 初始化
void led_init()
{
  P1DIR|=(1<<6);  
}

// 定时器初始化
void timer0_init()   
{
  /*
   *设置TIMER_A的时钟
   *TASSEL_0: TACLK,使用外部引脚信号作为输入
   *TASSEL_1: ACLK,辅助时钟
   *TASSEL_2: SMCLK,子系统主时钟
   *TASSEL_3: INCLK,外部输入时钟 
  */
  TACTL |= TASSEL_1;    

  /*
   *时钟源分频
   *ID_0: 不分频
   *ID_1: 2分频
   *ID_2: 4分频
   *ID_3: 8分频
   */
  TACTL |= ID_0;    

  /*
   *模式选择
   *MC_0: 停止模式,用于定时器暂停
   *MC_1: 增计数模式,计数器计数到CCR0,再清零计数器
   *MC_2: 连续计数模式,计数器增计数到0XFFFF(65535),再清零计数器
   *MC_3: 增减计数模式,增计数到CCR0,再减计数到0
   */
  TACTL |= MC_1;  //增计数模式

  //----计数器清零-----
  TACTL |= TACLR; 

  //----设置TACCRx的值-----
  //TACCR0=32768-1;     //时钟是32.768K,那么值设为32678-1 
  TACCR0=30000;
  TACCR1=10000;         //TACCR1和TACCR2要小于TACCR0,否则不会产生中断 
  TACCR2=20000;

  //----中断允许----
  TACCTL0 |= CCIE;      //TACCR0中断
  TACCTL1 |= CCIE;      //TACCR1中断
  TACCTL2 |= CCIE;      //TACCR2中断
  TACTL |= TAIE;        //TA0溢出中断

}

注意事项
  需要注意的是在增计数模式时CCR1和CCR2的值应该小于CCR0,否则CCR1和CCR2不会产生中断。 并且每次CCR1和CCR2中断后要把它们重新赋值这样才能保证CCR1和CCR2的中断间隔时间不变。
  类似语句如下:
  CCR1 += 100;
  if ( CCR1 >= 32768 )
    CCR1 -= 32768;

 


回复
您需要登录后才可以回帖 登录 | 注册

关闭
站长推荐上一条 1/7 下一条

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区知春路23号集成电路设计园量子银座1305 电话:(010)82350740 邮编:100191

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2020 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表