打印
[ZLG-ARM]

[求助]虽然简单,但困惑了我两天的问题,希望得到指点

[复制链接]
1964|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
年轻不在|  楼主 | 2010-8-20 23:07 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在ADS1.2下编译的程序,硬件是LPC2101,开始只是想测试一下Timer0,后来在主程序里加了一条while语句,程序运行的while语句就停下了,无法继续运行下去,希望各位大侠给予指点,万分感谢,程序如下:

#define LED_RUN   (1<<6)
#define LED_T    (1<<16)
#define LED_R    (1<<17)


uint16 OverTimeCounter;
uint8 OverTimeFlag;


/****************************************************/
void __irq Timer0_IRQ(void)       //25ms
{

   if(OverTimeCounter > 0)
  {
       OverTimeCounter--;
       if(OverTimeCounter == 0)
      {
          OverTimeFlag = 1;
          IO0CLR = LED_RUN;                //turn on
      }
   }


T0IR = 0x01;
VICVectAddr = 0x00;
}


/******************************************************/
void Timer0Init(uint16 rate)   
{
     T0TCR = 0x02;
     T0PR  = 0;
     T0PC  = 0;
     T0MCR = 0x03;              //match interrupt and TC reset
     T0MR0 = Fpclk / rate;
     T0TC  = 0;
     T0IR  = 0xffffffff;
     T0EMR = 0;


     IRQEnable();
     VICIntSelect = VICIntSelect & (~(1<<4));
     VICVectCntl2 = 0x20 | 4;
     VICVectAddr2 = (uint32)Timer0_IRQ;
     VICIntEnable = 1 << 4;

     T0TCR = 0x01;       //start
}

/****************************************************************/
int main(void)
{
     OverTimeCounter = 0;
     OverTimeFlag = 0;

     Timer0Init(40);            //25ms
     IO0DIR = LED_RUN | LED_T | LED_R;
     IO0SET = LED_RUN | LED_T | LED_R;                //turn off all led
     OverTimeCounter = 20;               //500ms
  /*  while(OverTimeFlag==0); */

     for(;;)
     {
           while(OverTimeFlag==0);
           IO0CLR = LED_R;                       //turn on

           if(OverTimeFlag)
           {
                  OverTimeFlag = 0;
                  IO0CLR = LED_T;               //turn on   

           }
     }

     return 0;
}


运行结果是只有在Timer0中断程序里的LED_RUN灯亮了,其他两个灯都不亮,程序停止在while语句处,无论while语句放在主程序还是被注释处运行结果都一样。如果把while语句去掉,三个灯都亮了。困惑中,期待解决。。。。。。

相关帖子

沙发
hotpower| | 2010-8-21 23:30 | 只看该作者
OverTimeFlag变量被优化。
应该:

volatile uint8 OverTimeFlag;

使用特权

评论回复
板凳
3B1105| | 2010-8-21 23:42 | 只看该作者
你这个先进Timer0中断程序里了,LED_RUN灯亮了,同时让OverTimeFlag = 1了,下while的这句肯定就不成立了

使用特权

评论回复
地板
huzixian| | 2010-8-22 10:52 | 只看该作者
楼上说的很有道理

使用特权

评论回复
5
hotpower| | 2010-8-22 11:26 | 只看该作者
这个程序最多只能运行一次。
手机上网不方便,回家再仔细分析。
这个程序问题多多

使用特权

评论回复
6
hotpower| | 2010-8-24 00:24 | 只看该作者
奇案!

使用特权

评论回复
7
6019赵文| | 2010-9-12 18:30 | 只看该作者
我觉得3楼说的挺有道理,楼主再改改吧

使用特权

评论回复
8
明天我还来| | 2010-11-4 17:49 | 只看该作者
3楼正解。

使用特权

评论回复
9
ji_dan| | 2010-11-6 09:55 | 只看该作者
三楼应该不是正解!!

使用特权

评论回复
10
ji_dan| | 2010-11-6 09:58 | 只看该作者
如果OverTimeFlag = 1了,那么while(OverTimeFlag = =0);这条语句就不会等待而会跳过,执行下面的语句。在IO0CLR = LED_R;   //turn on这条语句后面加个延时,应该会看到这个灯亮~

使用特权

评论回复
11
米其林r| | 2010-11-7 10:26 | 只看该作者
OverTimeFlag   你通过编译器看看这个变量的值是不是一直是0不就完了吗

使用特权

评论回复
12
bairan168| | 2010-11-7 20:10 | 只看该作者
新手学习中,谢谢了,

使用特权

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

本版积分规则

106

主题

447

帖子

1

粉丝