Startup.s
上传用户:dsfgsdff
上传日期:2022-07-10
资源大小:319k
文件大小:13k
源码类别:

微处理器开发

开发平台:

C/C++

  1. ;/*****************************************************************************/
  2. ;/* STARTUP.S: Startup file for Philips LPC2000                               */
  3. ;/*****************************************************************************/
  4. ;/* <<< Use Configuration Wizard in Context Menu >>>                          */ 
  5. ;/*****************************************************************************/
  6. ;/* This file is part of the uVision/ARM development tools.                   */
  7. ;/* Copyright (c) 2005-2006 Keil Software. All rights reserved.               */
  8. ;/* This software may only be used under the terms of a valid, current,       */
  9. ;/* end user licence from KEIL for a compatible version of KEIL software      */
  10. ;/* development tools. Nothing else gives you the right to use this software. */
  11. ;/*****************************************************************************/
  12. ;/*
  13. ; *  The STARTUP.S code is executed after CPU Reset. This file may be 
  14. ; *  translated with the following SET symbols. In uVision these SET 
  15. ; *  symbols are entered under Options - ASM - Define.
  16. ; *
  17. ; *  REMAP: when set the startup code initializes the register MEMMAP 
  18. ; *  which overwrites the settings of the CPU configuration pins. The 
  19. ; *  startup and interrupt vectors are remapped from:
  20. ; *     0x00000000  default setting (not remapped)
  21. ; *     0x80000000  when EXTMEM_MODE is used
  22. ; *     0x40000000  when RAM_MODE is used
  23. ; *
  24. ; *  EXTMEM_MODE: when set the device is configured for code execution
  25. ; *  from external memory starting at address 0x80000000.
  26. ; *
  27. ; *  RAM_MODE: when set the device is configured for code execution
  28. ; *  from on-chip RAM starting at address 0x40000000. 
  29. ; */
  30. ; Standard definitions of Mode bits and Interrupt (I & F) flags in PSRs
  31.     IMPORT  SoftwareInterrupt
  32. EXPORT StackUsr
  33. Mode_USR        EQU     0x10
  34. Mode_FIQ        EQU     0x11
  35. Mode_IRQ        EQU     0x12
  36. Mode_SVC        EQU     0x13
  37. Mode_ABT        EQU     0x17
  38. Mode_UND        EQU     0x1B
  39. Mode_SYS        EQU     0x1F
  40. I_Bit           EQU     0x80            ; when I bit is set, IRQ is disabled
  41. F_Bit           EQU     0x40            ; when F bit is set, FIQ is disabled
  42. ;// <h> Stack Configuration (Stack Sizes in Bytes)
  43. ;//   <o0> Undefined Mode      <0x0-0xFFFFFFFF:8>
  44. ;//   <o1> Supervisor Mode     <0x0-0xFFFFFFFF:8>
  45. ;//   <o2> Abort Mode          <0x0-0xFFFFFFFF:8>
  46. ;//   <o3> Fast Interrupt Mode <0x0-0xFFFFFFFF:8>
  47. ;//   <o4> Interrupt Mode      <0x0-0xFFFFFFFF:8>
  48. ;//   <o5> User/System Mode    <0x0-0xFFFFFFFF:8>
  49. ;// </h>
  50. UND_Stack_Size  EQU     0x00000000
  51. SVC_Stack_Size  EQU     0x00000080
  52. ABT_Stack_Size  EQU     0x00000000
  53. FIQ_Stack_Size  EQU     0x00000000
  54. IRQ_Stack_Size  EQU     0x00000080
  55. USR_Stack_Size  EQU     0x00000400
  56. Stack_Size      EQU     (UND_Stack_Size + SVC_Stack_Size + ABT_Stack_Size + 
  57.                          FIQ_Stack_Size + IRQ_Stack_Size + USR_Stack_Size)
  58.                 AREA    STACK, NOINIT, READWRITE, ALIGN=3
  59. Stack_Mem       SPACE   Stack_Size
  60. Stack_Top       EQU     Stack_Mem + Stack_Size
  61. ;// <h> Heap Configuration
  62. ;//   <o>  Heap Size (in Bytes) <0x0-0xFFFFFFFF>
  63. ;// </h>
  64.         AREA    Stacks, DATA, NOINIT
  65. StackUsr
  66. Heap_Size       EQU     0x00000100
  67.                 AREA    HEAP, NOINIT, READWRITE, ALIGN=3
  68. Heap_Mem        SPACE   Heap_Size
  69. ; VPBDIV definitions
  70. VPBDIV          EQU     0xE01FC100      ; VPBDIV Address
  71. ;// <e> VPBDIV Setup
  72. ;// <i> Peripheral Bus Clock Rate
  73. ;//   <o1.0..1>   VPBDIV: VPB Clock
  74. ;//               <0=> VPB Clock = CPU Clock / 4
  75. ;//               <1=> VPB Clock = CPU Clock
  76. ;//               <2=> VPB Clock = CPU Clock / 2
  77. ;//   <o1.4..5>   XCLKDIV: XCLK Pin
  78. ;//               <0=> XCLK Pin = CPU Clock / 4
  79. ;//               <1=> XCLK Pin = CPU Clock
  80. ;//               <2=> XCLK Pin = CPU Clock / 2
  81. ;// </e>
  82. VPBDIV_SETUP    EQU     0
  83. VPBDIV_Val      EQU     0x00000000
  84. ; Phase Locked Loop (PLL) definitions
  85. PLL_BASE        EQU     0xE01FC080      ; PLL Base Address
  86. PLLCON_OFS      EQU     0x00            ; PLL Control Offset
  87. PLLCFG_OFS      EQU     0x04            ; PLL Configuration Offset
  88. PLLSTAT_OFS     EQU     0x08            ; PLL Status Offset
  89. PLLFEED_OFS     EQU     0x0C            ; PLL Feed Offset
  90. PLLCON_PLLE     EQU     (1<<0)          ; PLL Enable
  91. PLLCON_PLLC     EQU     (1<<1)          ; PLL Connect
  92. PLLCFG_MSEL     EQU     (0x1F<<0)       ; PLL Multiplier
  93. PLLCFG_PSEL     EQU     (0x03<<5)       ; PLL Divider
  94. PLLSTAT_PLOCK   EQU     (1<<10)         ; PLL Lock Status
  95. ;// <e> PLL Setup
  96. ;//   <o1.0..4>   MSEL: PLL Multiplier Selection
  97. ;//               <1-32><#-1>
  98. ;//               <i> M Value
  99. ;//   <o1.5..6>   PSEL: PLL Divider Selection
  100. ;//               <0=> 1   <1=> 2   <2=> 4   <3=> 8
  101. ;//               <i> P Value
  102. ;// </e>
  103. PLL_SETUP       EQU     1
  104. PLLCFG_Val      EQU     0x00000024
  105. ; Memory Accelerator Module (MAM) definitions
  106. MAM_BASE        EQU     0xE01FC000      ; MAM Base Address
  107. MAMCR_OFS       EQU     0x00            ; MAM Control Offset
  108. MAMTIM_OFS      EQU     0x04            ; MAM Timing Offset
  109. ;// <e> MAM Setup
  110. ;//   <o1.0..1>   MAM Control
  111. ;//               <0=> Disabled
  112. ;//               <1=> Partially Enabled
  113. ;//               <2=> Fully Enabled
  114. ;//               <i> Mode
  115. ;//   <o2.0..2>   MAM Timing
  116. ;//               <0=> Reserved  <1=> 1   <2=> 2   <3=> 3
  117. ;//               <4=> 4         <5=> 5   <6=> 6   <7=> 7
  118. ;//               <i> Fetch Cycles
  119. ;// </e>
  120. MAM_SETUP       EQU     1
  121. MAMCR_Val       EQU     0x00000002
  122. MAMTIM_Val      EQU     0x00000004
  123. ; External Memory Controller (EMC) definitions
  124. EMC_BASE        EQU     0xFFE00000      ; EMC Base Address
  125. BCFG0_OFS       EQU     0x00            ; BCFG0 Offset
  126. BCFG1_OFS       EQU     0x04            ; BCFG1 Offset
  127. BCFG2_OFS       EQU     0x08            ; BCFG2 Offset
  128. BCFG3_OFS       EQU     0x0C            ; BCFG3 Offset
  129. ;// <e> External Memory Controller (EMC)
  130. EMC_SETUP       EQU     0
  131. ;//   <e> Bank Configuration 0 (BCFG0)
  132. ;//     <o1.0..3>   IDCY: Idle Cycles <0-15>
  133. ;//     <o1.5..9>   WST1: Wait States 1 <0-31>
  134. ;//     <o1.11..15> WST2: Wait States 2 <0-31>
  135. ;//     <o1.10>     RBLE: Read Byte Lane Enable
  136. ;//     <o1.26>     WP: Write Protect
  137. ;//     <o1.27>     BM: Burst ROM
  138. ;//     <o1.28..29> MW: Memory Width  <0=>  8-bit  <1=> 16-bit
  139. ;//                                   <2=> 32-bit  <3=> Reserved
  140. ;//   </e>
  141. BCFG0_SETUP EQU         0
  142. BCFG0_Val   EQU         0x0000FBEF
  143. ;//   <e> Bank Configuration 1 (BCFG1)
  144. ;//     <o1.0..3>   IDCY: Idle Cycles <0-15>
  145. ;//     <o1.5..9>   WST1: Wait States 1 <0-31>
  146. ;//     <o1.11..15> WST2: Wait States 2 <0-31>
  147. ;//     <o1.10>     RBLE: Read Byte Lane Enable
  148. ;//     <o1.26>     WP: Write Protect
  149. ;//     <o1.27>     BM: Burst ROM
  150. ;//     <o1.28..29> MW: Memory Width  <0=>  8-bit  <1=> 16-bit
  151. ;//                                   <2=> 32-bit  <3=> Reserved
  152. ;//   </e>
  153. BCFG1_SETUP EQU         0
  154. BCFG1_Val   EQU         0x0000FBEF
  155. ;//   <e> Bank Configuration 2 (BCFG2)
  156. ;//     <o1.0..3>   IDCY: Idle Cycles <0-15>
  157. ;//     <o1.5..9>   WST1: Wait States 1 <0-31>
  158. ;//     <o1.11..15> WST2: Wait States 2 <0-31>
  159. ;//     <o1.10>     RBLE: Read Byte Lane Enable
  160. ;//     <o1.26>     WP: Write Protect
  161. ;//     <o1.27>     BM: Burst ROM
  162. ;//     <o1.28..29> MW: Memory Width  <0=>  8-bit  <1=> 16-bit
  163. ;//                                   <2=> 32-bit  <3=> Reserved
  164. ;//   </e>
  165. BCFG2_SETUP EQU         0
  166. BCFG2_Val   EQU         0x0000FBEF
  167. ;//   <e> Bank Configuration 3 (BCFG3)
  168. ;//     <o1.0..3>   IDCY: Idle Cycles <0-15>
  169. ;//     <o1.5..9>   WST1: Wait States 1 <0-31>
  170. ;//     <o1.11..15> WST2: Wait States 2 <0-31>
  171. ;//     <o1.10>     RBLE: Read Byte Lane Enable
  172. ;//     <o1.26>     WP: Write Protect
  173. ;//     <o1.27>     BM: Burst ROM
  174. ;//     <o1.28..29> MW: Memory Width  <0=>  8-bit  <1=> 16-bit
  175. ;//                                   <2=> 32-bit  <3=> Reserved
  176. ;//   </e>
  177. BCFG3_SETUP EQU         0
  178. BCFG3_Val   EQU         0x0000FBEF
  179. ;// </e> End of EMC
  180. ; External Memory Pins definitions
  181. PINSEL2         EQU     0xE002C014      ; PINSEL2 Address
  182. PINSEL2_Val     EQU     0x0E6149E4      ; CS0..3, OE, WE, BLS0..3, 
  183.                                         ; D0..31, A2..23, JTAG Pins
  184.                 PRESERVE8
  185.                 
  186. ; Area Definition and Entry Point
  187. ;  Startup Code must be linked first at Address at which it expects to run.
  188.                 AREA    RESET, CODE, READONLY
  189.                 ARM
  190. ; Exception Vectors
  191. ;  Mapped to Address 0.
  192. ;  Absolute addressing mode must be used.
  193. ;  Dummy Handlers are implemented as infinite loops which can be modified.
  194.    
  195. Vectors
  196.         LDR     PC, ResetAddr
  197.         LDR     PC, UndefinedAddr
  198.         LDR     PC, SWI_Addr
  199.         LDR     PC, PrefetchAddr
  200.         LDR     PC, DataAbortAddr
  201.         DCD     0xb9205f80
  202.         LDR     PC, [PC, #-0xff0]
  203.         LDR     PC, FIQ_Addr
  204. ResetAddr           DCD     Reset_Handler
  205. UndefinedAddr       DCD     Undefined
  206. SWI_Addr            DCD     SoftwareInterrupt
  207. PrefetchAddr        DCD     PrefetchAbort
  208. DataAbortAddr       DCD     DataAbort
  209. Nouse               DCD     0
  210. IRQ_Addr            DCD     0
  211. FIQ_Addr            DCD     FIQ_Handler
  212. ;未定义指令
  213. Undefined
  214.         B       Undefined
  215.         
  216. ;取指令中止
  217. PrefetchAbort
  218.         B       PrefetchAbort
  219. ;取数据中止
  220. DataAbort
  221.         B       DataAbort
  222. ;快速中断
  223. FIQ_Handler
  224. B FIQ_Handler
  225. ; Reset Handler
  226.                 EXPORT  Reset_Handler
  227. Reset_Handler   
  228. ; Setup VPBDIV
  229.                 IF      VPBDIV_SETUP <> 0
  230.                 LDR     R0, =VPBDIV
  231.                 LDR     R1, =VPBDIV_Val
  232.                 STR     R1, [R0]
  233.                 ENDIF
  234. ; Setup PLL
  235.                 IF      PLL_SETUP <> 0
  236.                 LDR     R0, =PLL_BASE
  237.                 MOV     R1, #0xAA
  238.                 MOV     R2, #0x55
  239. ;  Configure and Enable PLL
  240.                 MOV     R3, #PLLCFG_Val
  241.                 STR     R3, [R0, #PLLCFG_OFS] 
  242.                 MOV     R3, #PLLCON_PLLE
  243.                 STR     R3, [R0, #PLLCON_OFS]
  244.                 STR     R1, [R0, #PLLFEED_OFS]
  245.                 STR     R2, [R0, #PLLFEED_OFS]
  246. ;  Wait until PLL Locked
  247. PLL_Loop        LDR     R3, [R0, #PLLSTAT_OFS]
  248.                 ANDS    R3, R3, #PLLSTAT_PLOCK
  249.                 BEQ     PLL_Loop
  250. ;  Switch to PLL Clock
  251.                 MOV     R3, #(PLLCON_PLLE:OR:PLLCON_PLLC)
  252.                 STR     R3, [R0, #PLLCON_OFS]
  253.                 STR     R1, [R0, #PLLFEED_OFS]
  254.                 STR     R2, [R0, #PLLFEED_OFS]
  255.                 ENDIF   ; PLL_SETUP
  256. ; Setup MAM
  257.                 IF      MAM_SETUP <> 0
  258.                 LDR     R0, =MAM_BASE
  259.                 MOV     R1, #MAMTIM_Val
  260.                 STR     R1, [R0, #MAMTIM_OFS] 
  261.                 MOV     R1, #MAMCR_Val
  262.                 STR     R1, [R0, #MAMCR_OFS] 
  263.                 ENDIF   ; MAM_SETUP
  264. ; Memory Mapping (when Interrupt Vectors are in RAM)
  265. MEMMAP          EQU     0xE01FC040      ; Memory Mapping Control
  266.                 IF      :DEF:REMAP
  267.                 LDR     R0, =MEMMAP
  268.                 IF      :DEF:EXTMEM_MODE
  269.                 MOV     R1, #3
  270.                 ELIF    :DEF:RAM_MODE
  271.                 MOV     R1, #2
  272.                 ELSE
  273.                 MOV     R1, #1
  274.                 ENDIF
  275.                 STR     R1, [R0]
  276.                 ENDIF
  277. ; Initialise Interrupt System
  278. ;  ...
  279. ; Setup Stack for each mode
  280.                 LDR     R0, =Stack_Top
  281. ;  Enter Undefined Instruction Mode and set its Stack Pointer
  282.                 MSR     CPSR_c, #Mode_UND:OR:I_Bit:OR:F_Bit
  283.                 MOV     SP, R0
  284.                 SUB     R0, R0, #UND_Stack_Size
  285. ;  Enter Abort Mode and set its Stack Pointer
  286.                 MSR     CPSR_c, #Mode_ABT:OR:I_Bit:OR:F_Bit
  287.                 MOV     SP, R0
  288.                 SUB     R0, R0, #ABT_Stack_Size
  289. ;  Enter FIQ Mode and set its Stack Pointer
  290.                 MSR     CPSR_c, #Mode_FIQ:OR:I_Bit:OR:F_Bit
  291.                 MOV     SP, R0
  292.                 SUB     R0, R0, #FIQ_Stack_Size
  293. ;  Enter IRQ Mode and set its Stack Pointer
  294.                 MSR     CPSR_c, #Mode_IRQ:OR:I_Bit:OR:F_Bit
  295.                 MOV     SP, R0
  296.                 SUB     R0, R0, #IRQ_Stack_Size
  297. ;  Enter Supervisor Mode and set its Stack Pointer
  298.                 MSR     CPSR_c, #Mode_SVC:OR:I_Bit:OR:F_Bit
  299.                 MOV     SP, R0
  300.                 SUB     R0, R0, #SVC_Stack_Size
  301. ;  Enter User Mode and set its Stack Pointer
  302.                 MSR     CPSR_c, #Mode_USR
  303.                 MOV     SP, R0
  304.                 SUB     SL, SP, #USR_Stack_Size
  305. ; Enter the C code
  306.                 IMPORT  __main
  307.                 LDR     R0, =__main
  308.                 BX      R0
  309. ; User Initial Stack & Heap
  310.                 AREA    |.text|, CODE, READONLY
  311.                 IMPORT  __use_two_region_memory
  312.                 EXPORT  __user_initial_stackheap
  313. __user_initial_stackheap
  314.                 LDR     R0, =  Heap_Mem
  315.                 LDR     R1, =(Stack_Mem + USR_Stack_Size)
  316.                 LDR     R2, = (Heap_Mem +      Heap_Size)
  317.                 LDR     R3, = Stack_Mem
  318.                 BX      LR
  319.                 END