
基于S3C4510B的系统的Flash擦除和烧写问题(二) (抄的)在《基于S3C4510B的系统的Flash擦除和烧写问题(一)》中讨论了Flash的擦除问题,这里再和大家交流一下Flash烧写的问题。 对Flash的烧写,和前一个帖子所讨论的问题相同,首现应将SDRAM映射出来,然后编写一段烧写程式,下载到SDRAM中,同时将待烧写的内容,也下载到SDRAM中的某个区域,然后执行烧写程式,就可将待烧写的内容写入Flash中。 仍然以上一贴的硬件平台为例,在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 Main AREA Init,CODE,READONLY
ENTRY BL Main B . END
Main.c文档的代码如下:
#define ULCON0
(*(volatile unsigned *)0x03FFD000) //UART channel0 line control register #define UCON0
(*(volatile unsigned *)0x03FFD004) //UART channel0 control register #define USTAT0
(*(volatile unsigned *)0x03FFD008) //UART channel0 status register #define UTXBUF0
(*(volatile unsigned *)0x03FFD00c) //UART channel0 transimit holding register #define URXBUF0
(*(volatile unsigned *)0x03FFD010) //UART channel0 recieve buffer register #define UBRDIV0
(*(volatile unsigned *)0x03FFD014) //Baud rate divisor register0
#define AM_WORD_COUNT
(64*1024)/2 //此处决定待烧写文档的大小,在此为64KB
#define UINT16 unsigned short #define AM_START_ADDR 0x0000000
#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
0xf0f0
void Delay(unsigned int);
void InitUART(int Port,int Baudrate); void PrintUART0(char *s);
int Main() {
volatile UINT16 *from_add,*to_add; int i; InitUART(0,0x500); PrintUART0("ARM Starting...n");
to_add= (UINT16 *)0x0; from_add=(UINT16 *)0x500000; for(i=0;i{*((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_WRITE;
*to_add++ =*from_add++ ; PrintUART0("P");} PrintUART0("Flash Programe Sucessfully!!!n"); return 0;
}
void PrintUART0(char *s) { for(;*s!=’’;s++) {while(!(USTAT0&0x40)); UTXBUF0=*s;}
}
void InitUART(int Port,int Baudrate) { if(Port==0) {ULCON0=0x03; UCON0=0x09; UBRDIV0=Baudrate; } }
void Delay(unsigned int x) { unsigned int i,j,k; for(i=0;i<=x;i++) for(j=0;j<0xff;j++) for(k=0;k<0xff;k++); }
在该烧写程式中,首先初始化了一个串行口,在烧写的过程中能够向串口发送信息,以便我们了解烧写的过程。 建立一个工程文档,包含以上两个文档。 由于要将该程式放在SDRAM中运行,而根据前面的映射,SDRAM的起始地址为0x0040,0000,所以要修改连接器的选项,将代码的装入地址改为0x400000(默认为0x8000)。 编译生成可执行映象文档,装入系统的SDRAM(0x0040,0000处),暂时先不要运行。 该程式的作用就是将放在SDRAM中地址为0x50,0000处的内容写入Flash,所以,在运行之前应将待烧写的内容放在起始地址为0x50,0000的SDRAM中。 在AXD中打开File->Load Memory From File选项,选择待烧写的二进制文档,注意将装载地址改为0x50,0000,和程式对应。 点击“确定”按钮,就可将文档下载到起始地址为0x50,0000的SDRAM中。 此时,再来执行已下载的烧写程式,就可将待烧写的内容写入到起始地址为0x0的Flash中。
|