新闻中心

EEPW首页>嵌入式系统>设计应用> MSP430F5529 (六)定时器Timer_A-2

MSP430F5529 (六)定时器Timer_A-2

作者: 时间:2016-11-28 来源:网络 收藏

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
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;
}

}


评论


技术专区

关闭