TI - MCU - MSP430使用指南13 -> Timer定时器模块

2020-01-16来源: eefocus关键字:MSP430  使用指南  Timer  定时器模块

定时器,作为MCU最重要也是最基本的功能集成在每一个MCU中。随着MCU功能的日渐强大,定时器的功能也越来越强大,因此配置和使用起来也就比较麻烦,下面我们针对MSP430的Timer模块进行详细讲解,配合多种可以直接使用的例程,方便用户直接移植和深入理解。


首先,普及一下定时器知识:本质上就是一个计数器,可以由用户自定义计数的值,同时到达计数值后可以执行相应的动作,因此可以时间周期性动作,采集捕捉动作等,用于实时控制及多种功能实现。


MSP430 MCU中有三种定时器:Timer_A   Timer_B   Timer_D.


首先 Timer_D定时器基本没有集成在MCU中,很少很少使用,是一个高分辨率的定时器,因此我们不做讲解(内部寄存器和使用与Timer_A/B很是相似,如果有用户用到,可以直接参考,如果有人需要可以留言,我会开贴再次单独讲解Timer_D)。


因此本次内容主要讲解一下Timer_A和Timer_B定时/计数器。首先先说一下MSP430 MCU内部Timer的主要功能:


16位定时/计数器,支持四种工作模式/计数模式:STOP  UP Continuous UP/DOWN

输入捕捉功能

输出比较功能,即PWM波功能

主要就这三种功能,用户在使用过程中也就是这三种功能,然后Timer有一些自己的特点:


时钟源可以选择

异步输入,输出所存

中断向量寄存器等

那么为什么MSP430会有两种定时器呢:A和B,有什么区别呢:


B可以配置成8,10,12,16位模式,A只能用16位模式

B的CCRn寄存器是双缓冲,即Double-buffered,可以形成组

B的每一个输出口都可配置成高阻态

B中没有SCCI位

什么?不懂?没事,等我讲解完Timer所有功能后你就了解了,如果有疑问请接着往后看,最后在讲解完之后,我会重新详细分析一下Timer_A和Timer_B的区别。


首先先了解一下Timer_A的内部结构图,从下图可以看到,内部的定时器位数是16位,同时支持TAxCLK,ACLK,SMCLK,INCLK作为时钟源,后可以进行进一步的分频使用,同时拥有7个比较输出模块,可用于输出PWM波(注意 一个Timer只能输出6个PWM波,因为有一路计数器需要作为base使用:在可以调节PWM频率和占空比的情况下)

内部结构图决定的是模块的实现方式,因此可以清晰地看出实现的原理和寄存器中每个位的作用,因此最好养成观看内部结构图的习惯,这样有利于高效地调试自己的程序,当然现在刚开始看起来有点懵,不太理解也比较正常,但当学习完整个Timer后,对比着程序来看就会恍然大悟。


好啦,下面开始进入Timer地核心内容区域:使用模式。


简单来说就是如何使用它,怎么使用,有几种使用方法。对于MSP430 Timer_A定时器来说,总共有四种工作模式,如下图所示,由寄存器TAxCLT中MC位决定,如下图所示:

模式0:默认模式,即Stop,此模式下定时器内部不会开始计数,处于停止状态。

模式1:Up模式,此模式下定时器从0开始计数,一直计数到TAxCCR0寄存器中地值为止产生中断(如果使能了中断)并重新回到0,再次开始计数,如下图所示:

在使用这种模式下,中断在什么时候产生呢?这时候就要弄清楚一个问题:Timer_A模块  有两种中断:TAxIFG(定时器中断)和TAxCCRx(捕捉/比较中断),TAxIFG时定时器的基本中断,一个定时器模块只有一个,就是当内部计数到设定值后就会产生,TAxCCRx时输入/比较中断,其实内部就一个定时器在计数,但是有不同通道的几个值可以设定,也就是TAxCCRx寄存器,因此当相对应的通道设定了值之后,则会触发相应的中断。


触发中断的时间如下图所示:

TAxIFG是在计数完CCR0后会产生的,TAxCCR0中断时在计数完CCR0-1后产生的,两者相差一个时钟位。不过在使用过程中,基本可以忽略了,只是在理论上了解一下更好。


那么还有一个问题:当前的计数值是在寄存器TAxR(看内部结构框图可以发现)中的,TAxCCR0只是设定一个值,那么当模式从Stop开始到Up模式时,TAxR的值不一定为0,那么设定就会出现两个情况:


当设定CCR0值时,TAxR值小于CCR0的值,那么定时器从当前值(TAxR)开始计数,计数到CCR0值后产生中断,回到0,从新开始计数。。。。。

当设定CCR0值时,TAxR值大于CCR0的值,那么计数器会直接回到0,从0开始计数。

因此这个时候就会出现两种情况,然而你在设定时如果不去检查TAxR的值,那么可能对于第一个周期,就会出现不同的结果。为了避免这个情况,建议在设定CCR0值的时候,将MC设置成Stop模式(TI建议),其实这时候不仅仅应该设置成Stop模式,最重要的是要将TACLR设置成1(注意这个位是TAxR清除位,直接设置成1后会自动清0,去读的话 也都是0)。


模式2:Continuous模式,此模式下定时器从0开始计数,一直计数到0xFFFF为止产生中断(如果使能了中断)并重新回到0,和Up模式地区别就是Up是计数到TAxCCR0(用户自己设定)值,而Continuous模式是直接计数到0xFFFF,这个值是固定的,不能设置,这样的话,定时器溢出的之间只能由计数频率决定了。如下图所示:

这种模式下,仅有TAxIFG中断会用到,因为没有设定CCR寄存器,也不需要这个寄存器,产生中断的时刻如下图所示:

在完成0xFFFF计数后才会产生中断。那么当工作在Continuous模式下 CCRx就不能使用了吗?


NO,也可以使用,而且可以根据客户的需求来定义不同占空比 不同形状的波形,如下图所示,使用两个CCRx时可以产生的中断(加上TAxIFG中断会更多,灵活使用):

上图可以看到,在CCR0和CCR1处都会产生中断,同时TAxIFG也是存在的。这种模式下在设定CCRx值时就仅有一种情况了,因为TAxR一直在计数,因此设定CCRx值时并不影响计数,只是看什么时候会产证中断而已,如果当前计数到10000,你设定10001,那么下一个时钟就会中断,如果当前10000,你设定9999,那么需要等下一次TAxR值等于9999时才能产生中断了,与Up模式不同的时,设定CCRx的值,不会改变或影响TAxR的值。


模式3:Up/down模式,这个模式下和Up比较类似,唯一的区别是Up模式下计数到TAxCCR0时会产生中断并再次从0开始,但是Up/down模式下则不会从0开始,而是从现在值开始往下计数(减计数),如下图所示:

触发中断的时间如下图所示:

TAxIFG会在计数到0(计完1)后触发,CCIFG会在计数完CCR0-1后触发。


那么改变CCRx值时是什么状况呢?


当设定CCR0值时,TAxR值小于CCR0的值,那么定时器从当前值(TAxR)开始计数,不影响TAxR的值。

当设定CCR0值时,TAxR值大于CCR0的值,那么计数器会立刻开始递减,进行减计数,减到0后再开始递增计数,最后正常工作。

因此此时设定CCRx值时,推荐和Up模式下保持一致。

上图显示的是在Up/down模式下CCRx使用方式,当然 这个也是PWM的输出方法,由CCR0通道作为base计数,用于调节PWM的频率,CCRx则用来调节占空比,而且还支持多种输出模式。这个模式的区别,后面会详细讲解。


到此处位置,Timer_A的四种工作模式,其实就三种(除去Stop)已经全部讲解完成,本质上也就是每个定时器模块内有一个计数器,一直在计数,然后有一些CCRx寄存器,可用于用户设定相应的值,当计数到这个值时产生相应的中断,去执行相应的操作。那么如何使用描述的这些功能呢? 我认为需要了解五块内容,会和你的使用息息相关:


中断方式,寄存器,输入捕捉,输出比较(PWM),例程。


下面按照这种方法来进行讲解(比较乱,但是我认为这种方式比较合理,先搞清楚定时器原理及模式,在进一步细看寄存器,中断实现方式,在面向使用去了解输入捕捉和输出比较,最后进行例程的学习)。


Timer_A定时器的中断

在细看完上面的讲解后,你可能会有个印象,Timer_A模块有两种中断:TAxIFG和TAxCCRx中断,那么中断向量如何呢?(中断向量是中断的入口)


如果拆开看有8个中断:TAxIFG,CCR0IFG-CCR6IFG,每个都分配一个中断向量? 太浪费了吧! 因此MSP430只分配了两个中断向量:


TAxCCR0自己单独一个中断向量,名字叫做:TIMER0_A0 (TimerA0),这个不需要记,去看工程下的cmd文件即可。


剩下的TAxIFG和TAxCCRx共同享用一个中断向量:TIMER0_A1 (TimerA0),因此你会发现每个定时器仅有两个中断向量,也就够使用了,那么如何用呢?


对于CCR0中断:


// Timer0_A0 interrupt service routine

#pragma vector = TIMER0_A0_VECTOR

__interrupt void Timer0_A0_ISR (void)

{

  P1OUT ^= BIT0;

}

对于其他中断,进入中断后需要进行中断类型判断:


// Timer0_A1 Interrupt Vector (TAIV) handler

#pragma vector=TIMER0_A1_VECTOR

__interrupt void TIMER0_A1_ISR(void)

{

  switch(__even_in_range(TA0IV, TA0IV_TAIFG))

  {

    case TA0IV_NONE:   break;               // No interrupt

    case TA0IV_TACCR1: break;               // CCR1 not used

    case TA0IV_TACCR2: break;               // CCR2 not used

    case TA0IV_TACCR3: break;               // reserved

    case TA0IV_TACCR4: break;               // reserved

case

[1] [2] [3]
关键字:MSP430  使用指南  Timer  定时器模块 编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic485834.html 本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:MSP430 - G2553之串口操作
下一篇:MSP430定时器 TIMER0_A1_VECTOR

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

如何提高MSP430 C语言代码的执行效率
关于代码效率———————MSP430系列的程序设计准则,有利于提高代码效率。应该指出,这些准则基本上是基于MSP430系列的硬件结构特点而提出的。1.位域类型的执行时很慢的,所以应当在仅仅为了节省数据存储空间时才使用位域方式。如果用户必须使用位域存储,可以用char或unsigned int的位屏蔽操作来代替位域操作。2.在模块之外不使用的变量应当声明为static,这样在编译时有可能使这些变量分配在寄存器中暂存,从而提高了代码效率。3.尽可能使用unsigned数据类型。许多情况下,对unsigned数据类型的操作,比对signed数据类型的操作效率更高,尤其对于除法和求模运算更是如此。4.程序设计中应该使用ANSI-C原型
发表于 2020-01-19
MSP430 Flash信息区
430单片机,一般具有内部的信息区,以便保存一些需要EEPROM才可保存的数据。 在论坛没有收到相关信息,就借用网上的,抛砖引玉,如果有什么问题,多多指正,一起掌握! MSP430 FLASH型单片机的FLASH存储器模块根据不同的容量分为若干段,其中信息存储器SegmengA及SegmentB各有128字节,其他段有512字节。SegmentB的地址是:0x1000到0x107F,SegmentA的地址是:0x1080到0x10FF。其他段的地址根据容量不同,从0xFFFF开始,每512字节为一段进行分配。 FLASH存储器写入数据时,每一位只能由“1”变成“0”,不能由“0”变成“1“,因此,当我
发表于 2020-01-19
关于MSP430-Flash超过64K的读写操作方法
下面例子是Qiaohaikun先生几年前一直用在MSP430FG4618...使用过的,一直都挺好使。希望在此分享出来能帮助到有需要的网友们。同样,希望各网友们如有精品程序例子的话同样可以发贴到微控论坛来。人人为我,我为人人! 运行代码  #include "msp430xG46x.h"  void WriteFlashErrorNum(void);  //----------------------------------------------------------------------  //功能:从flash中
发表于 2020-01-19
MSP430 开发注意事项要求
以下是在使用MSP430中的一些总结: 1.系统时钟问题: 系统默认使用DCO,使用外部高速晶振XT2时必须自己开启XT2,并延时50us等待XT2起振,然后手工清除IFG1中的OFIFG位 !!!!一定要注意操作顺序:打开XT2->等待XT2稳定->切换系统时钟为XT2 若后面两步操作反了,在通常情况下不会出现问题,但是在电压不稳MCU频繁复位的情况下,非常容易造成MCU死掉,只能掉电后重新上电才能可靠复位。2.早期版本的IAR开发环境 必须在Project->Option->C-Spy中选择对应器件的DDF文件,否则调试时无SFR窗口。3.在写Flash
发表于 2020-01-19
MSP430实现简单的对临界资源的冲突访问
实现对临界资源的冲突访问__monitor int get_lock(void){if (the_lock == 0) {  /* Success, we managed to lock the lock. */  the_lock = 1;  return 1; }else {  /* Failure, someone else has locked the lock. */  return 0;  } }/* release_lock -- Unlock the lock. */ __monitor void relea
发表于 2020-01-19
msp430硬件II2C
msp430系列硬件I2C操作24LC128程序说明:24lc128为美信公司EEPROM存储器,存取空间为128kbit。具体的通信规则可以看其器件手册。 ***************************************************************************************/ 运行代码 /*******************************************************************************  包含头文件  
发表于 2020-01-19
小广播
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

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