5870|7

80

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

关于LPC2478在IAR环境下,从外部flash和外部sdram中的问题 [复制链接]

一共有两个问题,请专家和各位高手指点一下:

问题1:
    我的编译环境是iar 4.42 跑一个开发板中的lcd的例子程序,例子程序默认是在内部RAM中运行的,我在内部RAM中跑没问题。 然后我现在要在外部FLASH中跑(外部FLASH中我跑过一个跑马灯程序,所以对FLASH的mac文件和xcl文件应该是没问题的,因为flash中我还跑过其他工程,都是可以的,但是没有牵扯到对sdram的操作)。

LCD的工程里面,有对SDRAM的操作,我现在一在外部FLASH跑,就会出错,首先,我能进入DEBUG,programme load to flash 也是成功的,我在0x80000000地址也看到了应该看到的中断向量表那些数据,但是我继续全速执行下去后,就会出问题,当我break的时候,会出现“unenable to halt ARM core”的错误对话框。
如果我单步执行,因为外部flash跑,速度慢很多,而:
SDRAMInit();
          wr_ptr = (DWORD *)SDRAM_BASE_ADDR;

        char_wr_ptr = (BYTE *)wr_ptr;

  /*  按照8bit的方式访问SDRAM测试前,清除SDRAM相应地址的内容 */
/**/        for ( i= 0; i < SDRAM_SIZE/4; i++ )
        {
                *wr_ptr++ = 0;
          }
这一些步骤,包括后面的图片数据送入sdram,都是时间非常长,因为在这里,我使用全速跑,但是就是跑不过去。

不知道是哪里设置出了问题还是什么其它的,还是对sdram的操作在外部flash跑得话,需要什么特殊处理? 请专家高手给点指点,谢谢了!
问题2:
    我的一个led跑马灯测试小程序,在内部flash,内部ram,外部flash跑,都是可以的,但是在外部sdram跑有一些问题:
    情况现象:
    a)  第一次板子上电,我led工程在sdram跑,是正常的
    b)  不断电,我换另一个工程,在内部flash跑的,不过使用lcd功能,因此对外部sdram有操作,也是正常的
    c)  不断电,我再换a步骤地led工程,还是在sdram中跑,就会有问题,表现在:
         1.  有时候debug就进不去
         2.  有时候debug能进去,但是memory 0xa0000000地址开始的数据都为0x00 (sdram使用外部动态bank0 ,程序从0xa0000000开始),那么后面操作也就肯定错了。

请高手指点一下,小弟搞这个搞了好几天了,还是没找到原因,谢谢了!
              

最新回复

那那么我想请问一下,你之前LCD调试的时候,有没有碰到这个问题? 是怎么解决的,能否告知一下,谢谢了。  详情 回复 发表于 2008-9-5 11:12
点赞 关注

回复
举报

72

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
没有使用过你的芯片和开发环境.
  

首先,你的程序必须使用工具下载, 如果你的程序是完全的RAM版本, 断电之后系统重启动就应该无法运行;

对于时flash版本的软件, 有两种情况: 一种是代码最终在flash中运行, 另一种情况是代码最终在RAM/SDRAM中运行.
对于这两种情况, 最先都需要一段类似于bootlaoder功能代码的帮助, 对于第一种情况至少data(初始化数据)需要从flash中拷贝到RAM/SDRAM中;
后一种情况, bootloader需要将代码和数据拷贝到RAM/SDRAM中, 如果要使用SDRAM, 则SDRAM的初始化一定是在它之外进行的.

关于启动的问题, 其实涉及很多的东西, 具体系统有所不同.
  
   
 
 

回复

84

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
对于问题1的情况,楼上的可能有误解。
是这样的。一个lcd工程,我在内部ram,flash中运行都是可以的,但是我随后换到外部flash中运行(对于你说的工具下载,不存在这个问题,这一块肯定是好的,我本身就有flashload的.79文件的),进入debug后,全速,就会出错,提示我“unable to halt ARM core“
but 如果我单步仿真的话,是可以的。  iar 刚开始用,我不知道是不是哪里设置有问题。
 
 
 

回复

80

帖子

0

TA的资源

一粒金砂(初级)

4
 
but 如果我单步仿真的话,是可以的。
////////////////////////////////
呵呵速度跟不上啦, 单步都来的及的, 我做LCD驱动时也遇到过类似问题, 适当加delay下
 
 
 

回复

70

帖子

0

TA的资源

一粒金砂(初级)

5
 
这是我的main函数,我现在这样试了一下,
1. 把“按点阵方式将图片数据送入SDRAM”这一步省去,debug后,全速运行,是可以的,最后led可以跑马灯循环闪,但是如果我这时候在不退出debug的情况下,reset仿真,那么直接跳到main入口处:
1. 这时候,我再全速运行,led不闪,我停止debug,便弹出对话框"unable to halt arm core"
2. 然后我再次模拟这个情况,debug中reset后,单步运行,运行到SDRAMInit()后,这个函数我整个函数单步运行,便会跳不出来,如果停止debug,弹出对话框“unable to halt arm core”

wanyeye,你说速度跟不上,我在debug单步的时候,“按点阵方式将图片数据送入SDRAM”这一步 ,我是全速运行的,而且之后我也加了一些delay,但是没什么作用啊,请指点一下,你以前做LCD驱动的时候是如何解决的?

谢谢了!

附:

int main ( )
{

        DWORD i,j,col,row;
        DWORD counter=0;
        
        volatile DWORD *wr_ptr;
        volatile BYTE *char_wr_ptr;

#ifdef xFlash
  MEMMAP = 3;
#elif SDRAM
  MEMMAP = 2;
#else
  MEMMAP = 1;
#endif

        TargetResetInit();
        
        init_timer( 0, TIME_INTERVAL );

        enable_timer( 0 );

        SDRAMInit();
          wr_ptr = (DWORD *)SDRAM_BASE_ADDR;

        char_wr_ptr = (BYTE *)wr_ptr;

  /*  按照8bit的方式访问SDRAM测试前,清除SDRAM相应地址的内容 */
/*调试期间先省去,不清0*/        ///for ( i= 0; i < SDRAM_SIZE/4; i++ )
        ///{
        ///        *wr_ptr++ = 0;
          ///}

/*  按点阵方式将图片数据送入SDRAM,LCD分辨率为480×272 ,图片大小为75×100 */
        j=0;
        wr_ptr = (DWORD *)SDRAM_BASE_ADDR;
        char_wr_ptr = (BYTE *)wr_ptr;
        for(col=0; col<10; col++)                                
        {
          //delayMs(0,100);
          for(row=0; row<10; row++)
          {
               //delayMs(0,100);
               if(col>=picY && col<(picY + picHigh))                        
             {
                   if(row>= picX&& row<(picX + picWidth))               
                   {
                        *char_wr_ptr++ = gImage_1[j++];                                                         
                        *char_wr_ptr++ = gImage_1[j++];
                        *char_wr_ptr++ = gImage_1[j++];
                        *char_wr_ptr++ = 0x00;
                   }
                   else
                   {
                        *char_wr_ptr++ = 0xFF;                                                         
                        *char_wr_ptr++ = 0x00;
                        *char_wr_ptr++ = 0X00;
                        *char_wr_ptr++ = 0x00;          // 其余像素点显示为背景红色       
                   }
             }
               else
             {
                        *char_wr_ptr++ = 0xFF;                                                         
                        *char_wr_ptr++ = 0x00;
                        *char_wr_ptr++ = 0X00;
                        *char_wr_ptr++ = 0x00;
             }
          }
        }

        lcd_configure_gpio();

        LCD_Disp_Config();

        DMA_SRC = 0xA0000000;
        LCD_UPBASE = DMA_SRC;
        DMA_Init();
        /*       test led   add by hjh 2008-09-05         */   
        GPIOInit( 3, FAST_PORT, DIR_OUT );    // 将P3组配置为输出口

    LedsInit();

    FIO3DIR  |= 0x0F000000;         
   
    while ( 1 )
        {
          delayMs(0,100);
          LedOn(counter);
          delayMs(0,500);
          LedOff(counter);   
          counter++;
        }
}
 
 
 

回复

87

帖子

0

TA的资源

一粒金砂(初级)

6
 
把“按点阵方式将图片数据送入SDRAM”这一步省去,debug后,全速运行,是可以的
那问题就出在这里咯 呵呵


看你前面说的, 单步调试,都没问题, 全速就出问题, 根据我做的经验,应该是 LCD没足够时间处理你的数据

 
 
 

回复

79

帖子

0

TA的资源

一粒金砂(初级)

7
 
把“按点阵方式将图片数据送入SDRAM”这一步省去,debug后,全速运行,是可以的
那问题就出在这里咯 呵呵


看你前面说的, 单步调试,都没问题, 全速就出问题, 根据我做的经验,应该是 LCD没足够时间处理你的数据

 
 
 

回复

82

帖子

0

TA的资源

一粒金砂(初级)

8
 
那那么我想请问一下,你之前LCD调试的时候,有没有碰到这个问题? 是怎么解决的,能否告知一下,谢谢了。
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表