[求助] MSP430F122进中断

buttonwzf   2013-11-25 09:08 楼主
在MSP430F122上写了一段很简单的程序,想用定时器控制LED灯,一段时间后翻转LED引脚。但发现无法进入定时器中断,用仿真器单步调试,发现运行到BCSCTL2 |=SELM_2+SELS; 就无法继续执行,绿颜色的提示行消失,下面debug log也没有报错。XIN--XOUT 接的是8MHZ的。求助这是为什么,我哪里设置有问题?谢谢!

#include
int count=0;

int main( void )
{
  int j;   
    WDTCTL = WDTPW + WDTHOLD;       //关闭看门狗  
    BCSCTL2 |=SELM_2+SELS;
    CCTL0 = CCIE;                   //使能CCR0中断
    CCR0 = 40000;                    //设定周期               
    TACTL = TASSEL_1 + ID_3 + MC_1; //定时器A的时钟源选择ACLK,增计数模式
    P2DIR = 0xff;                   //设置P2口方向为输出
    P2OUT = 0xff;

    __enable_interrupt();                        //使能全局中断
    while(1)
    {
      j=count;
    }
}

/*******************************************
函数名称:Timer_A
功    能:定时器A的中断服务函数
参    数:无
返回值  :无
********************************************/
#pragma vector = TIMERA0_VECTOR
__interrupt void Timer_A (void)
{  
  if(count==50)
  {
    count=0;
    P2OUT ^= 0xff;                  //P2口输出取反  
  }
  else
  {
    count++;
  }
}

回复评论 (5)

SELM_2是什么?如果用外部晶振的话,首先要使能外部晶振的,默认外部晶振是不启动的。
点赞  2013-11-25 09:35
一般在系统初始化关闭看门狗后要配置系统时钟,配置步骤为:
1、打开晶振;
2、等待晶振起振。清除OFIFG,延时,判断OFIFG是否为0,为0则晶振正常起振,退出判断;
3、选择MCLK/SMCLK时钟源;
  uchar iq0;
  BCSCTL1&=~XT2OFF; //打开XT2振荡器
  do
  {
      IFG1 &= ~OFIFG; // 清除振荡器失效标志
      for (iq0 = 0xFF; iq0 > 0; iq0--); // 延时,等待XT2起振
  }
  while ((IFG1 & OFIFG) != 0); // 判断XT2是否起振
  BCSCTL2 =SELM_2+SELS; //选择MCLK、SMCLK为XT2
点赞  2013-11-26 17:15
非常不错 确实这样的
点赞  2013-11-26 22:41

回复 板凳zzbaizhi 的帖子

谢谢,我再试一试!
点赞  2013-11-27 09:41

回复 板凳zzbaizhi 的帖子

while ((IFG1 & OFIFG) != 0); // 判断XT2是否起振
我用单步调试时,如果一直这一句执行不下去,是不是可能是晶振无法启动?
点赞  2013-11-27 09:42
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复