微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > ARM启动文件2440init.s分析

ARM启动文件2440init.s分析

时间:11-23 来源:互联网 点击:

ldr r1,=0xffffff

str r1,[r0]

[ PLL_ON_START ;defined inoption.inc {TRUE},选择要不要设置频率值

;Added for confirm clock divide. for 2440.

;Setting value Fclk:Hclk:Pclk

ldr r0,=CLKdivN ;CLKdivN 时钟分频控制寄存器

ldr r1,=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.

str r1,[r0]

;programhas not been copied, so use these directly

[ CLKdiv_VAL>1 ; means Fclk:Hclk is not 1:1.

;Fclk为cpu的运行时钟,Hclk驱动 AHB总线设备(例如:SDRAM)

mrc p15,0,r0,c1,c0,0

orr r0,r0,#0xc0000000 ;R1_nF:OR:R1_iA

mcr p15,0,r0,c1,c0,0

|

mrc p15,0,r0,c1,c0,0

bic r0,r0,#0xc0000000 ;R1_iA:OR:R1_nF

mcr p15,0,r0,c1,c0,0

]

;在配置UPLLCON和MPLLCON寄存器时,必须先配置UPLLCON,然后再配置MPLLCON,而且两者之间要有7 nop的间

;隔。(这是2440文档明确要求的)

;Configure UPLL

ldr r0,=UPLLCON ;UPLLCON: UPLL configuration register

ldr r1,=((U_Mdiv<12)+(U_Pdiv<4)+U_Sdiv) ;Fin = 12.0MHz, UCLK =48MHz,

;对于usb来说必须是48MHz

str r1,[r0]

nop ; Caution: After UPLL setting, at least7-clocks delay must be inserted

; for setting hardware be completed.

nop

nop

nop

nop

nop

nop

;Configure MPLL

ldr r0,=MPLLCON ;MPLLCON: MPLL configuration register

ldr r1,=((M_Mdiv<12)+(M_Pdiv<4)+M_Sdiv) ;Fin = 12.0MHz, FCLK= 400MHz

str r1,[r0]

]

;-------------------------------------------------------------------------------------------------

;Check if the boot is caused by the wake-up from SLEEP mode.

ldr r1,=GSTATUS2 ;这个寄存器数值表示哪个信号引起的复位动作产生

;检测 GSTATUS2[2]来判断是否是由 sleep 模式唤醒引起的电源开启。

ldr r0,[r1]

tst r0,#0x2

;Incase of the wake-up from SLEEP mode, go to SLEEP_WAKEUP handler.

bne WAKEUP_SLEEP

;-------------------------------------------------------------------------------------------------

;设置总线宽度&等待状态控制寄存器

EXPORT StartPointAfterSleepWakeUp

StartPointAfterSleepWakeUp

;Set memory control registers

;ldr r0,=SMRDATA ;(等效于下边的指令)

adrl r0,SMRDATA ;be careful!中等范围的地址读取伪指令,

;用法类似于ldr(大范围地址读取)伪指令

ldr r1,=BWSCON ;BWSCON Address 总线宽度&等待状态控制寄存器

add r2, r0, #52 ;End address of SMRDATA,共有13个寄存器地址(4字节)需要赋值,13*4=52字节

0

ldr r3, [r0], #4 ;这些都是后变址指令

str r3, [r1], #4

cmp r2, r0

bne % B0 ;当<的时候,跳转到0标号处继续执行

;------------------------------------------------------------------------------------------------

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;;;;;;;;;;;;; When EINT0 is pressed, Clear SDRAM

;如果 EINT0 产生(这中断就是我们按键产生的), 就清除SDRAM ,不过好像没人会在这个时候按

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

; check if EIN0 button is pressed

ldr r0,=GPFCON ;input,无上拉电阻

ldr r1,=0x0

str r1,[r0]

ldr r0,=GPFUP

ldr r1,=0xff

str r1,[r0]

ldr r1,=GPFDAT

ldr r0,[r1]

bic r0,r0,#(0x1e<1) ; bit clear

tst r0,#0x1

bne? % F1??? ;当按键0没有被按下的时候,也就是不相等,则向下跳到1标号

; Clear SDRAM Start

ldr r0,=GPFCON

ldr r1,=0x55aa

str r1,[r0]

; ldr r0,=GPFUP

; ldr r1,=0xff

; str r1,[r0]

ldr r0,=GPFDAT

ldr r1,=0x0

str r1,[r0] ;LED=****

mov r1,#0

mov r2,#0

mov r3,#0

mov r4,#0

mov r5,#0

mov r6,#0

mov r7,#0

mov r8,#0

ldr r9,=0x4000000 ;64MB ,这几条指令目的是:擦除sdram的所有数据

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

网站地图

Top