新闻  |   论坛  |   博客  |   在线研讨会
基于s3c4510B的烧写
yanqin | 2009-04-16 23:40:34    阅读:2011   发布文章

下面详细说明一下FLASH 的烧写与擦除的步骤以及注意事项.
一 FLASH烧写与擦除源程序的编译与链接及相关选项的设置
1>打开ARM Project Manger ,选择new新建一个project工程项目,此处不妨取名为flash_e,其中Type 选项为ARM Excuteable Image.
2>打开工程,选择project选项,Add Files to Sources,将所需的源文件添加到工程当中去(在此认为Init.s 与Main.c已经在ADS及AXD中已经编译调试成功),此处选择加入这两个文件.
3>选择DebugRel,再选择Project菜单下的Tool Configuration for DebugRel 中的ARMlink,进行相关的选项与参数设置.
  此处要注意设置:
   1  Entry and Base 中的Read-Only 的地址设置:擦除程序入口地址为0x40,0000,烧写程序的入口地址为0x40,0000,应用程序的入口地址应为0x0
   3  要增加附加的参数设置,要在listing 中的Extra Command Arguments中设置,此处需注意的是要进行映像设置-map,还有就是注意初始化代码要在前面 -first init.o(Init)
4>Build DebugRel
5>对要装入的程序要生成Bin文件 fromelf led.axf -bin led.bin
二 程序装入
1>打开ARM Debugger,打开命令行窗口,执行obey c:\memmap.txt 的地址映射文件.
memmap.txt
let 0x3ff0000 = 0xe7ffff82
let 0x3ff3010 = 0x00003000
let 0x3ff3014 = 0x00800060
let 0x3ff302c = 0x08004380
let 0x3ff303c = 0xce3383fd
////////////////////////////////////////////////////////////////
let 0x3ff0000 = 0xe7ffff82
选择SDRAM,特殊功能寄存器的基地址为0X03FF0000,片内SRAM基地址为0x03FE0000,4KB配置为SRAM,另外4KB配置为Cache.
let 0x3ff3010 = 0x00003000
4个外部I/O组禁用,DRAM/SDRAM组0配置为32位数据宽度,其余的DRAM/SDRAM组禁用,ROM/SRAM/FLASH组0由B0SIZE[1:0]的状态配置,其余禁用.
let 0x3ff3014 = 0x00800060
let 0x3ff302c = 0x08004380
由于本实验板是512Kflash(0x00000000-0x00080000),4MDRAM(0x00400000-00800000),故配置如上值
let 0x3ff303c = 0xce3383fd
配置SDRAM的刷新计数值,刷新时间,刷新使能
2>load Imamge,装入映像文件然后调试.再装入应用程序时,使用get file,此处注意装入地址为0x0.
三 程序源代码
1 FLASH擦除程序源代码
/*Init.s*/
//////////////////////////////////////////////////
IMPORT Main
AREA init,CODE,READONLY
ENTRY
LDR R0,=0x3FF0000
LDR R1,=0xE7FFFF80
STR R1,[R0]
LDR SP,=0x3FE1000
BL Main
END
*******************************************************
/*Main.c*/
*******************************************************
#define FLASH_ADDR_UNLOCK1 0x555/*此处对应ARM的0XAAA地址
#define FLASH_ADDR_UNLOCK2 0x2AA/*此处对应ARM的0X554地址
#define FLASH_DATA_UNLOCK1 0xAAAA
#define FLASH_DATA_UNLOCK2 0x5555
#define FLASH_SETUP_ERASE 0x8080
#define FLASH_CHIP_ERASE 0x1010
#define UINT16 unsigned short
/***************************************

#include <stdio.h>
int FlashStatusDetect(UINT16 *ptr,UINT16 Data,int TimeCounter);
void Delay(unsigned int x);
int Main()
{
volatile UINT16 *flashPtr=(UINT16*)FLASH_START_ADDR;
*((volatile UINT16 *)FLASH_START_ADDR+FLASH_ADDR_UNLOCK1)=FLASH_DATA_UNLOCK1 ;
Delay(1);
*((volatile UINT16 *)FLASH_START_ADDR+FLASH_ADDR_UNLOCK2)=FLASH_DATA_UNLOCK2 ;
Delay(1);
*((volatile UINT16 *)FLASH_START_ADDR+FLASH_ADDR_UNLOCK1)=FLASH_SETUP_ERASE ;
Delay(10);
*((volatile UINT16 *)FLASH_START_ADDR+FLASH_ADDR_UNLOCK1)=FLASH_DATA_UNLOCK1 ;
Delay(1);
*((volatile UINT16 *)FLASH_START_ADDR+FLASH_ADDR_UNLOCK2)=FLASH_DATA_UNLOCK2 ;
Delay(1);
*((volatile UINT16 *)FLASH_START_ADDR+FLASH_ADDR_UNLOCK1)=FLASH_CHIP_ERASE ;
Delay(10);
if(FlashStatusDetect((UINT16 *)flashPtr,0xffff,0x10000000)!=1)
printf("ERROR!");
return(0);
}
int FlashStatusDetect(UINT16 *ptr,UINT16 Data,int TimerCounter)
{
int tmp=TimerCounter;
volatile UINT16 *p=ptr;
UINT16 current_data;
current_data=Data&0x8080;
while((*p&0x8080)!=current_data)
{
if(tmp--<=0)
return 0;
}
return 1;
}
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++);
   }
2 FLASH烧写程序源代码
/*Init.s*/
*******************************************************
IMPORT Main
AREA init,CODE,READONLY
ENTRY
LDR R0,=0x3FF0000
LDR R1,=0xE7FFFF80
STR R1,[R0]
LDR SP,=0x3FE1000
BL Main
END
*******************************************************
/*Main.c*/
#define FLASH_START_ADDR 0x0000
#define FLASH_ADDR_UNLOCK1 0x555/*此处对应ARM的0XAAA地址
#define FLASH_ADDR_UNLOCK2 0x2AA/*此处对应ARM的0X554地址
#define FLASH_DATA_UNLOCK1 0xAAAA
#define FLASH_DATA_UNLOCK2 0x5555
#define FLASH_SETUP_WRITE 0xa0a0
#define UINT16 unsigned short
#define ARM_WORD_COUNT (1*1024)/2
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++);
   }
int Main()
{
volatile UINT16 *to_addr,*from_addr;
int i=0;
to_addr=(UINT16 *)0x0;
from_addr=(UINT16 *)0x500000;

for(i=0;i<ARM_WORD_COUNT;i++)
{
*((volatile UINT16 *)FLASH_START_ADDR+FLASH_ADDR_UNLOCK1)=FLASH_DATA_UNLOCK1;
Delay(1);
*((volatile UINT16 *)FLASH_START_ADDR+FLASH_ADDR_UNLOCK2)=FLASH_DATA_UNLOCK2;
Delay(1);
*((volatile UINT16 *)FLASH_START_ADDR+FLASH_ADDR_UNLOCK1)=FLASH_SETUP_WRITE;
Delay(1);
*to_addr++=*from_addr++;
Delay(10);
}
return 0;
}
3 LED示例应用程序
/*Init.s*/
*******************************************************
IMPORT  Main
AREA    Init,CODE,READONLY
ENTRY
LDR R0,=0x3FF0000
LDR R1,=0xE7FFFF80
STR R1,[R0]
LDR SP,=0x3FE1000
BL Main
END
/*Main*/
*******************************************************
#define IOPMOD (*(volatile unsigned *)0x03ff5000)
#define IOPDATA (*(volatile unsigned *)0x03ff5008)
  void Delay(unsigned int x);
int Main()
{
IOPMOD=0xFFFFFFFF;
IOPDATA=0x40;
for(;;)
{
IOPDATA=0x0;
Delay(20);
IOPDATA=0x40;
Delay(20);
   }
return(0);
   }
void Delay(unsigned int x)
{
   unsigned int i,k,j;
   for(i=0;i<=x;i++)
   for(k=0;k<0xff;k++)
       for(j=0;j<0xff;j++);
}
*******************************************************
编程注意事项:
1 在编写ARM初始化程序时,要注意(伪)汇编命令之前要有一个空格,否则编译器将会把该命令认为是一个标号.
2 进行内核映射时,一定要写好映射文件(根据实际的开发板),进入调试器之后,首先进行地址空间的分配.
3 FLASH与ARM的地址要注意,ARM支持8位,16位,32位的数据宽度
4 要在RAM里运行的程序RO-BASE应设置到RAM的地址空间
5 在编写烧写与擦除FLASH时要注意加延时程序
6 注意次开发板的P6口对应的是D6指示灯(绿)
7 重新Build文件时,要删除原来的*.o和*.axf文件
8 有时需要重新启动计算机,JTAG.EXE,ADW调试器
9





*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。

参与讨论
登录后参与讨论
推荐文章
最近访客