【 tulaoshi.com - Linux 】
基于S3C4510B的系统的Flash擦除与烧写问题(一) (也是抄的)
最近看到很多朋友在设计基于S3C4510B的系统时,碰到了Flash不能正确烧写或擦除的问题,下面根据我的理解对这个问题的作一个说明,以期抛砖引玉: 不同于其他的ARM处理器(如44B0),S3C4510B的每一个bank的地址都是可以通过重映射改变的,因此,系统的存储器,无论是Flash还是SDRAM,其起始地址都不是固定的,而对Flash的擦除,必须知道它的起始地址,否则就不能正确操作,这就是为什么很多朋友不能正确擦除Flash的原因。 以一般的系统设计为例,Flash使用2M、4M或8M,16位数据宽度,对应到Flash/ROM/SRAM的Bank0,SDRAM采用两片16位宽度的器件,并联构成32位的SDRAM存储器系统,对应到SDRAM的Bank0,那么,在Flash的内容为空时,当系统上电或复位后,能直接访问到的只有特殊功能寄存器(SFR)对应的Bank(其首地址为0x3FF0000),和Flash/ROM/SRAM的Bank0(其首地址为0x0),而SDRAM此时是访问不到的。 此时,如果我们想对Flash进行编程或擦除操作,该怎么办呢? 显然,要对Flash进行编程或擦除操作,必须通过编程完成,而程序此时只能在SDRAM中运行(如果程序不太大,也可放在S3C4510B片内的SRAM中运行。),所以,我们要做的第一步,就是通过配置相应的特殊功能寄存器,将SDRAM映射出来,使其可以被访问到。 下面是我的一个特殊功能寄存器配置文件,名为:mymap.txt,放在C盘根目录下。 setmem 0x3ff0000,0xE7ffff90,32 setmem 0x3ff3010,0x00003002,32 setmem 0x3ff3014,0x02000060,32 setmem 0x3ff302c,0x14010380,32 setmem 0x3ff303c,0xce338360,32 我使用的硬件是2MB的Flash,16MB的SDRAM。在ADS中打开命令窗口,执行如下命令: >obey c:mymap.txt 此时,2MB的Flash存储器和16MB的SDRAM已分别映射到地址空间的0x0000,0000~(0x0020,0000-1)和0x0040,0000~(0x0140,0000-1)处。 编写一个Flash的擦除程序,由Init.s文件和Main.c文件构成。 Init.s文件的代码如下: IMPORT MainAREA Init,CODE,READONLYENTRYBL MainB .END Main.c文件的代码如下:#define UINT16 unsigned short#define AM_START_ADDR 0x0 //此处为Flash的起始地址,设为0 #define AM_ADDR_UNLOCK1 0x555#define AM_ADDR_UNLOCK2 0x2aa#define AM_DATA_UNLOCK1 0xaaaa#define AM_DATA_UNLOCK2 0x5555#define AM_SETUP_WRITE 0xa0a0#define AM_SETUP_ERASE 0x8080#define AM_CHIP_ERASE 0x1010#define AM_SECTOR_ERASE 0x3030#define AM_RESET 0xf0f0int Main(){ *((volatile UINT16 *)AM_START_ADDR+ AM_ADDR_UNLOCK1) = AM_DATA_UNLOCK1; *((volatile UINT16 *)AM_START_ADDR+ AM_ADDR_UNLOCK2) = AM_DATA_UNLOCK2;*((volatile UINT16 *)AM_START_ADDR+ AM_ADDR_UNLOCK1) = AM_SETUP_ERASE; *((volatile UINT16 *)AM_START_ADDR+ AM_ADDR_UNLOCK1) = AM_DATA_UNLOCK1; *((volatile UINT16 *)AM_START_ADDR+ AM_ADDR_UNLOCK2) = AM_DATA_UNLOCK2; *((volatile UINT16 *)AM_START_ADDR+ AM_ADDR_UNLOCK1) = AM_CHIP_ERASE;return(0); }注:系统使用的Flash为29LV160B,其他型号的Flash,命令字有一些区别。 系统使用的SDARM为HY57641620B &