微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > s3c2440启动文件详细分析

s3c2440启动文件详细分析

时间:11-19 来源:互联网 点击:
interrupt disable
strr1,[r0]

ldrr0,=INTSUBMSK
ldrr1,=0x7fff;all sub interrupt disable
strr1,[r0]

;由于启动文件是无法仿真的,因此为了判断该文件中语句的正确与否,往往在需要观察的地方加上一段点亮LED的程序,这样就可以知道程序是否已经执行到此处
;下面方括号内的程序就是点亮LED的小程序
[ {FALSE}
;rGPFDAT = (rGPFDAT & ~(0xf<4)) | ((~data & 0xf)<4);
; Led_Display
ldrr0,=GPBCON
ldrr1,=0x155500
strr1,[r0]
ldrr0,=GPBDAT
ldrr1,=0x0
strr1,[r0]
]

;下列程序是用于设置系统时钟频率
;设置PLL的锁定时间常数,以得到一定时间的延时
;To reduce PLL lock time, adjust the LOCKTIME register.
ldrr0,=LOCKTIME
ldrr1,=0xffffff
strr1,[r0]

[ PLL_ON_START
; Added for confirm clock divide. for 2440.
; Setting value Fclk:Hclk:Pclk
;设置系统的三个时钟频率FCLK、HCLK、PCLK
ldrr0,=CLKdivN
ldrr1,=CLKdiv_VAL; 0=1:1:1, 1=1:1:2, 2=1:2:2, 3=1:2:4, 4=1:4:4, 5=1:4:8, 6=1:3:3, 7=1:3:6.
strr1,[r0]

;program has not been copied, so use these directly
[ CLKdiv_VAL>1;if FCLK:HCLK≠1:1
;设置时钟模式为异步模式
mrc p15,0,r0,c1,c0,0
orr r0,r0,#0xc0000000;R1_nF:OR:R1_iA
mcr p15,0,r0,c1,c0,0
|;else
;设置时钟模式为快速总线模式
mrc p15,0,r0,c1,c0,0
bic r0,r0,#0xc0000000;R1_iA:OR:R1_nF
mcr p15,0,r0,c1,c0,0
]

;配置UPLL
;按照手册中的计算公式,确定Mdiv、Pdiv和Sdiv
;得到当系统输入时钟频率为12MHz的情况下,UCLK输出频率为48MHz
;Configure UPLL
ldrr0,=UPLLCON
ldrr1,=((U_Mdiv<12)+(U_Pdiv<4)+U_Sdiv);Fin = 12.0MHz, UCLK = 48MHz
strr1,[r0]
;等待至少7个时钟周期,以保证系统的正确配置
nop; Caution: After UPLL setting, at least 7-clocks delay must be inserted for setting hardware be completed.
nop
nop
nop
nop
nop
nop
;配置MPLL,同UPLL
;Configure MPLL
ldrr0,=MPLLCON
ldrr1,=((M_Mdiv<12)+(M_Pdiv<4)+M_Sdiv);Fin = 12.0MHz, FCLK = 400MHz
strr1,[r0]
]

;从SLEEP模式下被唤醒,类似于RESET引脚被触发,因此它也要从0x0处开始执行
;在此处要判断是否是由SLEEP模式唤醒引起的复位
;Check if the boot is caused by the wake-up from SLEEP mode.
ldrr1,=GSTATUS2
ldrr0,[r1]
tstr0,#0x2;检查GSTATUS2寄存器的第1位
;In case of the wake-up from SLEEP mode, go to SLEEP_WAKEUP handler.
bneWAKEUP_SLEEP;是被唤醒的,则跳转

;设置一个被唤醒复位后的起始点地址标号,可以把它保存到GSTATUS3中
;导出该地址标号,以便在C语言程序中使用
EXPORT StartPointAfterSleepWakeUp
StartPointAfterSleepWakeUp

;设置内存控制寄存器
;关于内存控制寄存器一共有以BWSCON为开始的连续放置的13个寄存器,我们要一次性批量完成这13个寄存器的配置
;因此开辟一段以SMRDATA为地址起始点的13个字单元空间,按顺序放入要写入的13个寄存器内容
;Set memory control registers
;ldrr0,=SMRDATA
adrlr0, SMRDATA;得到SMRDATA空间的首地址
ldrr1,=BWSCON;得到BWSCON的地址
addr2, r0, #52;得到SMRDATA空间的末地址

;完成13个字数据的复制
0
ldrr3, [r0], #4
strr3, [r1], #4
cmpr2, r0
bne%B0

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;When EINT0 is pressed,Clear SDRAM
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; check if EIN0 button is pressed
;检查EIN0按钮是否被按下
ldrr0,=GPFCON
ldrr1,=0x0
strr1,[r0];GPFCON=0,F口为输入
ldrr0,=GPFUP
ldrr1,=0xff
strr1,[r0];GPFUP=0xff,上拉功能无效

ldrr1,=GPFDAT
ldrr0,[r1];读取F口数据
bicr0,r0,#(0x1e<1);仅保留第1位数据,其他清0
tstr0,#0x1;判断第1位
bne %F1;不为0表示按钮没有被按下,则向前跳转,不执行清空SDRAM

; Clear SDRAM Start
;清空SDRAM
ldrr0,=GPFCON
ldrr1,=0x55aa
strr1,[r0];GPF7~4为输出,GPF3~0为中断
;ldrr0,=GPFUP
;ldrr1,=0xff
;strr1,[r0];上拉功能无效
ldrr0,=GPFDAT
ldrr1,=0x0
strr1,[r0];GPFDAT = 0

mov r1,#0
mov r2,#0
mov r3,#0
mov r4,#0
mov r5,#0
mov r6,#0
mov r7,#0
mov r8,#0

ldrr9,=0x4000000;64MB RAM
ldrr0,=0x30000000;RAM首地址
;清空64MB的RAM
0
stmiar0!,{r1-r8}
subsr9,r9,#32
bne%B0

;Clear SDRAM End

1
;初始化各种处理器模式下的堆栈
;Initialize stacks
blInitStacks;跳转到InitStacks

;===========================================================

;下面的代码为把ROM中的数据复制到RAM中
ldrr0, =BWSCON
ldrr0, [r0]
andsr0, r0, #6;读取OM[1:0]引脚状态
;为0表示从NAND Flash启动,不为0则从NOR Flash启动
bnecopy_proc_beg;跳转,不用读取NAND Flash
adrr0, ResetEntry;OM[1:0] == 0,从NAND Flash启动
cmpr0, #0;if use Multi-ice,
bnecopy_proc_beg;do not read nand flash for boot
;nop
;===========================================================
nand_boot_beg
[ {TRUE}
bl RdNF2SDRAM;复制NAND Flash到SDRAM
]

ldrpc, =copy_proc_beg
;===========================================================
copy_proc_beg
adrr0, ResetEntry
ldrr2, BaseOfROM
cmpr0, r2;比较程序入口地址与连接器定义的RO基地址
ldreqr0, TopOfROM;如果相等,把RO尾地址读取到r0中
beqInitRam;如果相等,则跳转
ldr r3, TopOfROM;否则,把RO尾地址读取到r3中
;下列循环体为在程序入口地址与连接器定义的RO基地址不相等的情况下,把程序复制到RAM中
0
ldmiar0!, {r4-r7}
stmiar2!, {r4-r7}
cmpr2, r3
bcc%B0
;修正非字对齐的情况
subr2, r2, r3
subr0, r0, r2

InitRam
ldrr2, BaseOfBSS
ldrr3, BaseOfZero
;下面循环体为复制已初始化的全局变量
0
cmpr2, r3
ld

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top