This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

MSP430F149的Timer A的continuous模式疑问



看手册说continuous模式由0--0xffff循环计数,但是我看到TI的例程怎么还有对TACCR0复制50000呢?如果是这样为什么不用up模式?还有“

  CCR0 += 50000;                            // Add Offset to CCR0” 这句是什么意思?
#include  <msp430x14x.h>

void main(void)
{
  WDTCTL = WDTPW + WDTHOLD;                 // Stop WDT
  P1DIR |= 0x01;                            // P1.0 output
  CCTL0 = CCIE;                             // CCR0 interrupt enabled
  CCR0 = 50000;
  TACTL = TASSEL_2 + MC_2;                  // SMCLK, contmode

  _BIS_SR(LPM0_bits + GIE);                 // Enter LPM0 w/ interrupt
}

// Timer A0 interrupt service routine
#pragma vector=TIMERA0_VECTOR
__interrupt void Timer_A (void)
{
  P1OUT ^= 0x01;                            // Toggle P1.0
  CCR0 += 50000;                            // Add Offset to CCR0
}
  • Hi yong,

       这个例程主要是用于实现timer计数每到50000,中断一次,Pi.0反转一下电平。

    这里之所以采用continue模式,是需要一直计数上去,同时每次中断都将CCR0加上50000,这样下次计数中断的间隔也是50000了。

    如果采用up模式的话,就不需要在中断程序里面执行CCR0+=50000了,只需要重新给CCR0=50000;

    两种模式有点不一样。

    谢谢

    ken

  • Ken Wang 说:

    Hi yong,

       这个例程主要是用于实现timer计数每到50000,中断一次,Pi.0反转一下电平。

    这里之所以采用continue模式,是需要一直计数上去,同时每次中断都将CCR0加上50000,这样下次计数中断的间隔也是50000了。

    如果采用up模式的话,就不需要在中断程序里面执行CCR0+=50000了,只需要重新给CCR0=50000;

    两种模式有点不一样。

    谢谢

    ken

    up模式不是计数到CCR0就产生中断,然后重新计数吗?怎么要给CCR0重新赋值呢?

    还有continue模式是计数到0xFFFF就产生中断,怎么会计数到CCR0就产生中断呢?

  • 1. UP模式是从0到CCR0计数,而 连续模式是从0-0XFFFF计数

    2. 在本例程中,用了连续模式,每计数5000次,由CCR0产生一次中断翻转GPIO

    3. 如果只有该程序只完成这个功能,完全可以用UP模式,然后只给CCR0赋值一次即可,按照这个想法,程序例程设计的效率就不高

    4. 但有时候,我们需要用TIMER作为很多事件的计数器,这时,我们就需要让TIMER工作在连续模式,然后用CCR0,CCR1,CCR2在不同的时间点来出发中断,例程给出了一个可能,就是用CCR0累加来实现5000次计数的中断处理。

    5. 这仅是一个演示例程而已

     

  • Triton Zhang 说:

    1. UP模式是从0到CCR0计数,而 连续模式是从0-0XFFFF计数

    2. ��本例程中,用了连续模式,每计数5000次,由CCR0产生一次中断翻转GPIO

    3. 如果只有该程序只完成这个功能,完全可以用UP模式,然后只给CCR0赋值一次即可,按照这个想法,程序例程设计的效率就不高

    4. 但有时候,我们需要用TIMER作为很多事件的计数器,这时,我们就需要让TIMER工作在连续模式,然后用CCR0,CCR1,CCR2在不同的时间点来出发中断,例程给出了一个可能,就是用CCR0累加来实现5000次计数的中断处理。

    5. 这仅是一个演示例程而已

     

    continue模式不是计数到0xFFFF就产生中断吗?按你这样说计数到CCR0产生中断,不就产生了2次中断了?

  • 你好,

    其实可以使用UP模式,只是这只是一个demo范例。

    只所以有CCR0 += 50000;是为了使得定时器中断频率保持一个定值50000*1/时钟频率。

    如果CCR0 + 50000 大于65536,你会发现第17位是溢出问,计数器CCR0会定格在0-65536,这样使用continue模式,保证定时器频率是5000*1/时钟频率。

  • kqian0327 说:

    你好,

    其实可以使用UP模式,只是这只是一个demo范例。

    只所以有CCR0 += 50000;是为了使得定时器中断频率保持一个定值50000*1/时钟频率。

    如果CCR0 + 50000 大于65536,你会发现第17位是溢出问,计数器CCR0会定格在0-65536,这样使用continue模式,保证定时器频率是5000*1/时钟频率。

    能告诉我continue模式的中断吗?我看手册说计数到0xFFFF就会中断,没看到说计数到CCR0就产生中断啊?如果像你这样说不是计数到CCR0中断一次,然后继续计数到0xFFFF又中断?

  • yongjia,

      你好,

      这个例程里面用到的是Timer的ccompare中断,和你说的计数溢出中断是两回事。

    compare中断是计数记到TACCR0的值是会产生中断,计数溢出中断是你说的那种由0记到oxFFFF时候产生的中断。

    两个的中断标志位不一样,我们这个只是简单地例程,在中断程序里面应该还需要去判断一下标志位,但是因为TACCR0的值小于0xFFFF的值,所以compare的中断都会先于溢出的中断产生。

    谢谢

    ken

  • 连续模式时,CCR0计数到FFFF会中断中断标志TAIFG会被置1,这个和CCR0,1,2产生的中断标志是不一样的,CCRX的中断标志位为TACCRx的CCIFG。你可以通过判断中断标志来看具体是什么中断类型。

     

  • 你好,

    用户使用手册有说明,TAR只是一个计数器,负责从0-65536计数,或者按照你配置的四种模式中的莫一种模式来工作,至于产生中断与否,需要看CCRX模块的寄存器设置。

    附件是一个关于计数器使用的中文文档,应该对你跟深入的了解MSP430定时器的使用有帮助。

    如果有帮到你,请点赞结贴  :)