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

S3C2440启动代码分析

时间:11-21 来源:互联网 点击:
  1. ,r0,#52;EndaddressofSMRDATA
  2. 0
  3. ldrr3,[r0],#4;数据处理后R0自加4,[R0]->R3,R0+4->R0
  4. strr3,[r1],#4
  5. cmpr2,r0
  6. bne%B0
  7. ;//设置所有的memorycontrolregister,他的初始地址为BWSCON,初始化
  8. ;//数据在以SMRDATA为起始的存储区
  9. movr1,#256
  10. 0
  11. subsr1,r1,#1;1)waituntiltheSelfRefreshisreleased.
  12. bne%B0
  13. ;//1)waituntiltheSelfRefreshisreleased.
  14. ldrr1,=GSTATUS3;GSTATUS3hasthestartaddressjustafterSLEEPwake-up
  15. ldrr0,[r1]
  16. movpc,r0
  17. ;//跳出SleepMode,进入Sleep状态前的PC
  18. ;============================================================================================
  19. ;如上所说,这里采用HANDLER宏去建立Hander***和Handle***之间的联系
  20. LTORG;声明文字池,因为我们用了ldr伪指令
  21. HandlerFIQHANDLERHandleFIQ
  22. HandlerIRQHANDLERHandleIRQ
  23. HandlerUndefHANDLERHandleUndef
  24. HandlerSWIHANDLERHandleSWI
  25. HandlerDabortHANDLERHandleDabort
  26. HandlerPabortHANDLERHandlePabort
  27. ;===================================================================================
  28. ;呵呵,来了来了.好戏来了,这一段程序就是用来进行第二次查表的过程了.
  29. ;如果说第一次查表是由硬件来完成的,那这一次查表就是由软件来实现的了.
  30. ;为什么要查两次表??
  31. ;没有办法,ARM把所有的中断都归纳成一个IRQ中断异常和一个FIRQ中断异常
  32. ;第一次查表主要是查出是什么异常,可我们总要知道是这个中断异常中的什么中断呀!
  33. ;没办法了,再查一次表呗!
  34. ;===================================================================================
  35. ;//外部中断号判断,通过中断服务程序入口地址存储器的地址偏移确定
  36. ;//PC=[HandleEINT0+[INTOFFSET]]
  37. ;H|------|
  38. ;|///|
  39. ;|--isr-|====>pc
  40. ;L|--r8--|
  41. ;|--r9--|<----sp
  42. IsrIRQ
  43. subsp,sp,#4;给PC寄存器保留reservedforPC
  44. stmfdsp!,{r8-r9};把r8-r9压入栈
  45. ldrr9,=INTOFFSET;把INTOFFSET的地址装入r9INTOFFSET是一个内部的寄存器,存着中断的偏移
  46. ldrr9,[r9];I_ISR
  47. ldrr8,=HandleEINT0;这就是我们第二个中断向量表的入口的,先装入r8
  48. ;===================================================================================
  49. ;哈哈,这查表方法够好了吧,r8(入口)+index*4(别望了一条指令是4bytes的喔),
  50. ;这不就是我们要找的那一项了吗.找到了表项,下一步做什么?肯定先装入了!
  51. ;==================================================================================
  52. addr8,r8,r9,lsl#2;地址对齐,因为每个中断向量占4个字节,即isr=IvectTable+Offeset*4
  53. ldrr8,[r8];装入中断服务程序的入口
  54. strr8,[sp,#8];把入口也入栈,准备用旧招
  55. ldmfdsp!,{r8-r9,pc};施招,弹出栈,哈哈,顺便把r8弹出到PC了,跳转成功!
  56. LTORG
  57. ;==============================================================================
  58. ;ENTRY(好了,我们的CPU要在这复位了.)
  59. ;==============================================================================
  60. ResetHandler
  61. ldrr0,=WTCON;1.关看门狗
  62. ldrr1,=0x0;bit[5]:0-disable;1-enable(reset默认)
  63. strr1,[r0]
  64. ldrr0,=INTMSK
  65. ldrr1,=0xffffffff;2.关中断
  66. strr1,[r0]
  67. ldrr0,=INTSUBMSK
  68. ldrr1,=0x7fff;3.关子中断
  69. strr1,[r0]
  70. [{FALSE};4.得有些表示了,该点点LED灯了,不过被FALSE掉了.
  71. ;rGPFDAT=(rGPFDAT&~(0xf<4))|((~data&0xf)<4);
  72. ;Led_Display
  73. ldrr0,=GPFCON
  74. ldrr1,=0x5500
  75. strr1,[r0]
  76. ldrr0,=GPFDAT
  77. ldrr1,=0x10
  78. strr1,[r0]
  79. ]
  80. ;5.为了减少PLL的locktime,调整LOCKTIME寄存器.
  81. ;ToreducePLLlocktime,adjusttheLOCKTIMEregister.
  82. ldrr0,=LOCKTIME
  83. ldrr1,=0xffffff;reset的默认值
  84. strr1,[r0]
  85. ;6.下面就来设置PLL了,你的板快不快就看这了!!
  86. ;这里介绍一下计算公式
  87. ;//Fpllo=(m*Fin)/(p*2^s)
  88. ;//m=Mdiv+8,p=Pdiv+2,s=Sdiv
  89. ;TheproperrangeofPandM:1<=P<=62,1<=M<=248
  90. ;Fpllo必须大于200Mhz小于600Mhz
  91. ;Fpllo*2^s必须小于1.2GHz
  92. ;如下面的PLLCON设定中的M_divP_divS_div是取自option.h中
  93. ;#elif(MCLK==40000000)
  94. ;#definePLL_M(0x48)
  95. ;#definePLL_P(0x3)
  96. ;#definePLL_S(0x2)
  97. ;所以m=Mdiv+8=80,p=Pdiv+2=5,s=Sdiv=2
  98. ;硬件使用晶振为10Mhz,即Fin=10Mhz
  99. ;Fpllo=80*10/5*2^2=40Mhz
  100. [PLL_ON_START
  101. ;Addedforconfirmclockdivide.for2440.
  102. ;SettingvalueFclk:Hclk:Pclk
  103. ldrr0,=CLKdivN
  104. 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.option.inc中定义CLKdiv_VAL=7
  105. strr1,[r0];//数据表示分频数
  106. ;===============================================================================
  107. ;MMU_SetAs

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

网站地图

Top