|
在前面的章节中,提到了看门狗定时器的使用,实际上,MSP430单片机是拥有多个定时器的,根据具体型号的不同,还分别具有基本定时器、定时器A、定时器B。
(1)看门狗定时器,如前所述,它是个十六位的定时器,既可以作为看门狗使用,也可以作为定时器使用。一般各个型号的MSP单片机都有,主要用来处理程序跑飞的问题。
(2)基本定时器,一般出现在msp430x3和msp430x4系列处理器里面。通过对SMCLK或者ACLK进行分频,向其他外围模块提供低频控制信号。还可以用于产生周期性中断,来更新lcd或者启动下一个新的测量周期。该基本定时器可以作为一个16位的定时器,也可以分成两个8位的定时器。
(3)16位定时器A,一般FLASH型430都有TIMER_A,包含多路比较捕获通道。具体可用于:产生定时脉冲或者PWM信号,虽然没有自动重载功能,但是也没有软件误差(这是个关键问题,需要认真考虑);捕获外部事件的发生时间;用于串行通信(怎么用?)。
(4)定时器B,在TIMER_A的基础上,增加了比较锁存器功能。
定时器A的使用:
定时器A有5个16位的寄存器
1、 TACTL 控制寄存器
bit15-10 bit9 bit8 bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0
-- SSEL1 SSEL0 ID1 ID0 MC1 MC0 -- CLR TAIE TAIFG
SSEL1、SSEL0选择进入定时器分频器的时钟源,
SSEL1 SSEL0 输入时钟源 说明
0 0 TACLK 用特定的外部引脚信号
0 1 ACLK 辅助时钟
1 0 MCLK 系统时钟
1 1 INCLK 外部输入时钟
ID1、ID0输入分频系数
ID1 ID0 分频系数
0 0 不分频
0 1 1/2分频
1 0 1/4分频
1 1 1/8分频
MC1、MC0计数模式控制位
MC1 MC0 模式
0 0 停止模式
0 1 增计数模式
1 0 减计数模式
1 1 增/减计数模式
CLR——定时器清除。当该位为1时,定时器复位。
TAIE——定时器中断允许位。
0:禁止定时器溢出中断;
1:允许定时器溢出中断。
TAIFG——定时器溢出标志位。
增计数模式:当定时器由CCR0计数到0时,TAIFG置位;
连续计数模式:当定时器由0FFFFH计数到0时,TAIFG置位;
增/减计数模式:当定时器由CCR0减计数到0时,TAIFG置位。
2、TAR 16位计数器
3、CCTLx 捕捉/比较控制寄存器,各位定义:
bit15-14 bit13-12 bit11 bit10 bit9 bit8 bit7-5 bit4 bit3 bit2 bit1 bit0
CAPTMOD1~0 CCIS1~0 SCS SCCIx -- CAP OUTMODx CCIEx CCIx OUT COV CCIFGx
CAPTMOD1~0:选择捕获模式
0 0 : 禁止捕获模式
0 1 : 上升沿捕获
1 0 : 下降沿捕获
1 1 : 上升沿与下降沿都捕获
CCIS1~0: 捕获事件输入源
0 0 : 选择CCIxA
0 1 : 选择CCIxB
1 0 : 选择GND
1 1 : 选择Vcc
SCS——选择捕获信号与定时器时钟同步、异步关系
0:异步捕获 1:同步捕获(实际中经常使用同步模式,捕获总是有效的)
SCCIx——比较相等信号EQUx将选中的捕获/比较输入信号CCIx(CCIxA,CCIxB,Vcc和GND)进行锁存,然后可由SCCIx读出。
CAP——选择捕获模式还是比较模式。
0:比较模式 1:捕获模式
OUTMODx: 选择输出模式
0 0 0 : 输出
0 0 1 : 置位
0 1 0 : PWM翻转/复位
0 1 1 : PWM置位/复位
1 0 0 : 翻转
1 0 1 : 复位
1 1 0 : PWM翻转/置位
1 1 1 : PWM复位/置位
CCIEx——捕获/比较模块中断允许位
0:禁止中断 1:允许中断
CCIx——捕获/比较模块的输入信号
捕获模式:由CCIS0和CCIS1选择的输入信号可通过该位读出
比较模式:CCIx复位
OUT——输出信号(如果OUTMODx选择输出模式0,则该位对应于输入状态)
0:输出低电平 1:输出高电平
COV——捕获溢出标志
0:没有捕获溢出 1:发生捕获溢出
当CAP=0时,选择比较模式。捕获信号发生复位。没有使COV置位的捕获事件
当CAP=1时,选择捕获模式。如果捕获寄存器的值被读出前再次发生捕获事件,则COV置位。程序检测COV来判断原值读出前是否又发生捕获事件。读捕获寄存器时不会使溢出标志复位,须用软件复位。
CCIFGx——捕获比较中断标志
捕获模式:寄存器CCRx捕获了定时器TAR值时置位
比较模式:定时器TAR值等于寄存器CCRx值时置位
4.CCRx 捕捉/比较寄存器:可读可写
在捕获模式,当满足捕获条件,硬件自动将计数器TAR数据写入该寄存器。
如果测量某窄脉冲(高电平)的脉冲长度,可定义上升沿和下降沿都捕获。在上升沿时,捕获一个定时器数据,这个数据在捕获寄存器中读出;再等待下降沿到来,在下降沿时又捕获一个定时器数据;那么两次捕获的定时器数据差就是窄脉冲的高电平宽度。
其中CCR0经常用作周期寄存器,其它CCRx相同。
范例:在接下来的实例中,结合led显示功能,用定时器A实现一个三位的自动增计数功能,每产生一次中断,led显示增1。
#include "msp430.h"
#define TIMEINTERVAL 50000 //定时间隔宏定义
int counter[6] = {0,0,0,0,0,0};
//延时子程序
void Delay(void)
{
int i;
for(i = 200; i > 0 ;i --) ;//延时一点时间
}
int main( void )
{
// Stop watchdog timer to prevent time out reset
WDTCTL = WDTPW + WDTHOLD;
int num[10] = {0x40,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90 } ;
int i;
//初始化端口
P1DIR = 0xff;
P2DIR = 0xff;
P4DIR = 0x03;
P1SEL = 0x00;
P2SEL = 0x00;
P4OUT = 0x01;
//设置定时器A
TACTL = TASSEL1 +TACLR ;
TACCTL0 = CCIE;
CCR0 = TIMEINTERVAL;
TACTL |= MC1;
//允许中断
_EINT();
//显示数组的内容
while(1)
{
for(i=0;i<6;i++)
{
P2OUT = ~(0x01<<(5-i));
P1OUT = ~num[counter];
Delay();
}
}
//end
}
//定时器A中断处理程序
#pragma vector = TIMERA0_VECTOR
__interrupt void TIMERA_Continue(void)
{
CCR0 += TIMEINTERVAL;
P4OUT ^= BIT1 ;
counter[0]++;
if(counter[0]>9)
{
counter[0] = 0;
counter[1]++;
if(counter[1]>9)
{
counter[1]=0;
counter[2]++;
if(counter[2]>9)
counter[2]=0;
}
}
}
|
|