原创 MSP430F149的定时器Timer_A操作与使用

2011-6-8 15:35 8063 4 4 分类: MCU/ 嵌入式

一、Timer_A的主要特点:<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

16位异步定时/计数器,有四种操作模式;

时钟源可选;

3个比较/捕捉寄存器;

可以配置成PWM输出;

异步输入/输出锁存;

中断向量寄存器提供快速Timer_A中断译码功能。

二、定时/计数模式

TAR寄存器是一个16位的定时/计数寄存器。在时钟的上升沿,TAR的内容会根据不同的模式而增加或者减小,TAR可以通过软件进行读/写;另外,当定时/计数器发生溢出时将产生中断。

1、停止模式

定时器暂停但不发生复位。

2、增加模式

计数器的周期长度等于TACCR0的值加1。在计数过程中改变TACCR0的值,如果新的计数周期大于或等于以前的周期,或者大于当前计数器的值时,计数器将以新的计数周期作为计数周期。如果新的周期小于当前计数器的值,则计数器将变为0,然后重新开始计数。

当计数器等于TACCR0时产生CCIFG中断标志,当计数器从TACCR0转到0是将产生TAIFG中断标志。

3、连续模式

在该模式下,计数器周期从00FFFFH

4、/减模式

该模式用来产生对称波形。计数器先增计数到TACCR0,然后减计数到0,周期是TACCR02倍。计数过程中改变TACCR0的值有以下两种情况:

1) 如果此时为减计数,则计数器计数到0后,新的周期开始起作用。

2) 如果此时为增计数,则又分为两种情况,如果新的周期大于或等于当前计数器的值,那么计数器计数到新的周期值;如果新的周期值小于当前计数器的值,那么计数器将马上执行减计数。

5、捕捉/比较

CAP =1时为捕捉模式。CAP=0时为比较模式。

捕捉主要用来测量脉冲宽度,记录事件发生事件。MSP430单片机的捕捉有同步模式和异步模式两种。但是异步模式容易产生竞争冒险,所以一般推荐使用同步模式。

比较模式主要用来产生PWM信号或者用于产生特定事件间隔的中断。

6、输出模式

共有8种。

以上的具体操作可以参考MSP430x1xx Family User's Guide

 

练习代码:

使用Timer_A来产生脉冲信号。红色部分为输出占空比11的波形。

#include <msp430x14x.h>

#include "clk.h"

#define uchar   unsigned char

#define uint    unsinged int

#define CLK_OUT     BIT2

#define TimeValue   32768

#define PWM         BIT2

static uchar flag = 0;

/*

void init_timer()

{

    TACTL |= TASSEL1 + TACLR + ID0 + ID1;//选择SMCLK作为定时器时钟,8分频

    TACTL |= MC0 + TAIE;//增加模式,并且使能中断

    TACCR0 = 9999;//中断周期为10ms

}

*/

void init_timer()

{

    TACCR0 = TimeValue - 1;

    TACTL |= TASSEL1;//使用SMCLK作为定时器时钟,不分频

    TACTL |= MC0 + TAIE;//增加模式,并且使能TIMER_A中断

   // TACCR0 = 9999;//中断周期为10ms

}

//输出PWM波形,占空比为1:1,10kHz

/*

void init_pwm()

{

    P1SEL |= PWM;

    P1DIR |= PWM;

    TACCTL1 |= OUTMOD0 + OUTMOD1 + OUTMOD2;

    TACCR0 = 800;

    TACCR1 = 400;

    TACTL |= TASSEL1 + MC0;

}

*/

//定时器的中断服务程序

#pragma vector = TIMERA1_VECTOR

__interrupt void Timer_A(void)

{

    switch(TAIV)

    {

        case 2:break;

        case 4:break;

        case 10:flag = 1;break;//10ms中断标志加1

    }

}

int main(void)

{

    //uchar time = 0;

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

    CLK_Init();

   // init_pwm();

    //while(1);

    init_timer();

    P1DIR |= CLK_OUT;//设置P12为信号输出管脚

    _EINT();//打开全局中断

    while(1)

    {

       while(flag)

        {

            flag = 0;

            P1OUT = (~P1OUT & CLK_OUT);//定时时间到,则进行反转

            /*

            time++;

            if(time == 50)//500ms时间到,则进行反转

            {

                P1OUT = (~P1OUT & CLK_OUT);

                time = 0;

            }

           */

        }

    }  

}

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
4
关闭 站长推荐上一条 /3 下一条