start.s
上传用户:mhstny
上传日期:2022-08-05
资源大小:793k
文件大小:10k
源码类别:

微处理器开发

开发平台:

Unix_Linux

  1. ;=========================================
  2. ; NAME: 2410INIT.S
  3. ; DESC: C start up codes
  4. ;       Configure memory, ISR ,stacks
  5. ; Initialize C-variables
  6. ; HISTORY:
  7. ; 2002.02.25:kwtark: ver 0.0
  8. ; 2002.03.20:purnnamu: Add some functions for testing STOP,POWER_OFF mode
  9. ;=========================================
  10. GET option.s
  11. GET memcfg.s
  12. GET 2410addr.s
  13. BIT_SELFREFRESH EQU (1<<22)
  14. ;ARM异常模式的定义
  15. ;Pre-defined constants
  16. USERMODE    EQU  0x10
  17. FIQMODE     EQU  0x11
  18. IRQMODE     EQU  0x12
  19. SVCMODE     EQU  0x13
  20. ABORTMODE   EQU  0x17
  21. UNDEFMODE   EQU  0x1b
  22. MODEMASK    EQU  0x1f
  23. NOINT       EQU  0xc0
  24. ;ARM个异常模式堆栈
  25. ;The location of stacks
  26. UserStack EQU (_STACK_BASEADDRESS-0x3800) ;0x33ff4800 ~ 
  27. SVCStack EQU (_STACK_BASEADDRESS-0x2800) ;0x33ff5800 ~
  28. UndefStack EQU (_STACK_BASEADDRESS-0x2400) ;0x33ff5c00 ~
  29. AbortStack EQU (_STACK_BASEADDRESS-0x2000) ;0x33ff6000 ~
  30. IRQStack EQU (_STACK_BASEADDRESS-0x1000) ;0x33ff7000 ~
  31. FIQStack EQU (_STACK_BASEADDRESS-0x0) ;0x33ff8000 ~ 
  32. ;Check if tasm.exe(armasm -16 ...@ADS 1.0) is used.
  33. GBLL    THUMBCODE
  34. [ {CONFIG} = 16  ;[ = IF
  35. THUMBCODE SETL  {TRUE}
  36.     CODE32          ; CODE32 表明一下操作都在ARM状态
  37.      |  ;| = ELSE  
  38. THUMBCODE SETL  {FALSE}
  39.      ] ;] = ENDIF
  40. ;宏定义MOV_PC_LR
  41.      MACRO
  42. MOV_PC_LR
  43.      [ THUMBCODE
  44.             bx lr
  45.      |
  46.             mov pc,lr
  47.      ]
  48. MEND
  49.      MACRO
  50. MOVEQ_PC_LR
  51.      [ THUMBCODE
  52.          bxeq lr
  53.      |
  54.             moveq pc,lr
  55.      ]
  56. MEND
  57. ;宏定义-进入异常流程
  58. ;HANDLER-宏的名称
  59. ;$HandleLabel-宏的参数
  60. ;这个宏的作用是把各个中断程序的地址装入当前的PC,2410有两种装断模式 一种是没有中断向量表,一种是使用中断向量表的
  61. ;使用中断向量表只能是IRQ方式,当使用中断向量表的时候,中断发生时由2410的中断控制器自动跳转到
  62. ;相应的位置。
  63.      MACRO
  64. $HandlerLabel HANDLER $HandleLabel
  65. $HandlerLabel
  66. sub sp,sp,#4         ;decrement sp(to store jump address)
  67. stmfd sp!,{r0}        ;PUSH the work register to stack(lr doest push because it return to original address)
  68. ldr     r0,=$HandleLabel;load the address of HandleXXX to r0
  69. ldr     r0,[r0]         ;load the contents(service routine start address) of HandleXXX
  70. str     r0,[sp,#4]      ;store the contents(ISR) of HandleXXX to stack
  71. ldmfd   sp!,{r0,pc}     ;POP the work register and pc(jump to ISR)
  72. MEND
  73. ;连接器生成的输出段相关的符号
  74. ;引入连接器生成的映象文件的各个部分地址。
  75. ;OR-只读区域、RW-读写区域、ZI-初始化为0的区域。
  76. IMPORT  |Image$$RO$$Base| ; Base of ROM code
  77. IMPORT  |Image$$RO$$Limit|  ; End of ROM code (=start of ROM data)
  78. IMPORT  |Image$$RW$$Base|   ; Base of RAM to initialise
  79. IMPORT  |Image$$ZI$$Base|   ; Base and limit of area
  80. IMPORT  |Image$$ZI$$Limit|  ; to zero initialise
  81. ;引入外部函数Main,进入C程序。
  82. IMPORT  Main    ; The main entry of mon program
  83. ;IMPORT  LEDTEST 
  84. ;定义ARM汇编程序段,段名为SelfBoot,程序段为只读的代码段。
  85. AREA    SelfBoot, CODE, READONLY
  86. ;程序入口地址
  87. ENTRY
  88.  
  89. ResetEntry
  90. ;程序段执行的第一跳指令,为8个异常中断处理向量,要按顺序放置。
  91. b ResetHandler  
  92. b HandlerUndef ;handler for Undefined mode
  93. b HandlerSWI ;handler for SWI interrupt
  94. b HandlerPabort ;handler for PAbort
  95. b HandlerDabort ;handler for DAbort
  96. b . ;reserved
  97. b HandlerIRQ ;handler for IRQ interrupt 
  98. b HandlerFIQ ;handler for FIQ interrupt
  99. LTORG ;声明一个数据缓冲池的开始   
  100. HandlerFIQ      HANDLER HandleFIQ
  101. HandlerIRQ      HANDLER HandleIRQ
  102. HandlerUndef    HANDLER HandleUndef
  103. HandlerSWI      HANDLER HandleSWI
  104. HandlerDabort   HANDLER HandleDabort
  105. HandlerPabort   HANDLER HandlePabort
  106. ;采用INTOFFSET寄存器判定IRQ中断源
  107. IsrIRQ  
  108. sub sp,sp,#4       
  109. stmfd sp!,{r8-r9}
  110. ldr r9,=INTOFFSET
  111. ldr r9,[r9]
  112. ldr r8,=HandleEINT0
  113. add r8,r8,r9,lsl #2
  114. ldr r8,[r8]
  115. str r8,[sp,#8]
  116. ldmfd sp!,{r8-r9,pc}
  117. ;======================================================
  118. ; ENTRY  
  119. ;======================================================
  120. ;初始化程序入口指令
  121. ResetHandler
  122. ldr r0,=WTCON       ;watch dog disable 
  123. ldr r1,=0x0         
  124. str r1,[r0]
  125. ldr r0,=INTMSK
  126. ldr r1,=0xffffffff  ;all interrupt disable
  127. str r1,[r0]
  128. ldr r0,=INTSUBMSK
  129. ldr r1,=0x3ff ;all sub interrupt disable
  130. str r1,[r0]
  131. ;To reduce PLL lock time, adjust the LOCKTIME register. 
  132. ldr r0,=LOCKTIME
  133. ldr r1,=0xffffff
  134. str r1,[r0]
  135.         
  136. ;Configure MPLL
  137. ldr r0,=MPLLCON          
  138. ldr r1,=((M_MDIV<<12)+(M_PDIV<<4)+M_SDIV)  ;Fin=12MHz,Fout=50MHz
  139. str r1,[r0]
  140. ;设置存储器控制寄存器。
  141. ;Set memory control registers
  142. adr r0, SMRDATA
  143. ldr r1,=BWSCON ;BWSCON Address
  144. add r2, r0, #52 ;End address of SMRDATA一共13个寄存器
  145. 0       
  146. ldr r3, [r0], #4    
  147. str r3, [r1], #4    
  148. cmp r2, r0
  149. bne %B0
  150. ;禁止Icache和Dcache,禁止MMU
  151. ;IMPORT  MMU_DisableICache
  152.     ;bl MMU_DisableICache ;
  153. ;IMPORT  MMU_DisableDCache
  154.     ;bl MMU_DisableDCache ;
  155.     ;IMPORT  MMU_InvalidateICache
  156.     ;bl  MMU_InvalidateICache ;
  157.     ;IMPORT  MMU_DisableMMU
  158.     ;bl  MMU_DisableMMU ;
  159. ;初始化堆栈
  160.     ;Initialize stacks
  161. bl InitStacks
  162. ;建立IRQ中断
  163.    ; Setup IRQ handler
  164. ldr r0,=HandleIRQ       ;This routine is needed
  165. ldr r1,=IsrIRQ          ;if there isn't 'subs pc,lr,#4' at 0x18, 0x1c'
  166. str r1,[r0]
  167. ;===========================================================
  168. adr r0, ResetEntry
  169. ldr r2, BaseOfROM
  170. cmp r0, r2
  171. ldreq r0, TopOfROM
  172. beq InitRam
  173. ldr r3, TopOfROM
  174. ;将RO区域的代码copy到RW域中并且将ZI区域初始化为0。
  175. 0
  176. ldmia r0!, {r4-r7}
  177. stmia r2!, {r4-r7}
  178. cmp r2, r3
  179. bcc %B0
  180. sub r2, r2, r3
  181. sub r0, r0, r2
  182. InitRam
  183. ldr r2, BaseOfBSS
  184. ldr r3, BaseOfZero
  185. 0
  186. cmp r2, r3 ;copy 初始化代码
  187. ldrcc r1, [r0], #4
  188. strcc r1, [r2], #4
  189. bcc %B0
  190. mov r0, #0  ;初始化ZI区域为0
  191. ldr r3, EndOfBSS
  192. 1
  193. cmp r2, r3
  194. strcc r0, [r2], #4
  195. bcc %B1
  196. bl Main ;bl Main        ;Dont use main() because ......
  197.     b .                       
  198. ;堆栈初始化
  199. ;function initializing stacks
  200. InitStacks
  201. ;Don't use DRAM,such as stmfd,ldmfd......
  202. ;SVCstack is initialized before
  203. ;Under toolkit ver 2.5, 'msr cpsr,r1' can be used instead of 'msr cpsr_cxsf,r1
  204. ;UndefMode堆栈
  205. mrs r0,cpsr
  206. bic r0,r0,#MODEMASK
  207. orr r1,r0,#UNDEFMODE|NOINT
  208. msr cpsr_cxsf,r1 ;UndefMode
  209. ldr sp,=UndefStack
  210. ;AbortMode堆栈
  211. orr r1,r0,#ABORTMODE|NOINT
  212. msr cpsr_cxsf,r1 ;AbortMode
  213. ldr sp,=AbortStack
  214. ;IRQMode堆栈
  215. orr r1,r0,#IRQMODE|NOINT
  216. msr cpsr_cxsf,r1 ;IRQMode
  217. ldr sp,=IRQStack
  218.     
  219.     ;FIQMode堆栈
  220. orr r1,r0,#FIQMODE|NOINT
  221. msr cpsr_cxsf,r1 ;FIQMode
  222. ldr sp,=FIQStack
  223. ;SVCMode堆栈
  224. bic r0,r0,#MODEMASK|NOINT
  225. orr r1,r0,#SVCMODE
  226. msr cpsr_cxsf,r1 ;SVCMode
  227. ldr sp,=SVCStack
  228. ;USER mode has not be initialized.
  229. mov pc,lr 
  230. ;The LR register won't be valid if the current mode is not SVC mode.'
  231. LTORG ;声明一个数据缓冲池的开始
  232. SMRDATA DATA
  233. ; Memory configuration should be optimized for best performance 
  234. ; The following parameter is not optimized.                     
  235. ; Memory access cycle parameter strategy
  236. ; 1) The memory settings is  safe parameters even at HCLK=75Mhz.
  237. ; 2) SDRAM refresh period is for HCLK=75Mhz. 
  238.         DCD (0+(B1_BWSCON<<4)+(B2_BWSCON<<8)+(B3_BWSCON<<12)+(B4_BWSCON<<16)+(B5_BWSCON<<20)+(B6_BWSCON<<24)+(B7_BWSCON<<28));BWSCON=0x2211D110
  239.      DCD ((B0_Tacs<<13)+(B0_Tcos<<11)+(B0_Tacc<<8)+(B0_Tcoh<<6)+(B0_Tah<<4)+(B0_Tacp<<2)+(B0_PMC))   ;GCS0  BANK0CON=0x0700
  240.      DCD ((B1_Tacs<<13)+(B1_Tcos<<11)+(B1_Tacc<<8)+(B1_Tcoh<<6)+(B1_Tah<<4)+(B1_Tacp<<2)+(B1_PMC))   ;GCS1  BANK1CON=0x7FFC
  241.      DCD ((B2_Tacs<<13)+(B2_Tcos<<11)+(B2_Tacc<<8)+(B2_Tcoh<<6)+(B2_Tah<<4)+(B2_Tacp<<2)+(B2_PMC))   ;GCS2  BANKCON2=0x0700
  242.      DCD 0x1f7c;((B3_Tacs<<13)+(B3_Tcos<<11)+(B3_Tacc<<8)+(B3_Tcoh<<6)+(B3_Tah<<4)+(B3_Tacp<<2)+(B3_PMC))   ;GCS3 BANKCON3=0x0700
  243.      DCD ((B4_Tacs<<13)+(B4_Tcos<<11)+(B4_Tacc<<8)+(B4_Tcoh<<6)+(B4_Tah<<4)+(B4_Tacp<<2)+(B4_PMC))   ;GCS4  BANKCON4=0x0700
  244.      DCD ((B5_Tacs<<13)+(B5_Tcos<<11)+(B5_Tacc<<8)+(B5_Tcoh<<6)+(B5_Tah<<4)+(B5_Tacp<<2)+(B5_PMC))   ;GCS5  BANKCON5=0x0700
  245.      DCD ((B6_MT<<15)+(B6_Trcd<<2)+(B6_SCAN))    ;GCS6  BANKCON6=0x18005
  246.      DCD ((B7_MT<<15)+(B7_Trcd<<2)+(B7_SCAN))    ;GCS7  BANKCON7=0x18005
  247.      DCD ((REFEN<<23)+(TREFMD<<22)+(Trp<<20)+(Trc<<18)+(Tchr<<16)+REFCNT)  ;REFRESH=0x008E0459   
  248. DCD 0x32            ;SCLK power saving mode, BANKSIZE 128M/128M       ;BANKSIZE=0x32
  249.      DCD 0x30            ;MRSR6 CL=3clk   ;MRSRB6=0x30
  250.      DCD 0x30            ;MRSR7  ;MRSRB7=0x30
  251. BaseOfROM DCD |Image$$RO$$Base|
  252. TopOfROM DCD |Image$$RO$$Limit|
  253. BaseOfBSS DCD |Image$$RW$$Base|
  254. BaseOfZero DCD |Image$$ZI$$Base|
  255. EndOfBSS DCD |Image$$ZI$$Limit|
  256.      ALIGN ;通过添加补丁字节使当前位置满足一定的对齐方式
  257. ;可读写的数据段
  258.      AREA RamData, DATA, READWRITE
  259. ;^=MAP:定义一个结构化的内存表(storage map)的首地址,地址为0x33ff8000
  260.         ^   _ISR_STARTADDRESS ;0x33ff8000
  261. HandleReset  #   4   ;#--Field:定义一个结构化内存表中的数据域,该域为4个字节
  262. HandleUndef  #   4
  263. HandleSWI    #   4
  264. HandlePabort    #   4
  265. HandleDabort    #   4
  266. HandleReserved  #   4
  267. HandleIRQ    #   4
  268. HandleFIQ    #   4
  269. ;Don't use the label 'IntVectorTable',
  270. ;The value of IntVectorTable is different with the address you think it may be.
  271. ;IntVectorTable'
  272. HandleEINT0    #   4
  273. HandleEINT1    #   4
  274. HandleEINT2    #   4
  275. HandleEINT3    #   4
  276. HandleEINT4_7 #   4
  277. HandleEINT8_23 #   4
  278. HandleRSV6 #   4
  279. HandleBATFLT    #   4
  280. HandleTICK    #   4
  281. HandleWDT #   4
  282. HandleTIMER0  #   4
  283. HandleTIMER1  #   4
  284. HandleTIMER2  #   4
  285. HandleTIMER3  #   4
  286. HandleTIMER4  #   4
  287. HandleUART2   #   4
  288. HandleLCD  #   4
  289. HandleDMA0 #   4
  290. HandleDMA1 #   4
  291. HandleDMA2 #   4
  292. HandleDMA3 #   4
  293. HandleMMC #   4
  294. HandleSPI0 #   4
  295. HandleUART1 #   4
  296. HandleRSV24 #   4
  297. HandleUSBD #   4
  298. HandleUSBH #   4
  299. HandleIIC    #   4
  300. HandleUART0  #   4
  301. HandleSPI1  #   4
  302. HandleRTC  #   4
  303. HandleADC  #   4
  304.         END