在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
芯片精品文章合集(500篇!)    创芯人才网--重磅上线啦!
查看: 2479|回复: 1

[转帖]基于S3C4510B的系统的Flash擦除与烧写问题(二)

[复制链接]
发表于 2003-10-27 12:51:27 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

x
基于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 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<AM_WORD_COUNT;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("");}
PrintUART0("Flash Programe Sucessfully!!!\n");
return 0;
}
void PrintUART0(char *s)
{
for(;*s!='\0';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中。
 楼主| 发表于 2003-10-27 12:52:59 | 显示全部楼层

[转帖]基于S3C4510B的系统的Flash擦除与烧写问题(二)

这两天玩Flash,问题多多,在网上见到此贴,感觉不错,转来供大家观赏。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐 上一条 /2 下一条

小黑屋| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-5-9 02:03 , Processed in 0.030711 second(s), 8 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表