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定时器捕获功能,一直进中断,捕获管脚改过之后就消失了

Other Parts Discussed in Thread: MSP430F437

程序(1)

采用P2.3管脚捕获

#include <msp430x43x.h>

void main(void)
{
  WDTCTL = WDTPW + WDTHOLD;       // Stop watchdog timer to prevent time out reset
  _EINT();                                                     //开中断
  P2SEL |= BIT3;                                        // 设置引脚P2.3第二功能定时器捕获
  TACTL |= TASSEL_1 | TACLR | TAIE | TAIFG;          // 定时器寄存器设置,先进中断
  TACCR1 = 0x7fff;
  TACCTL1 |= CCIE;                           
  TACCTL2 |= CCIS_1 | CCIE | CAP | CM_2;           // 选CCIB2捕获,开中断
  TACTL |= MC_2;
  while(1);
}

void Time_Deal(void)
{
  unsigned char flag;
  flag = TAIV;
  switch(flag)
  {
  case 2:
    _NOP();           //不执行
    break;
  case 4:
    _NOP();             //程序一直死在这里
    break;
  case 10:
    _NOP();
    break;
  }
}

#pragma vector= TIMERA1_VECTOR
__interrupt void TIMERA1_IRQ()
{
  Time_Deal();
}

程序(2)

#include <msp430x43x.h>

void main(void)
{
  WDTCTL = WDTPW + WDTHOLD;       // Stop watchdog timer to prevent time out reset
  _EINT();
  P2SEL |= BIT0;
  TACTL |= TASSEL_1 | TACLR | TAIE | TAIFG;
  TACCR1 = 0x7fff;
  TACCTL1 |= CCIE;
  TACCTL2 |= CCIS_0 | CCIE | CAP | CM_2;
  TACTL |= MC_2;
  while(1);
}

void Time_Deal(void)
{
  unsigned char flag;
  flag = TAIV;
  switch(flag)
  {
  case 2:
    _NOP();        
    break;
  case 4:
    _NOP();           
    break;
  case 10:
    _NOP();
    break;
  }
}

#pragma vector= TIMERA1_VECTOR
__interrupt void TIMERA1_IRQ()
{
  Time_Deal();
}

该程序运行起来没有任何问题

  • 你好,

    运功GPIO作为第二功能需要注意该IO管脚是否支持捕获模式。

    我在你的程序中没有找到你用的哪款MCU。

    MCU不同,管脚定义不一样。支持捕获模式的管脚也不一样。

  • 我用的是MSP430f437芯片,第一程序用的是P2.3/TB2管脚第二程序用的是P2.0/TA2管脚,而且我这个程序在多个437芯片测试,得到结果一样,只要我用P2.3管脚程序就一直死在中断里.但是我换成P2.0程序就一点问题都没有,刚开始我怀疑是我程序问题,为此我测试好几个芯片,得到结果是一样的