打印
[MCU]

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

[复制链接]
581|21
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
wyjie|  楼主 | 2020-8-16 11:24 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我用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| | 2020-8-16 11:28 | 只看该作者

while(1)
{
  P1OUT=0X40;
  _delay_cycles(5000);
  P1OUT=0;
  _delay_cycles(5000);
}
你这句话根本就没有跳出循环的条件   

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

使用特权

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

使用特权

评论回复
地板
yszong| | 2020-8-16 11:39 | 只看该作者
我今天也遇到了,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
dengdc| | 2020-8-16 11:43 | 只看该作者
上边那个while(1)的循环的就是个死循环的。

使用特权

评论回复
6
jiahy| | 2020-8-16 11:46 | 只看该作者
这个一般在主程序中使用的,让循环执行各个功能的。

使用特权

评论回复
7
shimx| | 2020-8-16 11:55 | 只看该作者
这个循环的就跟你的硬件有关系了,建议等待一段时间后,软件复位的吧。

使用特权

评论回复
8
spark周| | 2020-8-16 11:59 | 只看该作者
这样的循环,即使是让过去了,该部分的硬件没有正常工作的,会影响整体的工作状态的。

使用特权

评论回复
9
午夜粪车| | 2020-8-16 12:05 | 只看该作者
楼上意见说的是,不然程序中整一个初始化程序的又是为何呢?

使用特权

评论回复
10
zhaoxqi| | 2020-8-16 12:09 | 只看该作者
楼上说的是,遇到这种情况,果断重启的。

使用特权

评论回复
11
huangchui| | 2020-8-16 12:20 | 只看该作者
初始化?

使用特权

评论回复
12
jiajs| | 2020-8-16 12:24 | 只看该作者
系统复位一下看看能清掉不能

使用特权

评论回复
13
zhenykun| | 2020-8-16 12:28 | 只看该作者
软件消除不了吗

使用特权

评论回复
14
jlyuan| | 2020-8-16 12:31 | 只看该作者
while(1)的循环是死循环

使用特权

评论回复
15
zhanghqi| | 2020-8-16 12:35 | 只看该作者
还真是的啊,OFIFG标志位清不掉,怎么办

使用特权

评论回复
16
zhanghqi| | 2020-8-16 12:51 | 只看该作者
有的评估板在do{}while();代码前需要配一些寄存器

使用特权

评论回复
17
lium| | 2020-8-16 12:57 | 只看该作者
32768的晶振没有焊接吧。

使用特权

评论回复
18
dengdc| | 2020-8-16 13: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(;;);
}

使用特权

评论回复
19
wuhany| | 2020-8-16 13:07 | 只看该作者
上电复位后,IFG1为082H,即1000 0010
            然后OFIFG为0x02,即0000 0010
IFG1&=~OFIFG,就是1000 0010
                              &1111 1101
                       IFG1=1000 0000
while((IFG1&OFIFG))    //IFG1&OFIFG不是0000 0000吗?

使用特权

评论回复
20
jlyuan| | 2020-8-16 13:11 | 只看该作者
那就清除完成了呀,怎么会死循环呢?

使用特权

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

本版积分规则

927

主题

12706

帖子

5

粉丝