1921|0

2781

帖子

419

TA的资源

五彩晶圆(中级)

楼主
 

给你写的launchpad430--TIMER--系列1 [复制链接]

技术说明
如图所示。。。在使用定时器之前,我们首先应该清楚我们将用这个定时器干什么,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   
  •   
  • 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是每次溢出的时候中断。
 
点赞 关注
个人签名

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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

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

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

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