@******************************************************************************@ File:head.s
@ 功能:設(shè)置SDRAM,將程序復(fù)制到SDRAM,然后跳到SDRAM繼續(xù)執(zhí)行
@******************************************************************************
.text
.global _start
_start:
@函數(shù)disable_watch_dog, memsetup, init_nand, nand_read_ll在init.c中定義
ldr sp, =4096 @設(shè)置堆棧
bl disable_watch_dog @關(guān)WATCH DOG
bl memsetup @初始化SDRAM
bl nand_init @初始化NAND Flash
本文引用地址:http://m.ptau.cn/article/201611/319116.htm @將NAND Flash中地址4096開(kāi)始的1024字節(jié)代碼(main.c編譯得到)復(fù)制到SDRAM中
@nand_read_ll函數(shù)需要3個(gè)參數(shù):
ldr r0, =0x30000000 @1. 目標(biāo)地址=0x30000000,這是SDRAM的起始地址
mov r1, #4096 @2. 源地址 = 4096,連接的時(shí)候,main.c中的代碼都存在NAND Flash地址4096開(kāi)始處
mov r2, #1024 @3. 復(fù)制長(zhǎng)度= 1024(bytes),對(duì)于本實(shí)驗(yàn)的main.c,這是足夠了
bl nand_read @調(diào)用C函數(shù)nand_read
ldr sp, =0x34000000 @設(shè)置棧
ldr lr, =halt_loop @設(shè)置返回地址
ldr pc, =main @b指令和bl指令只能前后跳轉(zhuǎn)32M的范圍,所以這里使用向pc賦值的方法進(jìn)行跳轉(zhuǎn)
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,