这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 综合技术 » 基础知识 » LPC2134,UART1,Startup LPC2134求助!UART1中断后

共2条 1/1 1 跳转至

LPC2134,UART1,Startup LPC2134求助!UART1中断后,程序会执行Startup.S(程序复位)

院士
2006-09-17 18:14:16     打赏
LPC2134,UART1,Startup LPC2134求助!UART1中断后,程序会执行Startup.S(程序复位)



关键词: LPC2134     UART1     Startup     求助         

院士
2006-12-22 22:43:00     打赏
2楼
问 (求助): UART1中断后,程序会执行Startup.S(程序复位)

芯片是 LPC2134

请看如下程序:

中断初始化如下:

/* RTC VIC初始化 */
      IRQEnable();    // IRQ中断使能            
      CIIR = 0x01;    // 设置秒值的增量产生一次中断
      ILR = 0x03;       // 清除RTC增量和报警中断标志      
      VICIntSelect = 0x00;       // 设置所有中断连接IRQ中断
      VICVectCntl1 = 0x20 | 13;       // 分配通道1
      VICVectAddr1 = (int)RTC_Int; // 设置中断服务程序地址
      VICIntEnable = (1 << 13);   // 使能RTC中断          
      CCR=0x11;                     // RTC开始计算 (硬件时钟)            

   
/* UART1 VIC初始化 */     
      Uart1_Init(4800);  
      U1FCR=0x81;           //8字符中断
      U1IER = 0x01;         //    允许uart1 中断    
      VICVectCntl0=0x20 | 0x07;
      VICVectAddr0=(unsigned int)IRQ_UART1;
      VICIntEnable=1<<7;        

/* TIME0 VIC初始化 */       
      VICVectCntl2=0x20 | 0x04;
      VICVectAddr2=(unsigned int)IRQ_Time0;
      VICIntEnable=1<<4;  


/* UART1中断接收程序 568 BYTE 为一帧数据 BUF[568]是外部变量*/
void __irq IRQ_UART1(void)
{
   unsigned char i;
    
    if((U1IIR & 0x0f)==0x04)
    {
      if(Rec_Flag==0)
      {
         for(i=0;i<8;i++)
         {
            Buf[Count]=U1RBR;
            Count++;
         }
         
         if(Count==568)
         {
           Count=0;
           Rec_Flag=0xff;           //接收完一帧数据标志
           VICIntEnClr=1<<7;        //关UART1中断
         }
       }  
    }
    
    VICVectAddr = 0;
}

/* RTC 时间*/
void __irq RTC_Int(void)
{
    Dis_Time();           //显示RTC时间

    ILR = 0x01;          // 清除RTC增量中断标志
    VICVectAddr = 0;      // 向量中断结束
}


//主程序:
main()
{
  while(1)
{
    if(Rec_Flag!=0)    
    {
        DISPLAY();      //显示接收数据
        
        Rec_Flag=0;         //得设旗号
    VICIntEnable=1<<7;  //开UART1 中断,继续接收 568 BYTE 数据   
    }
}
}


在执行程序的过程中发现:
  程序执行一段时间后(时间不定,有时3分钟,有时10分钟,有时超过一小时),

程序会执行Startup.S,也就是说程序跑飞,造成复位了。

请问是什么原因? 1: 请教!另:DOG已关闭 2: UART1中断后,程序会执行Startup.S(程序复位)UART1中断后,程序会停在Startup.S的那个地方? 3: 我的程序也出现过类似情况

我的程序也出现过类似情况,还有就是step in 按钮和step 一样跳不进子函数里面去,复位后跳到
Reset
      ......
--> LDR PC,{PC,#-0xFF0} ;
    ......
4: 不要用 VICIntEnable = (1 << 13);   使能单个中断不要用等于,要用或等于,你用等于就把前面初始化时使能的中断又禁止了。  要用 VICIntEnable |= (1 << 13);   之类的语句

   没有完整的程序,别人怎么帮你查呢?

   http://www.shawyoo.com 下载中心 有完整的UART 使用FIFO的中断方式的程序

    5: 搞破坏确实很容易 6: 跳到 LDR     PC, ResetAddr以下是Startup.S的部分程序

Reset
        LDR     PC, ResetAddr
        LDR     PC, UndefinedAddr
        LDR     PC, SWI_Addr
        LDR     PC, PrefetchAddr
        LDR     PC, DataAbortAddr
        DCD     0xb9205f80
        LDR     PC, [PC, #-0xff0]
        LDR     PC, FIQ_Addr

我在   LDR     PC, ResetAddr 这一行设了个断点,每次都会跑到这里来。


本想也在 LDR     PC, [PC, #-0xff0] 设个断点的,但程序运行过程中很频繁跳到这里!

不知那里出错了?烦告知,谢了。!

         7: 截图如下 8: 截图如下。如下。

http://file.21ic.com.cn/upload/img/200511/2005112513161819394.jpg

9: 我的程序也总在飞我的串口中断也是经常非,恼火的很 10: 如果采用查询的话就不会有问题不知是怎么回事!
现在烦死了。 11: 别急嘛,慢慢来心急吃不了热豆腐,再说了,大家都在努力,问题肯定会解决的 12: 好象是返回地址错了. 13: 顶!感觉很烦! 14: 顶上去!顶上去! 15: 大家帮忙顶上去! 16: 好象看的人很多,但没有人肯回答。 17: 我也遇到这种问题有得程序经常复位,有的程序跑几天也没问题。
还有就是经常跳到预取指错误得地址处,现在还没有搞清楚到底是什么造成得。 18: 这样看来,应该是模板有问题了。 19: 小弟遇到的现象和你的一样。小弟我觉得是你操作了VICIntEnable和VICIntEnable两个寄存器导致的。
小弟昨天调试程序的时候对程序执行了VICIntEnable=0xffffffff;//开中断
VICIntEnable=0xffffffff;//关中断,程序就飞了,不执行就没有问题。也在郁闷中,不知道是怎么回事,没有能够理解。这事还得请周工来给我解决,给我们一个说法。

共2条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]