;@*************************************************************************
;@ File:head.S
;@ 功能:设置SDRAM,将程序复制到SDRAM,然后跳到SDRAM继续执行
;@*************************************************************************??????
???????IMPORT????????main
???????IMPORT????????disable_watch_dog
???????IMPORT????????memsetup
???????IMPORT????????copy_steppingstone_to_sdram
??????????
???????AREA????Init,CODE,READONLY??;程序入口的地方
???????ENTRY?
START ??
????????????ldr?????sp,=4096??????????????; @设置堆栈
????????????bl??????disable_watch_dog??????; @关WATCH DOG
????????????bl??????memsetup???????????????; @初始化SDRAM
????????
????????????bl??????copy_steppingstone_to_sdram
??????????
???????
????????????ldr?????lr,=halt_loop?????????; @设置返回地址
????????????ldr?????pc,=main??????????????; @b指令和bl指令只能前后跳转32M的范围,所以这里使用向pc赋值的方法进行跳转
halt_loop
????????????b???????halt_loop
?
????????????END
这是一些初始化函数,只要调用了下面函数,注意两个文件不要放在一起:
#define ?WTCON????(*(volatile unsigned long *)0x53000000)//关门狗寄存器的地址
#define ?MEM_CTL_BASE??0x48000000??//寄存器的起始地址
?
void disable_watch_dog();
void memsetup();
void copy_steppingstone_to_sdram(void);
void disable_watch_dog()
{
?WTCON?= 0;//写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,?