设为首页 加入收藏

TOP

ARM启动文件2440init.s分析(四)
2014-11-24 14:39:15 来源: 作者: 【 】 浏览:63
Tags:ARM 启动 文件 2440init.s分析
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.


首页 上一页 1 2 3 4 5 6 7 下一页 尾页 4/8/8
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇Java迷题:等于,还是不等于? 下一篇jQuery倒数计时按钮—setTimeout

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: