打印
[ZLG-ARM]

LPC2478 能否地址重映射到SDRAM?

[复制链接]
4305|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
橡希|  楼主 | 2009-8-6 11:05 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
LPC2478 有重映射的功能。
       我现在手头上只有开发板。CS1接的nor flash(地址0x8100 0000),DYCS0接的SDRAM(地址0xa000 0000),现在想启动后把程序代码从nor flash拷贝到SDRAM,然后在SDRAM里运行程序。
      也就是两个程序一个是booloader的作用在内部flash里运行,作用是启动后,拷贝中断向量表到内部ram,重映射内部ram0x4000 0000 到0。从nor flash拷贝程序到sdram,然后跳转到sdram的地址0xa000 0000。
       另外一个是应用程序,选择代码在nor flash里运行。
      这样将上面两个程序烧写到板子上,组合后,就是,启动后首先是内部flash的bootloader程序,做了程序从nor flash到sdram的拷贝,然后就是跳转到sdram执行。运行结果成功,内部程序运行时我屏幕显示绿色,到应用程序运行时用定时中断做了跑马灯,都跑起来了。
       后面我怀疑程序中断后是不是真的在sdram里运行。于是做了试验,在跳转到sdram之前,先把nor flash的寄存器配置,使不能正常访问nor flash。结果应用程序的跑马灯不跑了。也就是中断后程序又跑到nor flash里去了?


不知道能不能作重映射直接使sdram映射为0。

相关帖子

沙发
橡希|  楼主 | 2009-8-6 11:06 | 只看该作者
以后自己的板子接线是CS0 接NOR FLASH,DYCS0 接SDRAM.

使用特权

评论回复
板凳
稳定分析| | 2009-8-13 11:42 | 只看该作者
首先,你的程序必须使用工具下载, 如果你的程序是完全的RAM版本, 断电之后系统重启动就应该无法运行;

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

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

使用特权

评论回复
地板
稳定分析| | 2009-8-13 11:43 | 只看该作者
这是我的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++;
}
}

使用特权

评论回复
5
roger_lj| | 2009-8-15 19:44 | 只看该作者
回复楼主
LPC2000系列只能将向量表(地址0)映射到0x0, 0x4000 0000或者0x8000 0000.

使用特权

评论回复
6
synics| | 2009-8-23 16:35 | 只看该作者
是的,你再看看到底难里有问题。楼上说的很在理。

使用特权

评论回复
7
橡希|  楼主 | 2009-9-4 16:26 | 只看该作者
谢谢各位,现在通过分散加载文件我们得程序可以在外部flash里运行了。
在外部falsh里运行我们是这样作得:
1。首先写一个boot程序,主要作上电后,通过串口下载程序(如果需要得话),然后从nor flash(0x8000 0000)拷贝程序到sdram(0xa000 0000开始),然后jump到saram(0xa000 0000)运行程序。
这个boot程序是烧写到内部flash得。
2。应用程序,也就是用户程序,也包括启动代码,初始化等等,拷贝向量表到内部ram,
配置重映射到内部ram,然后是用户程序,例如跑马灯或者显示一张图在lcd上。这个程序是通过串口(结合boot程序)下载到norflash得。
这样程序可以跑起来得。

问题是我们后面移植了ucos到LPC2478得代码作为应用程序跑不起来,研究发现,boot程序在跳转到sdram时得模式为用户模式,而ucos得应用程序得启动代码中还要初始化一些系统堆栈,用户模式下不能进行初始化,所以没有跑起来。

使用特权

评论回复
8
-自己人| | 2010-9-19 22:52 | 只看该作者
学习了

使用特权

评论回复
9
breeze_jt| | 2011-2-15 21:04 | 只看该作者
应该不可以映射到SDRAM中,如5楼所说“LPC2000系列只能将向量表(地址0)映射到0x0, 0x4000 0000或者0x8000 0000”

使用特权

评论回复
10
285915046| | 2011-8-9 11:07 | 只看该作者
楼主:你的UCOS在SDRAM上跑起来了吗??

使用特权

评论回复
11
idonotknow0914| | 2011-8-24 09:53 | 只看该作者
又学了点东西~

使用特权

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

本版积分规则

5

主题

24

帖子

0

粉丝