dlePabort
;非 量中断总入口(需要自己判断中断类型,而不是直接跳转到相应程序)
;产生中断后,需要中断服务程序自己来判断,到底是哪个中断请求,根据的就是INTOFFSET寄存器中的偏移,再计算中断服务地址
IsrIRQ
sub sp,sp,#4 ;reserved for PC,预留返回指针的存储位置
stmfd sp!,{r8-r9}
ldr r9,=INTOFFSET ;the interrupt request source offset
ldr r9,[r9]
ldr r8,=HandleEINT0 ;HandleEINT0 ,在本文件最下边定义的
add r8,r8,r9,lsl #2 ;r9中只是偏移单位的个数,需要*4变成具体字节偏移(相对于EINT0)
ldr r8,[r8]
str r8,[sp,#8] ;pc值放在了高位置
ldmfd sp!,{r8-r9,pc}
LTORG
;LTORG用于声明一个文字池,在使用LDR伪指令时,要在适当的地方加入LTORG声明文字池,这样就会把要加载的数据保存在
;文字池内,再用ARM的《加载指令》读出数据。(若没有使用LTORG声明文字池,则汇编器会在程序末尾自动声明)
;LTORG 伪指令常放在无条件跳转指令之后,或者子程序返回指令之后,这样处理器就不会错误地将文字池中的数据当做指令来执行
;注:在此,文字池内存储的是INTOFFSET宏所代表的值:0x4a000014 。毕竟,当把指令编译成二进制代码时,arm指令(32位)
;不能既表示出指令内容,又表示出数据地址(32位)。估计在编译时,会被汇编成其他的加载指令,再编译成机器码
;LTORG 只要单独写出来就可以了,其他的交给编译器来做,而且它跟它下面的代码没有任何关系
;=======
; ENTRY
;=======
ResetHandler
ldr r0,=WTCON ;watch dog disable 编译时就是 ldr r0,=53000000;伪指令有=号
ldr r1,=0x0 ;这些宏定义都位于2440addr.inc中。 区分:变量定义&& 宏定义
str r1,[r0]
ldr r0,=INTMSK
ldr r1,=0xffffffff ;all interrupt disable 要理解子中断和中断之间的关系
str r1,[r0]
ldr r0,=INTSUBMSK
ldr r1,=0x7fff ;allsub interrupt disable
str r1,[r0]
[{FALSE}
;rGPFDAT= (rGPFDAT & ~(0xf<<4)) | ((~data & 0xf)<<4);
;Led_Display
ldr r0,=GPBCON
ldr r1,=0x155500
str r1,[r0]
ldr r0,=GPBDAT
ldr r1,=0x0
str r1,[r0]
]
;Toreduce PLL lock time, adjust the LOCKTIME register.
ldr r0,=LOCKTIME
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
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 ; meansFclk:Hclk is not 1:1.
mrcp15,0,r0,c1,c0,0
orrr0,r0,#0xc0000000;R1_nF:OR:R1_iA
mcrp15,0,r0,c1,c0,0
|
mrcp15,0,r0,c1,c0,0
bicr0,r0,#0xc0000000;R1_iA:OR:R1_nF
mcrp15,0,r0,c1,c0,0
]
; 在配置UPLLCON和MPLLCON寄存器时,必须先配置UPLLCON,然后再配置MPLLCON,而且两者之间要有7 nop的间隔。(这是2440文档明确要求的)
;ConfigureUPLL
ldr r0,=UPLLCON
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
;ConfigureMPLL
ldr r0,=MPLLCON ;计算公式是固定的,可计算得到
ldr r1,=((M_MDIV<<12)+(M_PDIV<<4)+M_SDIV) ;Fin = 12.0MHz, FCLK= 400MHz
str r1,[r0]
]
;Checkif the boot is caused by the wake-up from SLEEP mode.