当前位置:文档之家› MSP430 定时器A

MSP430 定时器A

上次Cloud和大家一起学习完了MSP430的时钟配置,这一篇,我们来学习MSP430单片机的TimerA(定时/计数器A)。

MSP430单片机的TimerA具有非常强大的功能,相关的寄存器配置也相当复杂,Cloud花了好久才逐步理清学习思路,尤其是学习数据手册的相关描述。

在这里Cloud提醒大家,虽然现在网上有中文汉化版的数据手册,但Cloud阅读英文原版后对比发现还是英文原版对器件特性描述得更加清楚,而中文汉化版的省略掉了一些内容。

好吧,扯远了。

下面进入正题:一、MSP430的Timer结构首先让我们通过官方描述来初步了解一下MSP430单片机的Timer资源:定时器A是一个16位的定时/计数器。

定时器A支持多重捕获/比较,PWM输出和内部定时。

定时器还有扩展中断功能,中断可以由定时器溢出产生或由捕获/比较寄存器产生。

定时器A的特性包括:·四种运行模式的异步16位定时/计数器·可选择配置的时钟源·可配置的PWM输出·异步输入和输出锁存·对所有TA中断快速响应的中断向量寄存器MSP430G2553单片机共有两个TimerA,分别是Timer0A和Timer1A。

OK,零零总总说了这么多,大家一定带有很多的疑惑,比如什么叫“捕获/比较”等,这里Cloud先不作解释,会用才是王道。

我们呢先找来定时器A的结构图给大家初步了解一下定时器A的结构:我们先从上面部分开始解释。

中间红色的是一个16位的TimerA,TAR,这其实就是MSP430单片机内部的一个定时计数器了,类似于51中的TH0和TL0的合体。

既然可以拿来计时,那么肯定可以有时钟信号输入,让我们最左边黄色的框,是一个选择器,由上面的TASSEL来选择TACLK、ACLK、SMCLK、INCLK的其中一种时钟。

上次我们已经学习过ACLK和SMCLK,也知道如何配置这两个时钟了(这也是为什么先学习时钟的原因),另外两个是外部时钟源,其中TACLK可以由P1.0输入。

跟在时钟源后面的是一个分频器,由ID来控制,将时钟源的时钟信号1、2、4、8分频后作为定时/计数器的时钟源。

TAR右边的蓝色框代表TimerA在计数模式下由MC来控制TAR的四种计数方式。

同时我们还注意到TAR的左下方有一个TACLAR连接至TAR的Clear端,显然是清零作用的,数据手册还告诉我们置位TACLAR,不但会清零TAR的计数值还会清除时钟分频信息。

TACLAR 一旦置1,会自动归零,所以可以当做是TimerA的复位按钮。

再看下半部分的CCR2,CCR2是TimerA的其中一个独立的捕获/比较单元,其实在MSP430G2553中,还有CCR0和CCR1(连接上半部分和下半部分的虚线省略处),其结构和CCR2基本一致。

我们可以看到从上面TAR输出的空心粗箭头指向了TACCR2和Comparator2,TACCR2是RRC2的捕获/比较寄存器,虚线框左上角部分表示了TimerA的捕获通道,用于将CCIS所选择的信道经过所选择的捕获模式和同步操作传递给TACCR2。

虚线框下半部分表示不同的输出模式的信号输出逻辑。

二、Timer相关寄存器介绍OK,Cloud基本为大家介绍了TimerA的结构,确实略复杂。

按照以往教程惯例,Cloud 先从寄存器开始和大家一起学习(这里提醒大家,在msp430头文件中,很多不同标示符的定义其实都来自同一个对象,在MSP430G2553中,有Timer0A和Timer1A,相关的寄存器有TA0CTL、TA0CCR0、TA1CTL、TA1CCR0等,由于这两个时钟基本一样,这里就只以Timer0A为例。

Timer0A的相关寄存器可以将TA0字样省略为TA,例如TACTL=TA0CTL、TACCR0=TA0CCR0等,大家在实际使用和学习时要知道这两种表示方式都是一样的):1、TA0CTL:TimerA控制寄存器TA0CTL TimerA控制寄存器15141312111098------TASSEL1TASSEL0 76543210 ID1ID0MC1MC0-TACLR TAIE TAIFG TA0CTL(也可以写TACTL)负责设置TimerA的时钟来源、分频系数、计数模式、复位信号以及相关的中断允许和中断标志位:·9~8-TASSEL:用来设置TimerA的时钟来源0:TACLK 1:ACLK 2:SMCLK 3:INCLK·7~6-ID:用来设置输入时钟信号经过多少分频驱动TAR 分频系数=2ID·5~4-MC:用来设置TimerA的计数模式0:停止模式1:增模式2:连续模式3:增减模式·2:TACLR:TimerA清零位,该位置位会复位TAR,时钟分频和计数方向,完成后TACLR自动清零·1:TAIE:TimerA中断允许位,用来允许TAIFG中断请求0:中断禁止1:中断允许·0:TAIFG:TimerA中断标志位0:无中断挂起1:有中断挂起2、TA0R:TimerA寄存器TA0R TimerA寄存器15141312111098X X X X X X X X76543210X X X X X X X XTA0R(也可以写TAR)是一个用来存放当前计数值的一个16位的寄存器,类似于51的TH0和TL0的合体。

3、TA0CCRx:TimerA捕获比较寄存器xTA0CCRx TimerA捕获比较寄存器x15141312111098 X X X X X X X X 76543210 X X X X X X X X TA0CCRx(也可以写TACCRx)是一个用来存放定时计数器捕获值的16位寄存器,在MSP430G2553中x可以是0、1、2,对应相应的TA0CCTLx。

另外TA0CCR0还可以用来设置TimerA计数模式中增模式和增减模式的峰值,详细后面将会讲。

4、TA0CCTLx:TimerA捕获比较控制寄存器xTA0CCRx TimerA比较控制寄存器x15141312111098 CM1CM0CCIS1CCIS0SCS SCCI-CAP 76543210 OUTMODE2OUTMODE1OUTMOD0CCIE CCI OUT COV CCIFG TA0CCTLx(也可以写TACCTLx),在MSP430G2553中x可以是0、1、2(其他型号单片机可能有更多的支持,详细看相关数据手册),对应相应的TA0CCRx,TA0CCTLx定义了很多TimerA捕获比较控制控制相关的位,让我们来一一学习:·15~14-CM:捕获模式控制寄存器0:不捕获1上升沿捕获2:下降沿捕获3:上升和下降沿都捕获·13~12-CCIS:捕获比较选择,该位选择TA0CCRx的输入信号,·11-SCS:同步捕获源,该位用于将捕获通信和时钟同步0:异步捕获1:同步捕获·10-SCCI:同步的捕获/比较输入,所选择的CCI输入信号由EQUx信号锁存,并可通过该位读取·8-CAP:比较/捕获模式选择0:比较模式1:捕获模式·7~5-OUTMODE:输出模式位,由于在模式2、3、6、7下EAQUx=EQU0,因此这些模式对TA0CCRx无效0:OUT位的值1:置位2:翻转/复位3:置位/复位4:翻转5:复位6:翻转/置位7:复位/置位·4-CCIE:捕获比较中断允许位,该位允许相应的CCIFG标志请求0:中断禁止1:中断允许·3-CCI:捕获比较输入,所选择的输入信号可以通过该位读取·2-OUT:输出状态位,对于输出模式0,该位直接接控制输出状态0:输出低电平1:输出高电平·1-COV:捕获溢出位,该位表示一个捕获溢出发生。

COV必须由软件复位0:没有捕获溢出发生1:有捕获溢出发生·0-CCIFG:捕获比较中断标志位0:没有中断挂起1:有中断挂起三、Timer的四种计数模式下面让我们来看一下TimerA的4种计数模式,这也是后面TimerA计数和捕获/比较的基础:1、MC=0:Stop(停止模式),这个模式下TimerA停止计数;2、MC=1:Up(增模式),在这个模式下,TimerA的TAR会自动从0开始一直计数至TA0CCR0,并不断重复计数,注意,此时的TA0CCR0比较特殊,将不作为捕获/比较的作用,和TA0CCR1、TA0CCR2起不同作用。

如果在设置增模式时TAR值比TACCR0大,那么TAR会立刻重新从0开始计数,其波形如图所示:在增模式下,TACCR0 CCIFG中断标志将在TAR计数至TACCR0时被置1。

TAIFG中断标志将在TAR从TACCR0跳至0时被置1,下图描述了这两个标志位的置位时序:对于如何理解TAIFG和CCIFG何时置位问题,这里Cloud的解读是,TAIFG是在TAR 归零的时候置1的,而CCIFG是在TAR计数至TA0CCR0时置1的。

另外,当TA0CCR0在TimerA运行过程中发生改变时(Timer工作在增模式下),如果新的TA0CCR0的值比当前TAR计数的值要大,则TAR继续向上计数至新的TA0CCR0,反之,TAR将立即归零;3、MC=2:Continuous(连续模式),在这个模式下,TimerA的TAR会自动从0开始计数至0xFFFF然后归零,并不断重复计数。

此时的TA0CCR0将和TA0CCR1、TA0CCR2一样起到捕获/比较的作用。

连续模式下的TAR计数波形如下图所示:在连续模式下,TAIFG中断标志将在TAR从0xFFFF溢出至0的时候置1,如下图(由于这里没有专门用到TA0CCR0所以就不关心CCIFG,这里同样符合我们前面对中断标志置位问题的分析):官方手册还对连续模式的应用作了介绍:连续模式可以用于产生独立的时间间隔和输出频率。

当每个时间间隔完成时就产生一个中断。

下一个时间间隔的值在进入中断服务子程序时写入TA0CCRx。

下图显示了2个独立的而时间间隔t0和t1写入捕获/比较寄存器。

在该应用中,时间间隔由硬件而不是软件控制,与中断响应没有冲突:这里,稍微解释一下上面的图,锯齿波是TAR产生的,从0增至0xFFFF单调循环。

TACCR0a和TACCR1a分别是两个捕获/比较寄存器的值(初始值),为了产生t0和t1两个时间间隔,我们可以让中断响应我们的CCIFGx中断响应(因为CCIFGx是和TA0CCRx 相关联的)。

这里例子的做法是在每次由于CCIFGx中断响应的时候,相应的将TACCRx 加上tx(比如TACCR0a + t0得到TACCR0b),然后TAR继续计数(不管是否退出中断),然后计数到下一个周期的时候自然又产生的TA0CCRx的CCIFGx中断,由此我们得到了连续时间间隔;4、MC=3:Up/Down(增减模式),在这个模式下,TimerA的TAR会自动从0开始计数至TA0CCR0然后从TA0CCR0-1自动减至0,并不断重复计数(可以看出,此时TA0CCR0又作为了周期寄存器来使用而不是捕获/比较寄存器)。

相关主题