社区导航

 
查看: 1001|回复: 0

[资料分享] 给你写的launchpad430--TIMER--系列1

[复制链接]

3360

TA的帖子

421

TA的资源

五彩晶圆(中级)

Rank: 8Rank: 8

荣誉会员勋章

发表于 2013-11-29 19:54:24 | 显示全部楼层 |阅读模式
技术说明 20131106220036656.jpg
如图所示。。。在使用定时器之前,我们首先应该清楚我们将用这个定时器干什么,430的定时器功能比较丰富,
有定时、比较、捕获。
定时很好理解,就是设定好输入时钟以及计数个数后,定时器就会在输入时钟周期个数达到设定个数后发生中断,
你可以在中断中添加自己的处理程序。
定时器的模式有几种方式:STOP、UP、Continuous、UP/DOWN
20131106220942125.jpg
这种模式就是定时器计数个数达到TACCR0寄存器中的数目时,发生TACCR0 CCIFG中断。
注意:此模式在定时器从TACCR0到0转变时也会发生TAIFG中断。


其他模式类似。


20131106220052546.jpg
提示:建议在修改寄存器前,停止定时器。
          定时器在设置除STOP外都立即开始计数。
信号源的选择
  • 硬件
20131107102808171.jpg
  • 软件
如果使用外部输入信号,在硬件设计上就应该连接这个引脚。

相关设置



  • CCTL0 = CCIE;                             // CCR0 interrupt enabled  
  • CCR0  = 50000;  
  • TACTL = TASSEL_2 + MC_1;                  // SMCLK, upmode  

从代码来看,我们应先设置相关的寄存器,然后启动定时器,也就是说定时的启动应该在最后。



多个中断的写法
20131107103126875.jpg
查看头文件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是每次溢出的时候中断。
此帖出自MSP430论坛


回复

使用道具 举报

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

本版积分规则

  • 论坛活动 E手掌握

    扫码关注
    EEWORLD 官方微信

  • EE福利  唾手可得

    扫码关注
    EE福利 唾手可得

小黑屋|手机版|Archiver|电子工程世界 ( 京ICP证 060456

GMT+8, 2018-8-15 12:52 , Processed in 0.054171 second(s), 18 queries , Gzip On, Redis On.

快速回复 返回顶部 返回列表