一、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、连续模式
在该模式下,计数器周期从0到0FFFFH。
4、加/减模式
该模式用来产生对称波形。计数器先增计数到TACCR0,然后减计数到0,周期是TACCR0的2倍。计数过程中改变TACCR0的值有以下两种情况:
1) 如果此时为减计数,则计数器计数到0后,新的周期开始起作用。
2) 如果此时为增计数,则又分为两种情况,如果新的周期大于或等于当前计数器的值,那么计数器计数到新的周期值;如果新的周期值小于当前计数器的值,那么计数器将马上执行减计数。
5、捕捉/比较
CAP =1时为捕捉模式。CAP=0时为比较模式。
捕捉主要用来测量脉冲宽度,记录事件发生事件。MSP430单片机的捕捉有同步模式和异步模式两种。但是异步模式容易产生竞争冒险,所以一般推荐使用同步模式。
比较模式主要用来产生PWM信号或者用于产生特定事件间隔的中断。
6、输出模式
共有8种。
以上的具体操作可以参考MSP430x1xx Family User's Guide。
练习代码:
使用Timer_A来产生脉冲信号。红色部分为输出占空比1:1的波形。
#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;
}
*/
}
}
}
文章评论(0条评论)
登录后参与讨论