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.

MSP430的timer做超长电平测量,TIMER的使用问题

Other Parts Discussed in Thread: MSP430F5529

我设想是这样的:timer设置成,脉冲下降沿捕获,捕获到下降沿读出TACCR1作为时间,如果计数器溢出了,我用变量记住溢出的次数,

但是如果捕获事件和溢出事件同时发生(前后差几个微妙,中断没处理过来),TAIV 标志是不是只能保存一个事件,如果没及时处理完成,会被后面的事件覆盖?

用什么方法能解决这个问题?

  • 您现在同时使用了定时器捕获比较(CCIE)以及定时器溢出(TAIE)。如果您陷入ISR_trap,就会出现不能正常触发的情况。

    如果您在定时器A溢出时使用第二个中断,那么每次进入中断时都需要确保读取TAIV寄存器。有多个源会导致该中断,该寄存器会告诉您哪一个引起了中断

    另外参考之前的帖子:
    e2echina.ti.com/.../136702
  • 我的意思是如果在某种极端情况下,计数器溢出中断和捕获中断只相差很短时间,比如只相差2us,这个时候如果mcu正处理其他中断比如串口通讯,这个时候TAIV 标志是捕获中断还是计数器溢出中断呢?因为这个值不是位标识,而是数值,这样是不是只有后面的中断有效?
  • 以MSP430F5529为例:

    17.2.6.2 TAxIV, Interrupt Vector Generator 

    对TAIV寄存器的任何访问,读取或写入都将自动复位最高未决中断标志。

    另外17.2.6.2.1 TAxIV Software Example给出了例子

    建议您使用下面的方式

    //╞════════════════════════════ TA0 ISR ══════════════════════════════════════╡  
    #pragma vector=TIMER0_A0_VECTOR         // Timer A0_0 interrupt service routine
    __interrupt void Timer_A0 (void)                 // TA0CCR0 CCIFG
    {           
            event.alert = 1;                         // ALERT TIMER
            __bic_SR_register_on_exit(LPM3_bits);
    }
    //╞───────────────────────────────────────────────────────────────────────────╡  
    
    #pragma vector = TIMER0_A1_VECTOR           // Timer A0_A1 Interrupt vector (shared)
    __interrupt void TIMER0_A1_ISR (void)
    {
      switch(__even_in_range(TA0IV,0x0A))
      {
          case TA0IV_NONE:      break;          // Vector  0:  No interrupt
          case TA0IV_TACCR1:    break;          // Vector  2:  TA1CCR1 CCIFG
          case TA0IV_TACCR2:    break;          // Vector  4:  TA1CCR2 CCIFG         
          case TA0IV_6:         break;          // Vector  6:  Reserved CCIFG
          case TA0IV_8:         break;          // Vector  8:  Reserved CCIFG      
          case TA0IV_TAIFG:     break;          // Vector 10:  TA1IFG (rollover)    
          default:              break;
      }
    }