




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、1 ;=2 ; NAME: 2440INIT.S3 ; DESC: C start up codes4 ;Configure memory, ISR ,stacks5 ; Initialize C-variables6 ; HISTORY:7 ; 2002.02.25:kwtark: ver 0.08 ; 2002.03.20:purnnamu: Add some functions for testing STOP,Sleep mode9 ; 2003.03.14:DonGo: Modified for 2440.10 ; 注释来源于网络和自己的整理。powered by armboyqq.
2、com11 ;=12 GET option.inc ;类似于C语言包含头文件,GET也可用INCLUDE代替(视编译器是否支持)13 GET memcfg.inc14 GET 2440addr.inc1516 BIT_SELFREFRESH EQU (1 mrc p15,0,r0,c1,c0,0165 DCD 0xe3800080 ;0xe3800080 = orr r0,r0,#0x80; /Big-endian166 DCD 0xee010f10 ;0xee010f10 = mcr p15,0,r0,c1,c0,0167 168 ENTRY_BUS_WIDTH=16169 DCD 0x0f
3、10ee11170 DCD 0x0080e380 ;DCD伪指令定义一个32位存储单元,并初始化171 DCD 0x0f10ee01172 173 ENTRY_BUS_WIDTH=8174 DCD 0x100f11ee175 DCD 0x800080e3176 DCD 0x100f01ee177 178 DCD 0xffffffff ;swinv 0xffffff is similar with NOP and179 DCD 0xffffffff ;run well in both endian mode.180 DCD 0xffffffff181 DCD 0xffffffff182 DCD
4、0xffffffff183 b ResetHandler184 ;如第70行所说,这里采用HANDLER宏去建立Hander*和Handle*之间的联系185HandlerFIQHANDLER HandleFIQ186HandlerIRQHANDLER HandleIRQ187HandlerUndefHANDLERHandleUndef188HandlerSWIHANDLERHandleSWI第 2 页189HandlerDabortHANDLER HandleDabort190HandlerPabortHANDLER HandlePabort191 ;=192 ;这一段程序就是用来进行第二次
5、查表的过程了.如果说第一次查表是由硬件来193 ;完成的,那这一次查表就是由软件来实现的了. 为什么要查两次表?194 ;没有办法,ARM把所有的中断都归纳成一个IRQ中断异常和一个FIRQ中断异常,第一195 ;次查表主要是查出是什么异常,可我们总要知道是这个中断异常中的什么中断呀!196 ;没办法了,再查一次表呗!197 ;=198 IsrIRQ199 sub sp,sp,#4; 给PC寄存器保留;reserved for PC200 stmfd sp!,r8-r9 ; 把r8-r9压入栈201;INTOFFSET的值在2440addr.inc中定义为0x4a000014202 ldr r
6、9,=INTOFFSET ; 把中断偏移INTOFFSET的地址装入r9203ldr r9,r9; 把中断偏移INTOFFSET的值装入r9204 ldr r8,=HandleEINT0 ; 这就是向量表的入口HandleEINT0装入r8205 add r8,r8,r9,lsl #2 ;R8=R8+(R92)206ldr r8,r8; 装入中断服务程序的入口207str r8,sp,#8;把入口压入堆栈208 ldmfd sp!,r8-r9,pc ;出栈209 LTORG ;声明文字池210211 ;=212 ; ENTRY213 ;=214 ResetHandler215ldr r0,=W
7、TCON;watch dog disable216 ldr r1,=0x0217 str r1,r0218219 ldr r0,=INTMSK220 ldr r1,=0xffffffff ;all interrupt disable221 str r1,r0222223 ldr r0,=INTSUBMSK224ldr r1,=0x7fff;all sub interrupt disable225 str r1,r0226227 TRUE228 ;rGPFDAT = (rGPFDAT & (0xf4) | (data & 0xf)1; means Fclk:Hclk is not 1:1.250
8、 ; bl MMU_SetAsyncBusMode251 ; |252 ; bl MMU_SetFastBusMode ; default value.253 ; 254 ;=255 ;三星手册里提供的MMU_SetAsyncBusMode 和 MMU_SetFastBusMode 函数都在4K代码256 ;以上(三星2440芯片就提供4K的内部SRAM),如果你想你编译出来的程序能在NAND257 ;上运行的话,就不能在这调用这两函数了.如果你不要求的话,你就可以直接调用.258 ;下面的代码就是实现和上面两函数一样的功能. 利用的协处理器的命令实现了对259 ;总线模式的设置260 ;=2
9、61 ;program has not been copied, so use these directly262 CLKDIV_VAL1; means Fclk:Hclk is not 1:1.263 mrc p15,0,r0,c1,c0,0264 orr r0,r0,#0xc0000000;R1_nF:OR:R1_iA265 mcr p15,0,r0,c1,c0,0266 |267 mrc p15,0,r0,c1,c0,0268 bic r0,r0,#0xc0000000;R1_iA:OR:R1_nF269 mcr p15,0,r0,c1,c0,0270 271272 ;Configure
10、 UPLL.配置 MPLL 一定要使最后的频率为16.9344MHz,不然你甭想用USB接口了,273 ldr r0,=UPLLCON274 ldr r1,=(U_MDIV12)+(U_PDIV4)+U_SDIV)275 str r1,r0276 nop ; Caution: After UPLL setting, at least 7-clocks delay must277 nop ; be inserted for setting hardware be completed.278 nop279 nop280 nop281 nop282 nop第 3 页283 ;Configure MP
11、LL284 ldr r0,=MPLLCON285 ldr r1,=(M_MDIV12)+(M_PDIV4)+M_SDIV) ;Fin=16.9344MHz286 str r1,r0287 288289 ;Check if the boot is caused by the wake-up from SLEEP mode.290 ldr r1,=GSTATUS2291 ldr r0,r1292 tst r0,#0x2293 ;In case of the wake-up from SLEEP mode, go to SLEEP_WAKEUP handler.294 bne WAKEUP_SLEE
12、P295296 ;=297 ;设置存储器控制寄存器,此段代码把13个存储控制器的内容批量的读取到了对应的特殊功能寄存器中298 ;首先是有一个数据区SMRDATA,在程序的后面有定义,这个数据区给13个寄存器分配52字节的地址空间。299 ;在下面的代码中,r0是这个数据区的起始地址,r2是数据区的结束地址,r1是寄存器的起始地址。300 ;这样,用一个判断语句 cmp r2, r0301 ; bne %B0,就可以把内存中的数据赋给这13个存储控制寄存器了。302 ;=303 ;Set memory control registers ;adr装载相对地址(l后缀:long(大范围寻址),l
13、dr装载绝对地址304 adrl r0, SMRDATA;canot use ldr r0,=SMRDATA;305 ldr r1,=BWSCON ;BWSCON Address, 在2440addr.inc中定义306 add r2, r0, #52 ;End address of SMRDATA307 0308 ldr r3, r0, #4309 str r3, r1, #4310 cmp r2, r0311 bne %B0312 ;-313;-When EINT0 is pressed,Clear SDRAM314 ;-315 ;check if EIN0 button is press
14、ed.316 ldr r0,=GPFCON ;加载地址,在2440addr.inc中定义317 ldr r1,=0x0318str r1,r0;置F(0:15)input319 ldr r0,=GPFUP320 ldr r1,=0xff321str r1,r0;不使用上拉电阻322 ldr r1,=GPFDAT ; GPFDAT=0xff323 ldr r0,r1324 bic r0,r0,#(0x1e1) ; bit clear325 tst r0,#0x1326 bne %F1327 ; Clear SDRAM Start-328 mov r1,#0329 mov r2,#0330 mov
15、 r3,#0331 mov r4,#0332 mov r5,#0333 mov r6,#0334 mov r7,#0335 mov r8,#0336337 ldr r9,=0x4000000 ;64MB的SDRAM,0x30000000-0x34000000338 ldr r0,=0x30000000339 0340 stmia r0!,r1-r8341 subs r9,r9,#32342 bne %B0343 ;Clear SDRAM End-344345 1346 ;Initialize stacks347 bl InitStacks ;初始化堆栈348349 ;=350 ;这段程序能在n
16、or nand flash 运行,也可以在内存中运行。在nor nand flash运行,需要拷贝数据;351 ;=352 ldr r0, =BWSCON353 ldr r0, r0354 ands r0, r0, #6;OM1:0 != 0, NOR FLash 或者内存启动;OM1:0 != 0, NOR FLash boot355bnecopy_proc_beg;不用读取 nand flash;do notreadnand flash356adrr0, ResetEntry;OM1:0 = 0, NAND FLash启动357 cmp r0, #0;再比较入口是否为0地址处,如果不是则用
17、了仿真器358bne copy_proc_beg;用仿真器的情况也不要用 nand flash启动359 ;=360nand_boot_beg;这一段代码完成从NAND读代码到RAM361mov r5, #NFCONF;设置NAND FLASH的控制寄存器362 ;set timing value363 ldr r0, =(712)|(78)|(74)364 str r0, r5365 ;enable control366 ldr r0, =(013)|(012)|(010)|(09)|(08)|(16)|(15)|(14)|(11)|(1r0397blCheckBadBlk;检查NAND的坏
18、区398cmpr0, #0;比较r0和0399 addne r8, r8, #32;存在坏块的话就跳过这个坏块400bne%F4;没有的话就跳到标号4处401 3402mov r0, r8;当前页号-r0403 mov r1, r9;当前目标地址-r1,即将|Image$RO$Base|赋值给R1404 bl ReadNandPage;读取该页的NAND数据到RAM405 add r9, r9, #512;每一页的大小是512Bytes406add r8, r8, #1; r8指向下一页407 4408cmp r8, #5120;比较是否读完5120页409bcc %B2;如果r8小于5120
19、(没读完),就返回前面的标号2处410mov r5, #NFCONF;设置NAND FLASH 控制寄存器;DsNandFlash411412 ldr r0, r5, #4413 bic r0, r0, #1414str r0, r5, #4;NAND flash controller enable415 ldr pc, =copy_proc_beg ;copy nand flash 到ram416 ;*417 copy_proc_beg418adr r0, ResetEntry;装载地址,ResetEntry值-r0419ldr r2,BaseOfROM;BaseOfROM值(后面有定义)-
20、r2420cmp r0,r2;比较RO,R2421 ldreq r0, TopOfROM ;如果相等的话(说明在内存中运行,或是从NOR Flash启动),TopOfROM-r0422beq InitRam;同时跳到InitRam423 ;=424 ;下面这个是针对代码在NOR FLASH时的拷贝方法425 ;功能为把从ResetEntry起,TopOfROM-BaseOfROM大小的数据拷到BaseOfROM426 ;TopOfROM和BaseOfROM为|Image$RO$Limit|和|Image$RO$Base|427 ;|Image$RO$Limit|和|Image$RO$Base|
21、由连接器生成428 ;为生成的代码的代码段运行时的起启和终止地址429 ;BaseOfBSS和BaseOfZero为|Image$RW$Base|和|Image$ZI$Base|430 ;|Image$RW$Base|和|Image$ZI$Base|也是由连接器生成431 ;两者之间就是初始化数据的存放地放432 ;=433 ldr r3, TopOfROM4340;ldm批量数据加载指令,ldm后的ia表示每次传送后地址+1435 ldmia r0!, r4-r7 ;运行一次后R0=(R4到R7寄存器个数)*4436 stmia r2!, r4-r7 ;stm批量数据存储指令,!的作用,当数
22、据传输完毕,将最后的地址写入R2437 cmp r2, r3438bcc %B0;C标志置位/大于或小于时向后跳转到0标号处439 ;最终实现拷贝数据到ram440 sub r2, r2, r3;r2=BaseOfROM-TopOfROM=(-)代码长度441 sub r0, r0, r2;r0=ResetEntry-(-)代码长度=ResetEntry+代码长度442 ;*-*443 InitRam444ldr r2,BaseOfBSS;装载数值RWBase445ldr r3,BaseOfZero;装载数值ZIBase446 0447 cmp r2, r3 ;如果R2 top of init
23、ialised data475 ; cmp r0, r1; Check that they are different476 ; beq %F2477 ;1478; cmp r1, r3; Copy init data479 ; ldrcc r2, r0, #4;- LDRCC r2, r0 + ADD r0, r0, #4480 ; strcc r2, r1, #4;- STRCC r2, r1 + ADD r1, r1, #4481 ; bcc %B1482 ;2483 ; ldr r1, =|Image$ZI$Limit| ; Top of zero init segment484 ;
24、mov r2, #0485 ;3486; cmp r3, r1; Zero init487 ; strcc r2, r3, #4488 ; bcc %B3489490491 :LNOT:THUMBCODE492 bl Main ;不要用main()因为main()是ADS默认入口,编译器会添加其他代码493 ;ldr pc, =Main ;494 b .;跳转到Main不成功则挂起495 496497 THUMBCODE ;for start-up code for Thumb mode498 orr lr,pc,#1499 bx lr500 CODE16501 bl Main ;Do not
25、 use main() because .502 b .503 CODE32504 505506507 ;function initializing stacks508 InitStacks509 ;Do not use DRAM,such as stmfd,ldmfd.(这些指令在堆栈建立之后才能用)510 ;before SVCstack is initialized511 ;Under toolkit ver 2.5, msr cpsr,r1 can be used instead of msr cpsr_cxsf,r1512 mrs r0,cpsr513 bic r0,r0,#MODE
26、MASK514 orr r1,r0,#UNDEFMODE|NOINT515msr cpsr_cxsf,r1;UndefMode516ldr sp,=UndefStack; UndefStack=0x33FF_5C00517518 orr r1,r0,#ABORTMODE|NOINT519msr cpsr_cxsf,r1;AbortMode520ldr sp,=AbortStack; AbortStack=0x33FF_6000521522 orr r1,r0,#IRQMODE|NOINT523msr cpsr_cxsf,r1;IRQMode524ldr sp,=IRQStack; IRQStack=0x33FF_7000525526 orr r1,r0,#FIQMODE|NOINT527msr cpsr_cxsf,r1;FIQMode528ldr sp,=FIQStack; FIQStack=0x33FF_8000529530 bic r0,r0,#MODEMASK|NOINT531 orr r1,r0,#SVCMODE532msr cpsr_cxsf,r1;S
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 装修设计工作室管理办法
- 西安市重大项目管理办法
- 规范了人员档案管理办法
- 证监会合规管理办法解释
- 调蓄池施工安全管理办法
- 财政部专项资金管理办法
- 贵州省应急钢桥管理办法
- 赫章县维修资金管理办法
- 路北区节水灌溉管理办法
- 辖区各小区物业管理办法
- 胸腔积液PPT.ppt 课件
- 断指再植术后的切口
- 曾国藩为官之道
- 李中莹心理创伤简快辅导技巧(课堂PPT)
- Q∕GDW 12205-2022 高压柔性直流输电系统控制保护联调试验技术规范
- VS1真空断路器说明书
- JTT230-2021汽车导静电橡胶拖地带_(高清-最新)
- 监理周例会总承包单位工作汇报PPT课件
- 四大经典之温病
- 四氯化硅的提纯
- 《小学公开课教研活动总结》
评论
0/150
提交评论