打印

while循环处死循环,OFIFG标志位清不掉。

[复制链接]
2324|17
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
wyjie|  楼主 | 2015-8-22 17:13 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
我用VALUE LINE开发板调试程序,程序如下:
#include<msp430g2553.h>
void main(void)
{
WDTCTL = WDTPW+WDTHOLD;         //设置密码位,禁止看门狗
P1DIR=0X41;                     //P1.6输出
P1OUT=0X01;
BCSCTL3|=LFXT1S_0+XCAP_3;              //使能晶体时钟LFXT1,12.5pF
//IFG1&=~OFIFG;                  //清掉时钟故障标志
while(IFG1&OFIFG)
{
  IFG1&=~OFIFG;
  _delay_cycles(100000);
}
P1OUT=0;
_bis_SR_register(SCG1+SCG0);     //置位SCG1,SCG0,关掉DCO时钟产生,关掉SMCLK
BCSCTL2|=SELM_3+DIVM_3;         //选择LFXT1CLK作为时钟源,8分频
while(1)
{
  P1OUT=0X40;
  _delay_cycles(5000);
  P1OUT=0;
  _delay_cycles(5000);
}
}
发现在while循环处死循环,OFIFG标志位清不掉。
这是什么情况,请高手赐教。谢谢!

相关帖子

沙发
jlyuan| | 2015-8-22 17:14 | 只看该作者
while(1)
{
  P1OUT=0X40;
  _delay_cycles(5000);
  P1OUT=0;
  _delay_cycles(5000);
}
你这句话根本就没有跳出循环的条件   

while(1)
任何情况下都是真   当然是死循环    自己在写循环式  必须要有跳出循环的条件   一直为真写循环语句的大忌

使用特权

评论回复
板凳
wyjie|  楼主 | 2015-8-22 17:14 | 只看该作者
while(IFG1&OFIFG)
{
  IFG1&=~OFIFG;
  _delay_cycles(100000);
}
楼上,我是说上面这个while循环呀!

使用特权

评论回复
地板
yszong| | 2015-8-22 17:14 | 只看该作者
我今天也遇到了,TI官方原代码如下,我仿真试了,死活跳不出循环!只要一打开XT1 OFIFG就自动置位了,死活请不了!百死不得其解!
WDTCTL = WDTPW+WDTHOLD;                   // Stop WDT

  P7SEL |= 0x03;                            // Select XT1
  UCSCTL6 &= ~(XT1OFF);                     // XT1 On
  UCSCTL6 |= XCAP_3;                        // Internal load cap

  // Loop until XT1,XT2 & DCO stabilizes
  do
  {
    UCSCTL7 &= ~(XT2OFFG + XT1LFOFFG + XT1HFOFFG + DCOFFG);
                                            // Clear XT2,XT1,DCO fault flags
    SFRIFG1 &= ~OFIFG;                      // Clear fault flags
  }while (SFRIFG1&OFIFG);                   // Test oscillator fault flag

  UCSCTL6 &= ~(XT1DRIVE_3);                 // Xtal is now stable, reduce drive

使用特权

评论回复
5
vivilzb1985| | 2015-8-23 09:04 | 只看该作者
上边那个while(1)的循环的就是个死循环的。

使用特权

评论回复
6
vivilzb1985| | 2015-8-23 09:04 | 只看该作者
这个一般在主程序中使用的,让循环执行各个功能的。

使用特权

评论回复
7
comeon201208| | 2015-8-26 14:33 | 只看该作者
wyjie 发表于 2015-8-22 17:14
while(IFG1&OFIFG)
{
  IFG1&=~OFIFG;

这个循环的就跟你的硬件有关系了,建议等待一段时间后,软件复位的吧。

使用特权

评论回复
8
comeon201208| | 2015-8-26 14:33 | 只看该作者
这样的循环,即使是让过去了,该部分的硬件没有正常工作的,会影响整体的工作状态的。

使用特权

评论回复
9
shenmu2012| | 2015-8-26 14:35 | 只看该作者
楼上意见说的是,不然程序中整一个初始化程序的又是为何呢?

使用特权

评论回复
10
zhangbo1985| | 2015-8-27 17:22 | 只看该作者
楼上说的是,遇到这种情况,果断重启的。

使用特权

评论回复
11
pmp| | 2015-8-27 22:12 | 只看该作者
初始化?

使用特权

评论回复
12
lefeng| | 2015-8-31 20:39 | 只看该作者
系统复位一下看看能清掉不能

使用特权

评论回复
13
cemaj| | 2015-9-5 21:46 | 只看该作者
软件消除不了吗

使用特权

评论回复
14
309030| | 2015-9-7 12:45 | 只看该作者
while(1)的循环是死循环

使用特权

评论回复
15
Snow7| | 2015-9-10 21:42 | 只看该作者
还真是的啊,OFIFG标志位清不掉,怎么办

使用特权

评论回复
16
米尔豪斯| | 2015-9-29 20:15 | 只看该作者
有的评估板在do{}while();代码前需要配一些寄存器

使用特权

评论回复
17
wenxinan| | 2016-4-1 16:03 | 只看该作者
我也是这样,放个LED进去测试到标志位死循环了。楼主解决了吗?

#include<msp430x14x.h>
#define    LED_RED          BIT0                         // P2.0 红灯亮起
#define    RED_LED_ON       P2OUT &=~LED_RED             // 红灯亮起
#define    RED_LED_OFF      P2OUT |= LED_RED             // 红灯熄灭

void delay(unsigned char time)
{
  unsigned char j,k,l;
  for(j=0;j<100;j++)
    for(k=0;k<100;k++)
      for(l=0;l<time;l++)
        _NOP();
}

void testled(void)  { P2DIR|=BIT0;P2OUT|=BIT0; RED_LED_ON;delay(20);RED_LED_OFF;}

void Init_TA(void)
{
  P1DIR=BIT2;
  P1SEL=BIT2;
  TACCR0 =  19999;                                    
  TACCTL1 = OUTMOD_7;
  TACCR1 =920;
  TACTL |= TASSEL_2 + MC_1;
}

void Init_CLK(void)
{
  unsigned int qq;
  BCSCTL1 &= ~XT2OFF;           //打开XT2高速晶体振荡器
  BCSCTL2 = SELM_2 + SELS + DIVS_3;          //SMCLK,MCLK=XT2, 8MHz
  do
  {
    IFG1 &= ~OFIFG;           //Clear oscFault flag清除振荡器失效标志
    for(qq=0xff;qq>0;qq--);testled();
  }     while((IFG1 & OFIFG));
  //BCSCTL2 = SELM_2 + SELS + DIVS_3;          //SMCLK,MCLK=XT2, 8MHz
}

void main()
{
  WDTCTL=WDTPW+WDTHOLD;
  Init_CLK();
  Init_TA();
  for(;;);
}

使用特权

评论回复
18
wenxinan| | 2016-4-1 16:37 | 只看该作者
上电复位后,IFG1为082H,即1000 0010
            然后OFIFG为0x02,即0000 0010
IFG1&=~OFIFG,就是1000 0010
                              &1111 1101
                       IFG1=1000 0000
while((IFG1&OFIFG))    //IFG1&OFIFG不是0000 0000吗?那就清除完成了呀,怎么会死循环呢?

我的ledtest()放在Init_CLK()前面是会闪亮一下的,放在do while就一直亮了,由此判断的死循环哦

QQ截图20160401162700.png (32.67 KB )

QQ截图20160401162700.png

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

927

主题

12706

帖子

5

粉丝