给你写的launchpad430--TIMER--系列1

这篇博客详细介绍了如何在launchpad430上使用TIMER,从技术说明到信号源选择,包括硬件和软件配置,再到相关设置的详细步骤,最后提供了完整的例程供读者参考学习。
摘要由CSDN通过智能技术生成

技术说明


如图所示。。。在使用定时器之前,我们首先应该清楚我们将用这个定时器干什么,430的定时器功能比较丰富,
有定时、比较、捕获。
定时很好理解,就是设定好输入时钟以及计数个数后,定时器就会在输入时钟周期个数达到设定个数后发生中断,
你可以在中断中添加自己的处理程序。
定时器的模式有几种方式:STOP、UP、Continuous、UP/DOWN

这种模式就是定时器计数个数达到TACCR0寄存器中的数目时,发生TACCR0 CCIFG中断。
注意:此模式在定时器从TACCR0到0转变时也会发生TAIFG中断。

其他模式类似。


提示:建议在修改寄存器前,停止定时器。
          定时器在设置除STOP外都立即开始计数。

信号源的选择

  • 硬件

  • 软件
如果使用外部输入信号,在硬件设计上就应该连接这个引脚。

相关设置

  CCTL0 = CCIE;                             // CCR0 interrupt enabled
  CCR0  = 50000;
  TACTL = TASSEL_2 + MC_1;                  // SMCLK, upmode
从代码来看,我们应先设置相关的寄存器,然后启动定时器,也就是说定时的启动应该在最后。

多个中断的写法

查看头文件TAIV = TA0IV,这里只有CCR1、CCR2的中断,CCR0有自己的中断。
具体一点说
CCR0对应中断TIMER0_A0_VECTOR;CCR1、CCR2、TA0溢出对应TIMER0_A1_VECTOR。
// Timer_A3 Interrupt Vector (TA0IV) handler
#pragma vector=TIMER0_A1_VECTOR
__interrupt void Timer_A(void)
{
 switch( TA0IV )
 {
   case  2: 
            // CCR1_hander();
            break;                          // CCR1 not used
   case  4: 
            // CCR2_hander();
            break;                          // CCR2 not used
   case 10: P1OUT ^= 0x01;                  // overflow
            break;
 }
}

完整例程

#include <msp430.h>

int main(void)
{
  WDTCTL = WDTPW + WDTHOLD;                 // Stop WDT
  P1SEL |= 0x06;                            // P1.1 - P1.2 option select
  P1DIR |= 0x07;                            // P1.0 - P1.2 outputs
  CCTL0 = OUTMOD_4 + CCIE;                  // CCR0 toggle, interrupt enabled
  CCTL1 = OUTMOD_4 + CCIE;                  // CCR1 toggle, interrupt enabled
  TACTL = TASSEL_2 +  MC_2 + TAIE;          // SMCLK, Contmode, int enabled

  _BIS_SR(LPM0_bits + GIE);                 // Enter LPM0 w/ interrupt
}

// Timer A0 interrupt service routine
#pragma vector=TIMER0_A0_VECTOR
__interrupt void Timer_A0 (void)
{
  CCR0 += 200;                              // Add Offset to CCR0
}

// Timer_A2 Interrupt Vector (TA0IV) handler
#pragma vector=TIMER0_A1_VECTOR
__interrupt void Timer_A1(void)
{
  switch( TA0IV )
  {
  case  2: CCR1 += 1000;                    // Add Offset to CCR1
           break;
  case 10: P1OUT ^= 0x01;                   // Timer_A3 overflow
           break;
  }
}
该例程开启了三个中断CCR0、CCR1和TAC,且工作在Continue Mode,所以CCR0是每200时钟中断、CCR1是每1000时钟中断、TAC是每次溢出的时候中断。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值