浅谈msp430f5529入门(3)——定时器A/Timer_A

时间:2022-03-02 20:40:38

        这次聊聊定器A,Timer_A


        F5529的定时器和F149刚能上几乎没有区别,会用F149的定时器就会用F5529的定时器了。可是呢~F55系列定时器的数量不一样了,而且寄存器的名字也有所改变了。


        ·F5529一共有3个定时器A,3个!TimerA!这3个分别是Timer0_A5,Timer1_A3,Timer2_A3,前面的数字就是定时器的序数,后面的数字是这个定时所拥有的捕获比较单元数量。


        这些我都不是从datasheet或者user guide上查到的,而是最直接地翻CCS里的<msp430f5529.h>知道的。datasheet和user guide 都是讲一个系列的,各种芯片之间可能有点差异,所以还是进这个专门的头文件里找比较精确。因为数目多了,所以在使用时很容易会产生混乱。大家刚开始学着写程序时一定要经常翻翻user guide和头文件,避免写错。


        x代表定时器,n代表捕获比较单元,Timer_A的寄存器也就这么6种,需要我们注意的也就2种。都是TAx开头,如果是涉及捕获比较单元的会在后面再有个n


TAxCTL——定时器Ax的控制寄存器。

TAxCCTLn——定时器Ax里的捕获比较单元n的控制寄存器,多了个C是Capture/Compare。

TAxR——定时器Ax的计数器,这个不归我们管。

TAxCCRn——定时器Ax里的捕获比较寄存器,用到这个捕获比较的时候直接写就行了,或者是写CCR0。

TAxIV——定时器Ax的中断向量寄存器。进这个中断时查看就行了,switch。

TAxEX0——定时器A扩增的寄存器,里面只有一个TAIDEX对时钟再分频,可以忽略。


--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

        待我们用到定时器时,对着user guide,

        先把TAxCTL设置好——TASSEL时钟源,ID分频不分频,MC工作模式,TAIE打开不打开定时器溢出中断。

        再把要用到的捕获比较单元的TAxCCTLn设置好——CAP捕获还是比较,捕获的话CM怎么捕,SCS同步,CCIS信号从哪进;

                                                                                           无论捕获还是比较,CCIE中断总得打开吧;

                                                                                           如果输出PWM波,设置OUTMOD就够了(一般用模式7)。

        最后写TAxCCRn(比较或者是输出PWM波)。

----------------------------------------------------------------------------------------------------------------------------------------------------------


        有些疑问。

        对于TAxCCTLn里的CCISSCCI搞不太懂

        CCIS默认的是CCIxA,这个就是该捕获比较单元所对应的引脚,但CCIxB对应的是哪个呢?我找不出来。我也试过,不是对应的TBxCCTLn的引脚。另外VCC和GND是怎么捕获的,也不太好懂。还好这问题无伤大雅,就那默认地CCIxA用就行了。

        另外,SCCI的值说是信号发生跳变时,也就是捕获瞬间的值,但这瞬间的值是什么?捕获前还是捕获后的电平,我无从而知,也没有人告诉我。

        曾看了这一段程序,说是可以测PWM波持续高电平的时间,用的是上升下降沿捕获。

#pragma vector = TIMERA1_VECTOR
__interrupt void TIMERA1(void)
{
switch(TAIV)
{
case TAIV_TACCR1: if((TACCTL1 & SCCI)== SCCI)
{
pulse = CCR1-oldCCR1;
}
oldCCR1=CCR1;
case TAIV_TACCR2:break;
case TAIV_TAIFG: break;
}
}

        可我试了貌似不行,而且在我写的程序里面,单步单步的运行,一直看SCCI都是0,没有变过。


        如果有哪位懂得这两个问题而又刚好看见这篇文章的,请不要吝啬地留言。谢谢!


----------------------------------------------------------------------------------------------------------------------------------------------------------

        那么对于如何测PWM波持续高电平的时间,我想到这样的办法,大家应该都能想出来。

#pragma vector = TIMER0_A1_VECTOR
__interrupt void timer0A1( void )
{
switch( __even_in_range( TA0IV,14) )
{
case TA0IV_TA0CCR1 :
period = TA0CCR1 - oldccr1;
oldccr1 = TA0CCR1;
break;
case TA0IV_TA0CCR2 :
if( TA0CCTL2 & CM_1 )
{
TA0CCTL2 &= ~CM_1; //取消上升沿捕获
TA0CCTL2 |= CM_2; //改为下降沿捕获
oldccr2 = TA0CCR2;
}
else
{
TA0CCTL2 &= ~CM_2; //趋向下降沿捕获
TA0CCTL2 |= CM_1; //改为下降沿捕获
pulse = TA0CCR2 - oldccr2;
}

break;
case TA0IV_TA0CCR3 :break;
case TA0IV_TA0CCR4 :break;
case TA0IV_TA0IFG :break;
}
}
        无非就是进上升沿中断后改下降沿。比较笨的方法,但能用。

----------------------------------------------------------------------------------------------------------------------------------------------------------


        关于每一种工作模式如何如何地我就不啰嗦了,和149一样,如果有F149底子应该都懂的。学到5529,我觉得要注意的就是寄存器和有一些位的命名。多了真的很容易混乱,不过多练几次很快就能掌握记忆的技巧了。


        祝大家学习愉快!