关于2440在norflash上跑裸机的问题

6562748   2009-7-15 11:13 楼主
我在mdk环境下用jlink调试2440裸机程序,在SDRAM中运行顺利。现准备把程序烧写到norflash中,Scatter File如下:
;Run in Flash
LR_ROM1 0x00000000         {    ; load region
  ER_ROM1 0x00000000 0x0200000  {  ; load address = execution address
   *.o (RESET, +First)
   *(InRoot$$Sections)
   .ANY (+RO)
  }
  RW_RAM1 0x30000000 0x4000000  {  ; RW data
   .ANY (+RW +ZI)
  }
   RW_IRAM1 0x40000000 0x00001000  {
   .ANY (+RW +ZI)
  }
}

Initialization File如下:
FUNC void Init (void) {

  _WDWORD(0x4A000008, 0xFFFFFFFF);      // Disable All Interrupts

  _WDWORD(0x53000000, 0x00000000);      // Disable Watchdog Timer
  
                                        // Clock Setup
                                        // FCLK = 300 MHz, HCLK = 100 MHz, PCLK = 50 MHz
  _WDWORD(0x4C000000, 0x0FFF0FFF);      // LOCKTIME
  _WDWORD(0x4C000014, 0x0000000F);      // CLKDIVN
  _WDWORD(0x4C000004, 0x00043011);      // MPLLCON
  _WDWORD(0x4C000008, 0x00038021);      // UPLLCON
  _WDWORD(0x4C00000C, 0x001FFFF0);      // CLKCON

                                        // Memory Controller Setup for SDRAM
  _WDWORD(0x48000000, 0x22000000);      // BWSCON   bank6,7=32bit
  _WDWORD(0x4800001C, 0x00018005);      // BANKCON6
  _WDWORD(0x48000020, 0x00018005);      // BANKCON7
  _WDWORD(0x48000024, 0x008404F3);      // REFRESH
  _WDWORD(0x48000028, 0x00000032);      // BANKSIZE
  _WDWORD(0x4800002C, 0x00000020);      // MRSRB6
  _WDWORD(0x48000030, 0x00000020);      // MRSRB7

  _WDWORD(0x56000000, 0x000003FF);      // GPACON: Enable Address lines for SDRAM
}


// Reset chip with watchdog, because nRST line is routed on hardware in a way
// that it can not be pulled low with ULINK

_WDWORD(0x40000000, 0xEAFFFFFE);        // Load RAM addr 0 with branch to itself
CPSR = 0x000000D3;                      // Disable interrupts
PC   = 0x40000000;                      // Position PC to start of RAM
_WDWORD(0x53000000, 0x00000021);        // Enable Watchdog
g, 0                                    // Wait for Watchdog to reset chip

Init();                                 // Initialize memory
LOAD my_led.axf INCREMENTAL         // Download program
PC = 0x00000000;                       // Setup for Running

g, main                                 // Goto Main

启动代码用的是mdk自带的S3C2440A.S
运行后不成功,个人感觉是自写的Initialization File有问题(只初始化了SDRAM),除去Initialization File也不成功。请问各位大侠,正确的Initialization File该如何编写?或者启动代码需要哪里改动?那位手头上恰好有2440mdk跑flash的例子,能否发我一份,先谢过:)
邮箱:ysy27@sina.com

回复评论 (15)

没有高手会吗?期待中……
点赞  2009-7-16 18:22
NOR无需初始化就可以跑的,问题应该出在S3C2440A.S上,你的地址配置正确吗?
点赞  2009-7-19 11:35
引用: 引用 2 楼 jlctt 的回复:
NOR无需初始化就可以跑的,问题应该出在S3C2440A.S上,你的地址配置正确吗?

我用mdk自添加的S3C2440A.S,不知哪里需要修改?
点赞  2009-7-19 13:18
nor和nand我都用过,当时用nand是要写2个程序(一个是4K中的程序),写nor时就一个定位在0的程序,不要那个4K的boot。不需要写什么Scatter File的。只是运行时发现速度慢多了,后来打开了codecache就和SRAM中的差不多了。
点赞  2009-7-19 16:35
引用: 引用 4 楼 schlafenhamster 的回复:
nor和nand我都用过,当时用nand是要写2个程序(一个是4K中的程序),写nor时就一个定位在0的程序,不要那个4K的boot。不需要写什么Scatter File的。只是运行时发现速度慢多了,后来打开了codecache就和SRAM中的差不多了。

你说的程序是写在应用程序一起编译吗?还是写初始化程序呢?能否提供一下?谢谢
点赞  2009-7-19 18:04
应用程序是裸机程序没OS。整个程序就一个约120K。
点赞  2009-7-19 18:26
引用: 引用 6 楼 schlafenhamster 的回复:
应用程序是裸机程序没OS。整个程序就一个约120K。

有定位在0的程序示例吗?
点赞  2009-7-21 13:54
code定位在0,data定位在0x300000000就可以了。
点赞  2009-7-21 19:05
Scatter File中我已经定义了,怎么不行呢?
点赞  2009-7-22 10:27
只有不连续的段才用Scatter File。我搞的程序没用过。
点赞  2009-7-22 19:34
引用: 引用 8 楼 schlafenhamster 的回复:
code定位在0,data定位在0x300000000就可以了。

你这样分配不也是不连续的段吗?
点赞  2009-7-23 09:18
即R0=0;Rw=0x300000000.这个是正常的不叫不连续,不连续是R0或Rw中又分段的。
点赞  2009-7-23 13:25
你用的是jlink吗?jlink能否直接烧写程序?
点赞  2009-7-23 18:43
现在用HJTAG比南韩那个sjf快多了。
点赞  2009-7-23 20:45
南韩那个sjf烧nand要15分钟(120K)。烧nor要45分钟。
现在用HJTAG烧nand不要1分钟!
点赞  2009-7-23 20:52
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复