@******************************************************************************
@ File:head.s
@ 功用:设置SDRAM,将程序仿制到SDRAM,然后跳到SDRAM持续履行
@******************************************************************************
.text
.global _start
_start:
@函数disable_watch_dog, memsetup, init_nand, nand_read_ll在init.c中界说
ldr sp, =4096 @设置仓库
bl disable_watch_dog @关WATCH DOG
bl memsetup @初始化SDRAM
bl nand_init @初始化NAND Flash
@将NAND Flash中地址4096开端的1024字节代码(main.c编译得到)仿制到SDRAM中
@nand_read_ll函数需求3个参数:
ldr r0, =0x30000000 @1. 方针地址=0x30000000,这是SDRAM的开端地址
mov r1, #4096 @2. 源地址 = 4096,衔接的时分,main.c中的代码都存在NAND Flash地址4096开端处
mov r2, #1024 @3. 仿制长度= 1024(bytes),关于本试验的main.c,这是足够了
bl nand_read @调用C函数nand_read
ldr sp, =0x34000000 @设置栈
ldr lr, =halt_loop @设置回来地址
ldr pc, =main @b指令和bl指令只能前后跳转32M的规模,所以这儿运用向pc赋值的办法进行跳转
halt_loop:
b halt_loop
#define WTCON(*(volatile unsigned long *)0x53000000)
#define MEM_CTL_BASE0x48000000
void disable_watch_dog();
void memsetup();
void disable_watch_dog()
{
WTCON= 0;
}
void memsetup()
{
int i = 0;
unsigned long *p = (unsigned long *)MEM_CTL_BASE;
unsigned long const mem_cfg_val[]={ 0x22011110, //BWSCON
0x00000700, //BANKCON0
0x00000700, //BANKCON1
0x00000700, //BANKCON2
0x00000700, //BANKCON3
0x00000700,