http://blog.lehu.shu.edu.cn/879836630/A449667.html

六、定时器Timer_A

 

                        MSP430F5529共有两类共4个定时器,分别是Timer_A定时器3个和Timer_B定时器1个,按照每个寄存器配备的捕获/比较器的个数分别命名为Timer0_A(内有5个捕获比较器)、Timer1_A(3个)、Timer2_A(3个)、Timer0_B(7个)。

                        这一章,我们讲定时器Timer0_A.(A类的都一样)

注意:下面所提到的所有寄存器,在TA后面插入0或1或2就分别表示Timer0_A、Timer1_A、Timer2_A(我这里省略了数字)

 

定时器很重要啊!

6.1 简介一下

          定时器A是一个复合了捕获/比较寄存器的十六位的定时(加减)计数器。定时器A支持多重捕获/比较,PWM输出和内部定时,具有扩展中断功能,中断可以由定时器溢出产生或由捕获/比较寄存器产生。

特征简介:

                                      ○四种运行模式的异步16位定时/计数器

○自身时钟源可选择配置

○最多达5个可配置的捕获/比较寄存器(CCR)

capture/compare registers

○可配置的PWM输出

○异步输入和输出锁存

○对所有Timer_A中断快速响应的中断向量寄存器

 

下面这张图形象的解释了Timer_A的结构特性

     

             6.2 TA(Timer_A)的几个基本操作设置(含寄存器介绍及设置)

                 声明:所有寄存器同样支持字和字节操作,不要忘记这是什么意思

                           所有寄存器初始化都为0x0000

6.2.1 TA控制寄存器TACTL(最常用最基本)

              再次说明一下例如:TA0CTL、TA1CTL、TA2CTL分别表示3个不同 

  定时器A的控制寄存器

                                   rw-(0)表示默认读写均为0

TASSELx :时钟源选择。尽量不要选TASSEL0-TACLK外部时钟源,因为如果TACLK和CPU时钟不同步,很容易出问题。(TA0CLK接P1.0引脚)

00 TACLK

01 ACLK

10 SMCLK

11  ~TACLK

IDx:第一次分频控制。ID0-1分频;ID1-2分频;ID2-4分频;ID3-8分频

MC:工作模式控制。(建议在修改定时器运行模式前先停止定时器(中断使能、中断标志、TACLR例外),以避免产生未知的误操作。)

00 停止模式:定时器停止

01 增模式: 定时器计数到TACCR0

10 连续模式,定时器计数到0FFFH

11增减模式:定时器加计数到TACCR0然后减计数到0000H

TACLR:定时器清零位。该位置位会复位TA寄存器,时钟分频和计数方向。

TACLR位会自动复位并置0

TAIE:定时器中断使能

0:中断禁止

1:中断允许

TAIFG:中断标志位

0:没有中断发生

1:有中断挂起

            6.2.2  计数值存放寄存器TAR

                 ①显然,最大存放计数值为0xFFFFh;

(类似51单片机)可以被用来存放一个初值,然后选用连续模式。这样不断计满再手动填充,从而达到精确计时的效果;

默认为0,且对该寄存器可以直接赋值;

           6.2.3  扩展寄存器TAEX0

                 很简单,这个寄存器就是为了控制时钟源的二次分频(看结构图)。

该寄存器的低3为定义为TAIDEX:000-111分别表示1-8分频

           6.2.4 捕获/比较寄存器TACCR0-TACCR4(共5个)

比较模式下,用来设定计数终值;

捕获模式下用来将捕获的TAR值存放进TACCRx中。

           6.3  MC控制的四种工作模式的详细讲解

 

          6.3.1 MC=0停止模式

                        这是系统默认的模式,定时计数器禁止工作。

6.3.2 MC=1增模式

                        总结几句话:(红色标记的很重要)

此模式下严禁从0xffff开始计数;

注意从0计到TACCR0,实际上记了TACCR0+1个数;

计到TACCR0后,会回到0重新开始计数;

如果TAR的值大于TACCR0,这时候会立即从0开始计数;

当定时器计数到TACCR0的值时,中断标志CCIFG位(之后会讲到)置位。当定时器由TACCR0返回0时,TAIFG中断标志置位;

在定时器运行时修改TACCR0,如果新的周期值大于或等于旧的周期值,或大于当前的定时器计数值,那么定时器立刻开始执行新周期计数。如果新周期小于当前的计数值,那么定时器回到0。但是,在回到0之前会多一个额外的计数。

6.3.3 MC=2连续模式

                        在连续模式中,定时器重复计数到0FFFFH,然后重新从0开始增计数(除非每次重装计数初值)。当定时器从0FFFFH到0时,TAIFG中断标志置位。

应用:连续模式下利用捕获/比较器产生需要的时间间隔。原理是:计数在一直进行,捕获器TACCRX中存有第一个计数终值,每次捕获器计到TACCRX时,会产生中断标志,我们可以在中断服务函数中写入一个计算好的下一个的计数终值,这样无限计算和中断下去,那么该捕获器就会产生一个稳定的时间间隔序列。(其实吧,不明白也没关系。就算明白了,也不好用,因为计算起来很麻烦而且也不好用)

如图:

6.3.4 MC=3增减模式(常用于生成PWM波)

该模式下,计数方向是固定的,即让定时器停止后再重新启动定时器,它就沿着停止时的计数方向和数值开始计数。如果不希望这样,就需要将TACLR置位来清除方向。TACLR位也会清除TAR的值和定时器的时钟分频。

                               ②此模式下置位情况如下图:

当定时器运行时,改变TACCR0的值,如果正处于减计数的情况,定时器会继续减到0,新的周期在减到0后开始。

如果正处于增计数状态,新周期大于等于原来的周期,或比当前计数值要大,定时器会增计数到新的周期;如果新周期小于原来的周期,定时器立刻开始减计数,但是,在定时器开始减计数之前会多计一个数。

6.4  捕获比较模块

这是在以上介绍的基础上正式讲TA的重要功能。

先看一个寄存器TACCTL0-TACCTL6:(TA中最复杂的寄存器,用到的时候查表啦)

CMx:捕获模式设定    00 不捕获

01 上升沿捕获

10 下降沿捕获

11上升和下降沿都捕获

       CCISx:捕获源的选择           00 CCIxA

01 CCIxB

10 GND

11 VCC

SCS:同步捕获源,设定是否与时钟同步

                                                 0 异步捕获 

同步捕获

SCCI:选择的CCI输入信号由EQUx信号锁存,并可通过该位读取。

CAP: 0-比较模式     1-捕获模式

OUTMOD:输出模式控制位。(之后会在输出模块详细解释)     

CCIE:中断使能,该位允许相应的CCIFG标志中断请求 。

0-中断禁止      1 -中断允许

CCI 3 :捕获比较输入,所选择的输入信号可以通过该位读取

OUT : 对于输出模式0,该位直接控制输出状态 。

0-输出低电平    1-输出高电平

COV:捕获溢出位。该位表示一个捕获溢出发出,COV必须由软件复位。 

0-没有捕获溢出发生   1-有捕获溢出发生

CCIFG:捕获比较中断标志位。

 0-没有中断挂起    1-有中断挂起

最后一个寄存器TAIV:(还记得外部中断寄存器吗,里面同样存储的只是一个中断代号)

              里面没有TACCR0的中断标志,因为TACCR0优先级最高,有一个专门的中断向量)

这里面的标志位需要软件手动清零。一种情况例外:两个中断同时发生,先响应优先级高的中断,当该中断服务程序结束后,该位的中断标志会自动清零,然后去响应另外一个中断。

 

6.4.1比较模式

                     TA启动时默认为比较模式。

                     (CAP=0时选择比较模式)

 

比较模式简介:(也就是一般意义上的定时计时模式)

这是定时器的默认模式,当在比较模式下的时候,与捕获模式相关的硬件停止工作,如果这个时候开启定时器中断,然后设置定时器终值(将终值写入TACCRx),开启定时器,当TAR的值增加到和某个TACCRx里面的值相等的的时候,相应的中断标志位CCIFGx置一,同时中断标志位TAIFG置位。若中断允许未开启则只将中断标志位CCIFGx置一。

(还记得51单片机的定时器吗)

注意:当Timer_A要用到TACCR0的值作为终值来计数(也就是增模式或者增减模式),很显然TACCR0的值一定要大于其TACCRx的值,否则那些比TACCR0大的计数值就没有存在的意义了。

下面是我画的一个图。比较形象的解释了工作原理。(期间TACCR的值不改变)

所谓的比较就是,如果计数器TAR中的值和某个TACCRx中的值相等了,那么相应的标志位就会置位。

                            这只是一个原理,实际应用的时候,会很灵活,通过一个一个设定每次的TACCR值,可以得到想要的各种时间间隔。

总结:比较模式用于选择PWM输出信号或在特定的时间间隔中断。当TAR计数到TACCRx的值时:

○相应的中断标志CCIFG置位;

○内部信号EQUx=1

○EQUx根据输出模式来影响输出信号

○输入信号CCI锁存到SCCI

6.4.2  捕获模式

                     当CAP=1时,选择捕获模式。捕获模式用于记录时间事件,比如速度估计或时间测量。捕获输入CCIXA和CCLXB连接外部的引脚或内部的信号,这通过CCISX位来选择。CMX位选择捕获输入信号触发沿;上升沿、下降沿或两者都捕获。当输入信号的触发沿到来时,捕获事件发生:

定时器的TAR值复制到TACCRX寄存器中

○中断标志位CCIFG置位

注意:①捕获信号可能会和定时器时钟不同步,并导致竞争条件的发生。将SCS位置位可以在下个定时器时钟使捕获同步

              ②如果第二次捕获发生时,第一次捕获的TAR值还没有及时被存到TACCRx,捕获比较寄存器就会产生一个溢出逻辑,COV位在此时置位, COV位必须软件清除。

6.5 输出模块

                            传统的定时器,都是通过标志位的判断来定时触发事件的。而430则具有输出模块,通过和定时结合起来,可以方便的产生PWM信号或者其它控制信号

                            每个捕获/比较器都有一个输出口,如P1.1-P1.5对应TA0.0-TA0.4这5个捕获比较器的输出。

 

                            输出模式: 输出模式由OUTMODx位来确定,如下表对于所有模式来说(模式0除外),OUTx信号随着定时器时钟的上升沿而改变。输出模式2,3,6和7对输出模式0无效,因为此模式下,EQUx=EQU0。

                                                                      (复位指的是置0)

 

OUTMODX

模式

说明

000

输出

输出信号OUTx由OUT位定义。当OUT位更

新时,OUTx信号立刻更新

001

置位

当定时器计数到TACCRX值时,输出置位,并保

持置位直到定时器复位或选择了另一个输出模式

010

翻转/复位

当定时器计数到TACCRX值时,输出翻转。当定

时器计数到TACCR0值时,输出复位

011

置位/复位

当定时器计数到TACCRX值时,输出置位。当定

时器计数到TACCR0值时,输出复位

100

翻转

当定时器计数到TACCRX值时,输出翻转。输出

信号的周期将是定时器的2倍

101

复位

当定时器计数到TACCRX值时,输出复位,并保

持复位直到选择了另一个输出模式

110

翻转/置位

当定时器计数到TACCRX值时,输出翻转。当定

时器计数到TACCR0值时,输出置位

111

复位/置位

当定时器计数到TACCRX值时,输出复位。当定

时器计数到TACCR0值时,输出置位

 

举一个例子:结合上表看下图

 

              注意:在模式转换的时候,一定要保持OUTMOD至少一位置位,除非转向0模式。所以最好的做法是:先把OUTMOD置为7,然后再清除掉不需要的位。

              做一个说明:比较模式下,当计数器TAR中的值和TACCRX中的设计值相等时,相应捕获/比较器的EQUx就会置位。那么EQU0、EQUx和OUTMOD是怎么来影响输出的呢?以模式2(翻转/复位)为例,该模式的定义是这样的:当定时器计数到TACCRX值时,输出翻转。当定时器计数到TACCR0值时,输出复位。于是,这句话就也可以翻译成在模式2的条件下,当EQUX=1时,输出翻转;当EQU0等于1的时候,输出复位。这两个信号这里相当于两个触发(使能)信号了。

 

总结

实验一:

/*利用Timer_A比较模式下的多路定时,让LED闪烁*/

#include <msp430f5529.h>

void main(void)

{

WDTCTL=WDTPW+WDTHOLD;

P1DIR|=(BIT1+BIT2+BIT3+BIT4+BIT5);//P1.1-P1.5为输出方向

P1OUT=0x00;        //全部拉低,初始化LED全灭

TA0CCTL1=CCIE;     //捕获比较器1开启CCIFG位中断

TA0CCR1=13107;        //置入要比较的数值0xff/5=13107

TA0CCTL2=CCIE;     //捕获比较器2开启中断

TA0CCR2=26214;        //13107*2=26214

TA0CCTL3=CCIE;     //捕获比较器3开启中断

TA0CCR3=39321;        //13107*3=39321

TA0CCTL4=CCIE;     //捕获比较器4开启中断

TA0CCR4=52428;        //13107*4=52428

TA0CTL|=TACLR+TAIE;      //开启中断并清零

TA0CTL|=TASSEL_1+MC_2+TAIE;//选择SCLK32.768KHZ作为时钟,选用连续模式,并开启中断

/*这样的话,5个灯闪一遍的时间为0xffff/32768=2S*/

__enable_interrupt();    //开启总中断

while(1);

}

/*TIMER0_A0_VECTOR是计时器0的CCR0的中断寄存器,TIMER0_A1_VECTOR是计时器0的CCR1-CCR4、TA的寄存器*/

/*同理定时器TA1也是分为两个TIMER1_A0_VECTOR和TIMER1_A1_VECTOR*/

#pragma vector=TIMER0_A1_VECTOR

__interrupt void TimerA(void)

{

switch(__even_in_range(TA0IV,14))

/* 这句话的意思是:只有在TA0IV的值是在0--14内的偶数时才会执行switch函数内的语句

其作用是提高switch语句的效率*/

{

case 2:P1OUT=BIT1;break; //TACCR1 CCIFG置位,表明计数值和设定的13107相等了,也就是说计了0.4S了

case 4:P1OUT=BIT2;break; //TACCR2 CCIFG置位,表明计了0.8S了

case 6:P1OUT=BIT3;break; //TACCR3 CCIFG置位,表明计了1.2S了

case 8:P1OUT=BIT4;break; //TACCR4 CCIFG置位,表明计了1.6S了

case 14:P1OUT=BIT5;break;   //TAIFG置位,表明计了2S了

default:break;

}

}

 

实验二:比较模式-增减模式输出PWM波

/*在比较和增减模式下产生PWM波(矩形波) */

/*提一个PWM波的用处:驱动直流电机。我们知道对于直流电机,驱动它的电流的频率并不影响转速 ,只有占空比会影响转速*/

/*开发板上P2.0是有外接排针的,所以用这一端口输出PWM*/

/*看CPU引脚发现,P2.0为TA1.1,也就是定时器A1的1号捕获比较器输出口*/

#include <msp430.h>

void main(void)

{

WDTCTL=WDTPW+WDTHOLD;

P2SEL|=BIT0;   //声明有特殊功能,不做普通I/O使用

P2DIR|=BIT0;   //输出

P2DS |=BIT0; //全力驱动,否则可能无法驱动电机

P2OUT&=~BIT0;   //初始化输出低电平

/*把SMCL配置为XT2 4MHZ*/

P5SEL=BIT2+BIT3;   //声明特殊功能,将用作外部时钟晶振XT2输入

UCSCTL6&=~XT2OFF;  //开启XT2

while(SFRIFG1 & OFIFG)

{

UCSCTL7 &=~(XT2OFFG+DCOFFG+XT1LFOFFG);//清除3种时钟错误标志

SFRIFG1&=~(OFIFG);//清除时钟错误标志位

}  //直到XT2从起振到振荡正常,没有错误发生

UCSCTL4|=SELS_5;   //把SMCLK的时钟源选为XT2 4MHZ

TA1CCTL0=CCIE;     //定时器A1的捕获比较器0开启CCIFG位中断

TA1CCR0=200;       //置入计数终值,则PWM频率为10KHZ

TA1CCTL1=CCIE;     //捕获比较器1开启中断

TA1CCR1=50;        //占空比为75%

TA1CTL|=TACLR;     //将计时器A1清零

TA1CTL|=TASSEL_2+MC_3;   //定时器选择SMCLK作为时钟源,且为增减模式

TA1CCTL1=OUTMOD_4; //定时器A1中的捕获比较器1,输出模式为4翻转

while(1);

}

              //呼吸灯//

//  介绍: 该程序利用TIMER A 的 UP模式 在P1.3脚产生PWM输出

//  将CCR0设置为1500来定义PWM的周期,利用循环不断改变CCR1的值,

//  实现利用改变PWM的占空比来改变LED亮度.

//  SMCLK = MCLK = TACLK = default DCO

#include <msp430f5529.h>

void delay_nms(unsigned int n)// 延时函数

{

unsigned int j;

for (j=0;j<(n);j++)

{

__delay_cycles(400);   //太短会使LED显得好像在常亮,太长就要等较长时间来观察了

}

}

void main(void)

{

unsigned const PWMPeriod = 1500; //设置PWM周期参数,const声明此值不允许改变.该数值太大,会导致LED闪烁

volatile unsigned int i;        //声明变量i是随时可变的,系统不要去优化这个值

WDTCTL = WDTPW + WDTHOLD;   // 关闭看门狗

P1DIR |=BIT3;              // 设置 P1.3为输出

P1SEL |=BIT3;              // 设置 P1.3为TA0.2输出

TA0CCR0 = PWMPeriod;           // 设置PWM 周期

TA0CCTL2 = OUTMOD_7;           // 设置PWM 输出模式为:7 - PWM复位/置位模式,

// 即输出电平在TAR的值等于CCR2时复位为0,当TAR的值等于CCR0时置位为1,改变CCR2,从而产生PWM。其实模式2也可以

TA0CTL= TASSEL_2 +MC_1;    // 设置TIMERA的时钟源为SMCLK, 计数模式为up,到CCR0再自动从0开始计数

while(1)

{

TA0CCR2=0;//确保最开始是暗的

//渐亮过程:不断设置TA0CCR2的值,使翻转的时间变长,改变PWM的占空比

for(i=0;i<PWMPeriod;i+=1)

{

TA0CCR2=i;

delay_nms(4-(i/500));  //占空比变化的延时,调整延迟时间可改变呼吸灯变暗的速度

//在暗的时候延长delay时间,可增强效果

}

//渐暗过程:不断设置TA0CCR2的值,使翻转的时间变短,改变PWM的占空比

for(i=PWMPeriod;i>0;i-=1)

{

TA0CCR2=i;

delay_nms(4-(i/500));           //占空比变化的延时,调整延迟时间可改变呼吸灯变暗的速度

//在暗的时候延长delay时间,可增强效果

}

TA0CCR2=0;  //确保灯暗

delay_nms(250); //时间长一点,增强视觉效果

}

}

MSP430F5529 (六)定时器Timer_A相关推荐

  1. MSP430F5529库函数定时器B

    需提前学习:MSP430F5529库函数学习--串口:MSP430F5529库函数定时器A--捕获实验:MSP430F5529库函数定时器A--硬件PWM:MSP430F5529库函数定时器A--定时 ...

  2. MSP430F5529库函数定时器A——捕获实验

    需提前学习:MSP430F5529库函数学习--串口:MSP430F5529库函数定时器A--硬件PWM 目录 引脚手册获取 实验目的 代码 代码解析 串口数据发送部分 数据捕获部分 定时器部分可选参 ...

  3. (9)MSP430F5529 定时器Timer_A

    MSP430F5529共有两类共4个定时器,分别是Timer_A定时器3个和Timer_B定时器1个,按照每个寄存器配备的捕获/比较器的个数分别命名为Timer0_A(内有5个捕获比较器).Timer ...

  4. MSP430F5529常用定时器

    定时器常见的代码解析(CCS) MSP430F5529中有着A,B,D三种定时器,与平时接触的8位单片机不同,在定时器A能够支持PWM输出.中断捕获比较等功能 上图就为定时器的时钟选择,有三种时钟源选 ...

  5. msp430g2553定时器Timer_A

    定时器_A 是具有 3 个捕捉/比较寄存器的 16 位定时器/计数器. 定时器_A 能支持多个捕捉/比较,PWM 输 出,和反相时序. 定时器_A 还有广泛的中断功能. 中断可由计数器在溢出条件上产生 ...

  6. 【STM32】HAL库 STM32CubeMX教程六----定时器中断

    前言: 今天我们来学习定时器,32的定时器有着非常丰富的功能, 输入捕获/输出比较,PWM,中断等等.是我们学习STM32最频繁使用到的外设之一,所以一定要掌握好,这节我们讲解定时器中断,本系列教程将 ...

  7. STM32学习笔记(六 定时器及应用 4 光敏传感器实验 )

    一.光敏传感器简介 光敏传感器是最常见的传感器之一,它的种类繁多,主要有:光电管.光电倍增管.光敏电阻.光敏三极管.太阳能电池.红外线传感器.紫外线传感器.光纤式光电传感器.色彩传感器.CCD 和 C ...

  8. 【MSP430】MSP430F5529火箭板 --->基于定时器A的LED灯闪烁实验(含Timer_A分析)

    实验内容:上电点亮MSP430F5529 Launch Pad 上板载的红色LED,同时使用定时器让绿色LED闪烁 实验准备: 1.硬件:MSP430F5529 Launch Pad 2.软件:Cod ...

  9. MSP430F5529 DriverLib 库函数学习笔记(五)定时器A

    目录 硬知识 定时器A 16位定时器原理 (1)时钟源选择和分频器 (2)Timer_A工作模式 (3)捕获/比较模块 (4)Timer_A中断(重要) 定时器A API (机翻) 定时器A配置和控制 ...

最新文章

  1. 原理详解AUC、ROC和average precision (AP)以及sklearn实战
  2. shiro 授权介绍
  3. .NET 6 全新指标 System.Diagnostics.Metrics 介绍
  4. Netty:透明地使用SPDY和HTTP
  5. mysql调用短信接口_短信平台接口调用方法参考
  6. 用户登录界面(Bootstrap)入门教程01(适合初学者)
  7. android关于window
  8. Halcon模板匹配(基于相关性)
  9. Aggregated Residual Transformations for DeepNeural Networks -ResNetXt2017【论文理解】
  10. ubuntu安装wechat
  11. oracle数据库快速查询关键字,数据库分页查询关键字
  12. window.print();去除页眉页脚及网址。
  13. 沐阳Python扫盲01类的概念与实例
  14. pandas 用均值填充缺失值NaN —— fillna 方法解析
  15. 计算机技术相关职业资格证书,关于对持有计算机信息高新技术考试合格证书人员配发国家职业资格证书的通知...
  16. 什么是云虚拟主机_云虚拟主机有什么用
  17. 召集令——巴布洛游牧节一日游活动开启啦!
  18. 解决局域网无法自动获取ip问题
  19. 如何使用自己电脑搭建一个外网可以访问的服务器
  20. 内存管理之内存管理的概念

热门文章

  1. 智能机器人在医疗领域的应用
  2. summernote富文本编辑器实现图片添加上传和删除图片
  3. font-face字体图标和inconfont矢量图标库
  4. 以商业实践反哺开源技术跃升|2023开放原子全球开源峰会开源商业化创新发展分论坛成功举行
  5. js获取宁外一个HTML5页面元素的值,宁波中学英语
  6. 华为p10 鸿蒙,华为强力打造鸿蒙系统生态!终于走出“试验田”了:成功接入服务...
  7. Oracle8i与MS SQL SERVER2000之比较
  8. 芯片翻译之ICM20602(一)
  9. 还在吞馒头、喝醋来对付鱼刺吗?告诉你吃鱼的必备技能
  10. NYOJ 42 一笔画问题