打印
[ZLG-ARM]

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

[复制链接]
1673|16
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
bing103|  楼主 | 2010-8-20 23:08 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在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语句去掉,三个灯都亮了。困惑中,期待解决。。。。。。

相关帖子

沙发
bing103|  楼主 | 2010-8-20 23:18 | 只看该作者
while语句在ADS里有什么要注意的地方吗?

使用特权

评论回复
板凳
bing103|  楼主 | 2010-8-21 08:17 | 只看该作者
自己顶一下,在线等待

使用特权

评论回复
地板
bing103|  楼主 | 2010-8-23 22:59 | 只看该作者
问题已经解决了,OverTimeFlag被优化了,感谢hotpower大侠,还想恳请hotpower大侠指出程序的其他问题,谢谢。
还有个事情想说一下,我发现我发的帖被“年轻不在”这位仁兄拷贝发出来了,这样赚积分太无耻了吧。

使用特权

评论回复
5
bit6019| | 2010-8-23 23:56 | 只看该作者
我说这帖子怎么看着这么熟,但是人家发的时间比你早啊,怎么能说拷贝你的

使用特权

评论回复
6
hotpower| | 2010-8-24 00:27 | 只看该作者
奇案!
但发帖者好像就是楼主…

使用特权

评论回复
7
bing103|  楼主 | 2010-8-24 15:03 | 只看该作者
这个帖是我先在周立功网站的论坛里发的,然后再到这里发的

使用特权

评论回复
8
hotpower| | 2010-8-24 20:51 | 只看该作者
建议楼主改用keil编程。
若刚学习lpc210x,建议搜索
lpc2103 hotpower

使用特权

评论回复
9
bing103|  楼主 | 2010-8-25 11:04 | 只看该作者
弱弱的问一下hotpower,现在keil的那个版本稳定一些,谢谢

使用特权

评论回复
10
hotpower| | 2010-8-25 15:50 | 只看该作者
都可以。

使用特权

评论回复
11
bing103|  楼主 | 2010-8-25 15:57 | 只看该作者
刚安装了4.12,摸索中,谢谢菜农

使用特权

评论回复
12
refine19| | 2010-8-26 15:34 | 只看该作者
while(OverTimeFlag==0);
                 IO0CLR = LED_R;                       //turn on
           if(OverTimeFlag)
           {
                  OverTimeFlag = 0;
                        IO0CLR = LED_T;               //turn on   
           }
while循环结束的时候OverTimeFlag已经为1了,为什么在后面还要用if语句判断一下?

使用特权

评论回复
13
hotpower| | 2010-8-27 05:51 | 只看该作者
while(OverTimeFlag==0);                 IO0CLR = LED_R;                       //turn on           if(OverTimeFlag)           {                  OverTimeFlag = 0;                        IO0CLR = L ...refine19 发表于 2010-8-26 15:34
是的,判断多余。

使用特权

评论回复
14
S3C2440| | 2010-8-29 16:36 | 只看该作者
是不是说OverTimeFlag = 0;   以后下次运行的时候编译器就直接把这个变量当零了》?所以就进入死循环了,所以下次编译前一定要refresh 一下

使用特权

评论回复
15
FVJFIFE| | 2010-9-18 00:02 | 只看该作者
我也觉得这个判断这里有问题

使用特权

评论回复
16
七叶一枝花| | 2010-11-29 17:25 | 只看该作者
有时候写不好就进入了死胡同了。循环之前一定要检查几遍。

使用特权

评论回复
17
vivisa| | 2010-11-30 16:53 | 只看该作者
从这里真学到不少东西。

使用特权

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

本版积分规则

4

主题

36

帖子

0

粉丝