blob: 1e0bea4c62e269db8597d86fa24c4369e99bef21 [file] [log] [blame]
Brian Silverman2bf644d2013-12-06 16:54:59 -08001/* File: startup_ARMCM3.S
2 * Purpose: startup file for Cortex-M3 devices. Should use with
3 * GCC for ARM Embedded Processors
4 * Version: V1.4
5 * Date: 20 Dezember 2012
6 *
7 */
8/* Copyright (c) 2011 - 2012 ARM LIMITED
9
10 All rights reserved.
11 Redistribution and use in source and binary forms, with or without
12 modification, are permitted provided that the following conditions are met:
13 - Redistributions of source code must retain the above copyright
14 notice, this list of conditions and the following disclaimer.
15 - Redistributions in binary form must reproduce the above copyright
16 notice, this list of conditions and the following disclaimer in the
17 documentation and/or other materials provided with the distribution.
18 - Neither the name of ARM nor the names of its contributors may be used
19 to endorse or promote products derived from this software without
20 specific prior written permission.
21 *
22 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
23 AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
24 IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
25 ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE
26 LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
27 CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
28 SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
29 INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
30 CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
31 ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
32 POSSIBILITY OF SUCH DAMAGE.
33 ---------------------------------------------------------------------------*/
34
35
Brian Silverman5020be62013-12-06 19:09:07 -080036.syntax unified
37.arch armv7-m
38.code 16
Brian Silverman2bf644d2013-12-06 16:54:59 -080039
Brian Silverman5020be62013-12-06 19:09:07 -080040.section .stack
41 .align 3
42
Brian Silverman2bf644d2013-12-06 16:54:59 -080043#ifdef __STACK_SIZE
Brian Silverman5020be62013-12-06 19:09:07 -080044 .equ Stack_Size, __STACK_SIZE
Brian Silverman2bf644d2013-12-06 16:54:59 -080045#else
Brian Silverman5020be62013-12-06 19:09:07 -080046 .equ Stack_Size, 0x00000400
Brian Silverman2bf644d2013-12-06 16:54:59 -080047#endif
Brian Silverman2bf644d2013-12-06 16:54:59 -080048
Brian Silverman5020be62013-12-06 19:09:07 -080049 .globl __StackLimit
50 __StackLimit:
51 .space Stack_Size
52 .size __StackLimit, . - __StackLimit
53
54 .globl __StackTop
55 __StackTop:
56 .size __StackTop, . - __StackTop
57
58.section .heap
59 .align 3
60
61 .globl __HeapBase
62 __HeapBase:
Brian Silverman2bf644d2013-12-06 16:54:59 -080063#ifdef __HEAP_SIZE
Brian Silverman5020be62013-12-06 19:09:07 -080064 .equ Heap_Size, __HEAP_SIZE
Brian Silverman2bf644d2013-12-06 16:54:59 -080065#else
Brian Silverman5020be62013-12-06 19:09:07 -080066 .equ Heap_Size, 0x00000C00
Brian Silverman2bf644d2013-12-06 16:54:59 -080067#endif
Brian Silverman5020be62013-12-06 19:09:07 -080068 .if Heap_Size
69 .space Heap_Size
70 .endif
71 .size __HeapBase, . - __HeapBase
72
73 .globl __HeapLimit
74 __HeapLimit:
75 .size __HeapLimit, . - __HeapLimit
Brian Silverman2bf644d2013-12-06 16:54:59 -080076
77#if 0
Brian Silverman5020be62013-12-06 19:09:07 -080078 .section .isr_vector
79 .align 2
80 .globl __isr_vector
Brian Silverman2bf644d2013-12-06 16:54:59 -080081__isr_vector:
82 .long __StackTop /* Top of Stack */
83 .long Reset_Handler /* Reset Handler */
84 .long NMI_Handler /* NMI Handler */
85 .long HardFault_Handler /* Hard Fault Handler */
86 .long MemManage_Handler /* MPU Fault Handler */
87 .long BusFault_Handler /* Bus Fault Handler */
88 .long UsageFault_Handler /* Usage Fault Handler */
89 .long 0 /* Reserved */
90 .long 0 /* Reserved */
91 .long 0 /* Reserved */
92 .long 0 /* Reserved */
93 .long SVC_Handler /* SVCall Handler */
94 .long DebugMon_Handler /* Debug Monitor Handler */
95 .long 0 /* Reserved */
96 .long PendSV_Handler /* PendSV Handler */
97 .long SysTick_Handler /* SysTick Handler */
98
99 /* External interrupts */
100 .long WDT_IRQHandler /* 0: Watchdog Timer */
101 .long RTC_IRQHandler /* 1: Real Time Clock */
102 .long TIM0_IRQHandler /* 2: Timer0 / Timer1 */
103 .long TIM2_IRQHandler /* 3: Timer2 / Timer3 */
104 .long MCIA_IRQHandler /* 4: MCIa */
105 .long MCIB_IRQHandler /* 5: MCIb */
106 .long UART0_IRQHandler /* 6: UART0 - DUT FPGA */
107 .long UART1_IRQHandler /* 7: UART1 - DUT FPGA */
108 .long UART2_IRQHandler /* 8: UART2 - DUT FPGA */
109 .long UART4_IRQHandler /* 9: UART4 - not connected */
110 .long AACI_IRQHandler /* 10: AACI / AC97 */
111 .long CLCD_IRQHandler /* 11: CLCD Combined Interrupt */
112 .long ENET_IRQHandler /* 12: Ethernet */
113 .long USBDC_IRQHandler /* 13: USB Device */
114 .long USBHC_IRQHandler /* 14: USB Host Controller */
115 .long CHLCD_IRQHandler /* 15: Character LCD */
116 .long FLEXRAY_IRQHandler /* 16: Flexray */
117 .long CAN_IRQHandler /* 17: CAN */
118 .long LIN_IRQHandler /* 18: LIN */
119 .long I2C_IRQHandler /* 19: I2C ADC/DAC */
120 .long 0 /* 20: Reserved */
121 .long 0 /* 21: Reserved */
122 .long 0 /* 22: Reserved */
123 .long 0 /* 23: Reserved */
124 .long 0 /* 24: Reserved */
125 .long 0 /* 25: Reserved */
126 .long 0 /* 26: Reserved */
127 .long 0 /* 27: Reserved */
128 .long CPU_CLCD_IRQHandler /* 28: Reserved - CPU FPGA CLCD */
129 .long 0 /* 29: Reserved - CPU FPGA */
130 .long UART3_IRQHandler /* 30: UART3 - CPU FPGA */
131 .long SPI_IRQHandler /* 31: SPI Touchscreen - CPU FPGA */
132
133 .size __isr_vector, . - __isr_vector
134#else
135.macro ISR_HANDLER name=
Brian Silverman5020be62013-12-06 19:09:07 -0800136 .section .vectors, "a"
137 .word \name
Brian Silverman2bf644d2013-12-06 16:54:59 -0800138 .section .init, "ax"
Brian Silverman5020be62013-12-06 19:09:07 -0800139 .thumb_func
140 .weak \name
141 \name:
142 1: b 1b /* endless loop */
Brian Silverman2bf644d2013-12-06 16:54:59 -0800143.endm
144
145.macro ISR_RESERVED
Brian Silverman5020be62013-12-06 19:09:07 -0800146 .section .vectors, "a"
147 .word 0
Brian Silverman2bf644d2013-12-06 16:54:59 -0800148.endm
149
Brian Silverman5020be62013-12-06 19:09:07 -0800150.section .vectors, "a"
151 .global _vectors
152 _vectors:
153 .long __StackTop
154 .long Reset_Handler
155 ISR_HANDLER NMI_Handler
156 ISR_HANDLER HardFault_Handler
157 ISR_HANDLER MemManage_Handler
158 ISR_HANDLER BusFault_Handler
159 ISR_HANDLER UsageFault_Handler
160 ISR_RESERVED
161 ISR_RESERVED
162 ISR_RESERVED
163 ISR_RESERVED
164 ISR_HANDLER SVC_Handler
165 ISR_HANDLER DebugMon_Handler
166 ISR_RESERVED
167 ISR_HANDLER PendSV_Handler
168 ISR_HANDLER SysTick_Handler
Brian Silverman2bf644d2013-12-06 16:54:59 -0800169
Brian Silverman5020be62013-12-06 19:09:07 -0800170 /* interrupts */
171 ISR_HANDLER WWDG_IRQHandler
172 ISR_HANDLER PVD_IRQHandler
173 ISR_HANDLER TAMP_STAMP_IRQHandler
174 ISR_HANDLER RTC_WKUP_IRQHandler
175 ISR_HANDLER FLASH_IRQHandler
176 ISR_HANDLER RCC_IRQHandler
177 ISR_HANDLER EXTI0_IRQHandler
178 ISR_HANDLER EXTI1_IRQHandler
179 ISR_HANDLER EXTI2_IRQHandler
180 ISR_HANDLER EXTI3_IRQHandler
181 ISR_HANDLER EXTI4_IRQHandler
182 ISR_HANDLER DMA1_Stream0_IRQHandler
183 ISR_HANDLER DMA1_Stream1_IRQHandler
184 ISR_HANDLER DMA1_Stream2_IRQHandler
185 ISR_HANDLER DMA1_Stream3_IRQHandler
186 ISR_HANDLER DMA1_Stream4_IRQHandler
187 ISR_HANDLER DMA1_Stream5_IRQHandler
188 ISR_HANDLER DMA1_Stream6_IRQHandler
189 ISR_HANDLER ADC_IRQHandler
190 ISR_HANDLER CAN1_TX_IRQHandler
191 ISR_HANDLER CAN1_RX0_IRQHandler
192 ISR_HANDLER CAN1_RX1_IRQHandler
193 ISR_HANDLER CAN1_SCE_IRQHandler
194 ISR_HANDLER EXTI9_5_IRQHandler
195 ISR_HANDLER TIM1_BRK_TIM9_IRQHandler
196 ISR_HANDLER TIM1_UP_TIM10_IRQHandler
197 ISR_HANDLER TIM1_TRG_COM_TIM11_IRQHandler
198 ISR_HANDLER TIM1_CC_IRQHandler
199 ISR_HANDLER TIM2_IRQHandler
200 ISR_HANDLER TIM3_IRQHandler
201 ISR_HANDLER TIM4_IRQHandler
202 ISR_HANDLER I2C1_EV_IRQHandler
203 ISR_HANDLER I2C1_ER_IRQHandler
204 ISR_HANDLER I2C2_EV_IRQHandler
205 ISR_HANDLER I2C2_ER_IRQHandler
206 ISR_HANDLER SPI1_IRQHandler
207 ISR_HANDLER SPI2_IRQHandler
208 ISR_HANDLER USART1_IRQHandler
209 ISR_HANDLER USART2_IRQHandler
210 ISR_HANDLER USART3_IRQHandler
211 ISR_HANDLER EXTI15_10_IRQHandler
212 ISR_HANDLER RTC_Alarm_IRQHandler
213 ISR_HANDLER OTG_FS_WKUP_IRQHandler
214 ISR_HANDLER TIM8_BRK_TIM12_IRQHandler
215 ISR_HANDLER TIM8_UP_TIM13_IRQHandler
216 ISR_HANDLER TIM8_TRG_COM_TIM14_IRQHandler
217 ISR_HANDLER TIM8_CC_IRQHandler
218 ISR_HANDLER DMA1_Stream7_IRQHandler
219 ISR_HANDLER FSMC_IRQHandler
220 ISR_HANDLER SDIO_IRQHandler
221 ISR_HANDLER TIM5_IRQHandler
222 ISR_HANDLER SPI3_IRQHandler
223 ISR_HANDLER UART4_IRQHandler
224 ISR_HANDLER UART5_IRQHandler
225 ISR_HANDLER TIM6_DAC_IRQHandler
226 ISR_HANDLER TIM7_IRQHandler
227 ISR_HANDLER DMA2_Stream0_IRQHandler
228 ISR_HANDLER DMA2_Stream1_IRQHandler
229 ISR_HANDLER DMA2_Stream2_IRQHandler
230 ISR_HANDLER DMA2_Stream3_IRQHandler
231 ISR_HANDLER DMA2_Stream4_IRQHandler
232 ISR_HANDLER ETH_IRQHandler
233 ISR_HANDLER ETH_WKUP_IRQHandler
234 ISR_HANDLER CAN2_TX_IRQHandler
235 ISR_HANDLER CAN2_RX0_IRQHandler
236 ISR_HANDLER CAN2_RX1_IRQHandler
237 ISR_HANDLER CAN2_SCE_IRQHandler
238 ISR_HANDLER OTG_FS_IRQHandler
239 ISR_HANDLER DMA2_Stream5_IRQHandler
240 ISR_HANDLER DMA2_Stream6_IRQHandler
241 ISR_HANDLER DMA2_Stream7_IRQHandler
242 ISR_HANDLER USART6_IRQHandler
243 ISR_HANDLER I2C3_EV_IRQHandler
244 ISR_HANDLER I2C3_ER_IRQHandler
245 ISR_HANDLER OTG_HS_EP1_OUT_IRQHandler
246 ISR_HANDLER OTG_HS_EP1_IN_IRQHandler
247 ISR_HANDLER OTG_HS_WKUP_IRQHandler
248 ISR_HANDLER OTG_HS_IRQHandler
249 ISR_HANDLER DCMI_IRQHandler
250 ISR_HANDLER CRYP_IRQHandler
251 ISR_HANDLER HASH_RNG_IRQHandler
Brian Silverman2bf644d2013-12-06 16:54:59 -0800252
Brian Silverman5020be62013-12-06 19:09:07 -0800253.section .vectors, "a"
254 _vectors_end:
Brian Silverman2bf644d2013-12-06 16:54:59 -0800255
256
Brian Silverman5020be62013-12-06 19:09:07 -0800257.section .vectors_ram, "a"
258 /*.global _vectors_ram*/
259 _vectors_ram:
Brian Silverman2bf644d2013-12-06 16:54:59 -0800260 .space _vectors_end-_vectors, 0
Brian Silverman5020be62013-12-06 19:09:07 -0800261 /*.size _vectors_ram, . - _vectors_ram*/
Brian Silverman2bf644d2013-12-06 16:54:59 -0800262#endif
263
Brian Silverman5020be62013-12-06 19:09:07 -0800264.text
265 .thumb_func
266 .align 2
267 .globl Reset_Handler
268 .type Reset_Handler, %function
269 Reset_Handler:
270
Brian Silverman2bf644d2013-12-06 16:54:59 -0800271/* Loop to copy data from read only memory to RAM. The ranges
272 * of copy from/to are specified by following symbols evaluated in
273 * linker script.
274 * __etext: End of code section, i.e., begin of data sections to copy from.
275 * __data_start__/__data_end__: RAM address range that data should be
276 * copied to. Both must be aligned to 4 bytes boundary. */
Brian Silverman5020be62013-12-06 19:09:07 -0800277 ldr r1, =__etext
278 ldr r2, =__data_start__
279 ldr r3, =__data_end__
280 subs r3, r2
281 ble .LC1
282 .LC0:
283 subs r3, #4
284 ldr r0, [r1, r3]
285 str r0, [r2, r3]
286 bgt .LC0
287 .LC1:
Brian Silverman2bf644d2013-12-06 16:54:59 -0800288
289/* Loop to zero out BSS section, which uses following symbols
290 * in linker script:
291 * __bss_start__: start of BSS section. Must align to 4
292 * __bss_end__: end of BSS section. Must align to 4
293 */
Brian Silverman5020be62013-12-06 19:09:07 -0800294 ldr r1, =__bss_start__
295 ldr r2, =__bss_end__
296 movs r0, 0
297 .LC2:
298 cmp r1, r2
299 itt lt
300 strlt r0, [r1], #4
301 blt .LC2
Brian Silverman2bf644d2013-12-06 16:54:59 -0800302
Brian Silverman5020be62013-12-06 19:09:07 -0800303 /*bl SystemInit*/
Brian Silverman2bf644d2013-12-06 16:54:59 -0800304
Brian Silverman5020be62013-12-06 19:09:07 -0800305 /* Copy the vector table into RAM */
306 ldr r0, =_vectors
307 ldr r1, =_vectors_end
Brian Silverman2bf644d2013-12-06 16:54:59 -0800308 ldr r2, =_vectors_ram
Brian Silverman5020be62013-12-06 19:09:07 -0800309 .LC3:
Brian Silverman2bf644d2013-12-06 16:54:59 -0800310 cmp r0, r1
Brian Silverman5020be62013-12-06 19:09:07 -0800311 beq .LC4
Brian Silverman2bf644d2013-12-06 16:54:59 -0800312 ldr r3, [r0]
313 str r3, [r2]
314 adds r0, r0, #4
315 adds r2, r2, #4
Brian Silverman5020be62013-12-06 19:09:07 -0800316 b .LC3
317 .LC4:
318 /* Configure vector table offset register to use the newly copied table */
Brian Silverman2bf644d2013-12-06 16:54:59 -0800319 ldr r0, =0xE000ED08
320 ldr r1, =_vectors_ram
321 str r1, [r0]
322
Brian Silverman5020be62013-12-06 19:09:07 -0800323 bl _start
324 1: b 1b /* endless loop if it ever returns */
325
326 .pool
327 .size Reset_Handler, . - Reset_Handler