1/* --------------------------------------------------------------------------*/
2/* @file:    startup_LPC812.S                                                */
3/* @purpose: CMSIS Cortex-M0+ Core Device Startup File                       */
4/*           LPC812                                                          */
5/* @version: 1.2                                                      */
6/* @date:    2017-6-8                                                         */
7/* --------------------------------------------------------------------------*/
8/*                                                                           */
9/* Copyright 1997-2016 Freescale Semiconductor, Inc.                         */
10/* Copyright 2016-2020 NXP                                                   */
11/* All rights reserved.                                                      */
12/*                                                                           */
13/* SPDX-License-Identifier: BSD-3-Clause                                     */
14/*****************************************************************************/
15/* Version: GCC for ARM Embedded Processors                                  */
16/*****************************************************************************/
17
18
19    .syntax unified
20    .arch armv6-m
21
22    .section .isr_vector, "a"
23    .align 2
24    .globl __Vectors
25__Vectors:
26    .long   __StackTop                                      /* Top of Stack       */
27    .long   Reset_Handler                                   /* Reset Handler      */
28    .long   NMI_Handler                                     /* NMI Handler        */
29    .long   HardFault_Handler                               /* Hard Fault Handler */
30    .long   0                                               /* Reserved           */
31    .long   0                                               /* Reserved           */
32    .long   0                                               /* Reserved           */
33    .long   0                                               /* Reserved           */
34    .long   0                                               /* Reserved           */
35    .long   0                                               /* Reserved           */
36    .long   0                                               /* Reserved           */
37    .long   SVC_Handler                                     /* SVCall Handler     */
38    .long   0                                               /* Reserved           */
39    .long   0                                               /* Reserved           */
40    .long   PendSV_Handler                                  /* PendSV Handler     */
41    .long   SysTick_Handler                                 /* SysTick Handler    */
42
43    /* External Interrupts */
44    .long   SPI0_IRQHandler                     /* SPI0 interrupt */
45    .long   SPI1_IRQHandler                     /* SPI1 interrupt */
46    .long   Reserved18_IRQHandler                     /* Reserved interrupt */
47    .long   USART0_IRQHandler                     /* USART0 interrupt */
48    .long   USART1_IRQHandler                     /* USART1 interrupt */
49    .long   USART2_IRQHandler                     /* USART2 interrupt */
50    .long   Reserved22_IRQHandler                     /* Reserved interrupt */
51    .long   Reserved23_IRQHandler                     /* Reserved interrupt */
52    .long   I2C0_IRQHandler                     /* I2C0 interrupt */
53    .long   SCT0_IRQHandler                     /* State configurable timer interrupt */
54    .long   MRT0_IRQHandler                     /* Multi-rate timer interrupt */
55    .long   CMP_IRQHandler                     /* Analog comparator interrupt or Capacitive Touch interrupt */
56    .long   WDT_IRQHandler                     /* Windowed watchdog timer interrupt */
57    .long   BOD_IRQHandler                     /* BOD interrupts */
58    .long   Reserved30_IRQHandler                     /* Reserved interrupt */
59    .long   WKT_IRQHandler                     /* Self-wake-up timer interrupt */
60    .long   Reserved32_IRQHandler                     /* Reserved interrupt */
61    .long   Reserved33_IRQHandler                     /* Reserved interrupt */
62    .long   Reserved34_IRQHandler                     /* Reserved interrupt */
63    .long   Reserved35_IRQHandler                     /* Reserved interrupt */
64    .long   Reserved36_IRQHandler                     /* Reserved interrupt */
65    .long   Reserved37_IRQHandler                     /* Reserved interrupt */
66    .long   Reserved38_IRQHandler                     /* Reserved interrupt */
67    .long   Reserved39_IRQHandler                     /* Reserved interrupt */
68    .long   PIN_INT0_IRQHandler                     /* Pin interrupt 0 or pattern match engine slice 0 interrupt */
69    .long   PIN_INT1_IRQHandler                     /* Pin interrupt 1 or pattern match engine slice 1 interrupt */
70    .long   PIN_INT2_IRQHandler                     /* Pin interrupt 2 or pattern match engine slice 2 interrupt */
71    .long   PIN_INT3_IRQHandler                     /* Pin interrupt 3 or pattern match engine slice 3 interrupt */
72    .long   PIN_INT4_IRQHandler                     /* Pin interrupt 4 or pattern match engine slice 4 interrupt */
73    .long   PIN_INT5_IRQHandler                     /* Pin interrupt 5 or pattern match engine slice 5 interrupt */
74    .long   PIN_INT6_IRQHandler                     /* Pin interrupt 6 or pattern match engine slice 6 interrupt */
75    .long   PIN_INT7_IRQHandler                     /* Pin interrupt 7 or pattern match engine slice 7 interrupt */
76
77    .size    __Vectors, . - __Vectors
78
79/*  Variable to store CRP value in. No code read protection enabled by default
80 *  Code Read Protection level (CRP)
81 *    CRP_Level:
82 *      <0xFFFFFFFF=> Disabled
83 *      <0x4E697370=> NO_ISP
84 *      <0x12345678=> CRP1
85 *      <0x87654321=> CRP2
86 *      <0x43218765=> CRP3
87 */
88    #ifndef NO_CRP
89      .section .crp, "a"
90      .long 0xFFFFFFFF
91    #endif
92
93   .text
94    .thumb
95
96/* Reset Handler */
97    .thumb_func
98    .align 2
99    .globl   Reset_Handler
100    .weak    Reset_Handler
101    .type    Reset_Handler, %function
102Reset_Handler:
103    cpsid   i               /* Mask interrupts */
104
105#ifndef __NO_SYSTEM_INIT
106    ldr   r0,=SystemInit
107    blx   r0
108#endif
109/*     Loop to copy data from read only memory to RAM. The ranges
110 *      of copy from/to are specified by following symbols evaluated in
111 *      linker script.
112 *      __etext: End of code section, i.e., begin of data sections to copy from.
113 *      __data_start__/__data_end__: RAM address range that data should be
114 *      copied to. Both must be aligned to 4 bytes boundary.  */
115
116    ldr    r1, =__etext
117    ldr    r2, =__data_start__
118    ldr    r3, =__data_end__
119
120    subs    r3, r2
121    ble     .LC0
122
123.LC1:
124    subs    r3, 4
125    ldr    r0, [r1,r3]
126    str    r0, [r2,r3]
127    bgt    .LC1
128.LC0:
129
130#ifdef __STARTUP_CLEAR_BSS
131/*     This part of work usually is done in C library startup code. Otherwise,
132 *     define this macro to enable it in this startup.
133 *
134 *     Loop to zero out BSS section, which uses following symbols
135 *     in linker script:
136 *      __bss_start__: start of BSS section. Must align to 4
137 *      __bss_end__: end of BSS section. Must align to 4
138 */
139    ldr r1, =__bss_start__
140    ldr r2, =__bss_end__
141
142    subs    r2, r1
143    ble .LC3
144
145    movs    r0, 0
146.LC2:
147    str r0, [r1, r2]
148    subs    r2, 4
149    bge .LC2
150.LC3:
151#endif
152    cpsie   i               /* Unmask interrupts */
153
154#ifndef __START
155#define __START _start
156#endif
157#ifndef __ATOLLIC__
158    ldr   r0,=__START
159    blx   r0
160#else
161    ldr   r0,=__libc_init_array
162    blx   r0
163    ldr   r0,=main
164    bx    r0
165#endif
166    .pool
167    .size Reset_Handler, . - Reset_Handler
168
169    .align  1
170    .thumb_func
171    .weak DefaultISR
172    .type DefaultISR, %function
173DefaultISR:
174    ldr r0, =DefaultISR
175    bx r0
176    .size DefaultISR, . - DefaultISR
177
178    .align 1
179    .thumb_func
180    .weak NMI_Handler
181    .type NMI_Handler, %function
182NMI_Handler:
183    ldr   r0,=NMI_Handler
184    bx    r0
185    .size NMI_Handler, . - NMI_Handler
186
187    .align 1
188    .thumb_func
189    .weak HardFault_Handler
190    .type HardFault_Handler, %function
191HardFault_Handler:
192    ldr   r0,=HardFault_Handler
193    bx    r0
194    .size HardFault_Handler, . - HardFault_Handler
195
196    .align 1
197    .thumb_func
198    .weak SVC_Handler
199    .type SVC_Handler, %function
200SVC_Handler:
201    ldr   r0,=SVC_Handler
202    bx    r0
203    .size SVC_Handler, . - SVC_Handler
204
205    .align 1
206    .thumb_func
207    .weak PendSV_Handler
208    .type PendSV_Handler, %function
209PendSV_Handler:
210    ldr   r0,=PendSV_Handler
211    bx    r0
212    .size PendSV_Handler, . - PendSV_Handler
213
214    .align 1
215    .thumb_func
216    .weak SysTick_Handler
217    .type SysTick_Handler, %function
218SysTick_Handler:
219    ldr   r0,=SysTick_Handler
220    bx    r0
221    .size SysTick_Handler, . - SysTick_Handler
222
223    .align 1
224    .thumb_func
225    .weak SPI0_IRQHandler
226    .type SPI0_IRQHandler, %function
227SPI0_IRQHandler:
228    ldr   r0,=SPI0_DriverIRQHandler
229    bx    r0
230    .size SPI0_IRQHandler, . - SPI0_IRQHandler
231
232    .align 1
233    .thumb_func
234    .weak SPI1_IRQHandler
235    .type SPI1_IRQHandler, %function
236SPI1_IRQHandler:
237    ldr   r0,=SPI1_DriverIRQHandler
238    bx    r0
239    .size SPI1_IRQHandler, . - SPI1_IRQHandler
240
241    .align 1
242    .thumb_func
243    .weak Reserved18_IRQHandler
244    .type Reserved18_IRQHandler, %function
245Reserved18_IRQHandler:
246    ldr   r0,=Reserved18_DriverIRQHandler
247    bx    r0
248    .size Reserved18_IRQHandler, . - Reserved18_IRQHandler
249
250    .align 1
251    .thumb_func
252    .weak USART0_IRQHandler
253    .type USART0_IRQHandler, %function
254USART0_IRQHandler:
255    ldr   r0,=USART0_DriverIRQHandler
256    bx    r0
257    .size USART0_IRQHandler, . - USART0_IRQHandler
258
259    .align 1
260    .thumb_func
261    .weak USART1_IRQHandler
262    .type USART1_IRQHandler, %function
263USART1_IRQHandler:
264    ldr   r0,=USART1_DriverIRQHandler
265    bx    r0
266    .size USART1_IRQHandler, . - USART1_IRQHandler
267
268    .align 1
269    .thumb_func
270    .weak USART2_IRQHandler
271    .type USART2_IRQHandler, %function
272USART2_IRQHandler:
273    ldr   r0,=USART2_DriverIRQHandler
274    bx    r0
275    .size USART2_IRQHandler, . - USART2_IRQHandler
276
277    .align 1
278    .thumb_func
279    .weak Reserved22_IRQHandler
280    .type Reserved22_IRQHandler, %function
281Reserved22_IRQHandler:
282    ldr   r0,=Reserved22_DriverIRQHandler
283    bx    r0
284    .size Reserved22_IRQHandler, . - Reserved22_IRQHandler
285
286    .align 1
287    .thumb_func
288    .weak Reserved23_IRQHandler
289    .type Reserved23_IRQHandler, %function
290Reserved23_IRQHandler:
291    ldr   r0,=Reserved23_DriverIRQHandler
292    bx    r0
293    .size Reserved23_IRQHandler, . - Reserved23_IRQHandler
294
295    .align 1
296    .thumb_func
297    .weak I2C0_IRQHandler
298    .type I2C0_IRQHandler, %function
299I2C0_IRQHandler:
300    ldr   r0,=I2C0_DriverIRQHandler
301    bx    r0
302    .size I2C0_IRQHandler, . - I2C0_IRQHandler
303
304    .align 1
305    .thumb_func
306    .weak SCT0_IRQHandler
307    .type SCT0_IRQHandler, %function
308SCT0_IRQHandler:
309    ldr   r0,=SCT0_DriverIRQHandler
310    bx    r0
311    .size SCT0_IRQHandler, . - SCT0_IRQHandler
312
313    .align 1
314    .thumb_func
315    .weak MRT0_IRQHandler
316    .type MRT0_IRQHandler, %function
317MRT0_IRQHandler:
318    ldr   r0,=MRT0_DriverIRQHandler
319    bx    r0
320    .size MRT0_IRQHandler, . - MRT0_IRQHandler
321
322    .align 1
323    .thumb_func
324    .weak CMP_IRQHandler
325    .type CMP_IRQHandler, %function
326CMP_IRQHandler:
327    ldr   r0,=CMP_DriverIRQHandler
328    bx    r0
329    .size CMP_IRQHandler, . - CMP_IRQHandler
330
331    .align 1
332    .thumb_func
333    .weak WDT_IRQHandler
334    .type WDT_IRQHandler, %function
335WDT_IRQHandler:
336    ldr   r0,=WDT_DriverIRQHandler
337    bx    r0
338    .size WDT_IRQHandler, . - WDT_IRQHandler
339
340    .align 1
341    .thumb_func
342    .weak BOD_IRQHandler
343    .type BOD_IRQHandler, %function
344BOD_IRQHandler:
345    ldr   r0,=BOD_DriverIRQHandler
346    bx    r0
347    .size BOD_IRQHandler, . - BOD_IRQHandler
348
349    .align 1
350    .thumb_func
351    .weak Reserved30_IRQHandler
352    .type Reserved30_IRQHandler, %function
353Reserved30_IRQHandler:
354    ldr   r0,=Reserved30_DriverIRQHandler
355    bx    r0
356    .size Reserved30_IRQHandler, . - Reserved30_IRQHandler
357
358    .align 1
359    .thumb_func
360    .weak WKT_IRQHandler
361    .type WKT_IRQHandler, %function
362WKT_IRQHandler:
363    ldr   r0,=WKT_DriverIRQHandler
364    bx    r0
365    .size WKT_IRQHandler, . - WKT_IRQHandler
366
367    .align 1
368    .thumb_func
369    .weak Reserved32_IRQHandler
370    .type Reserved32_IRQHandler, %function
371Reserved32_IRQHandler:
372    ldr   r0,=Reserved32_DriverIRQHandler
373    bx    r0
374    .size Reserved32_IRQHandler, . - Reserved32_IRQHandler
375
376    .align 1
377    .thumb_func
378    .weak Reserved33_IRQHandler
379    .type Reserved33_IRQHandler, %function
380Reserved33_IRQHandler:
381    ldr   r0,=Reserved33_DriverIRQHandler
382    bx    r0
383    .size Reserved33_IRQHandler, . - Reserved33_IRQHandler
384
385    .align 1
386    .thumb_func
387    .weak Reserved34_IRQHandler
388    .type Reserved34_IRQHandler, %function
389Reserved34_IRQHandler:
390    ldr   r0,=Reserved34_DriverIRQHandler
391    bx    r0
392    .size Reserved34_IRQHandler, . - Reserved34_IRQHandler
393
394    .align 1
395    .thumb_func
396    .weak Reserved35_IRQHandler
397    .type Reserved35_IRQHandler, %function
398Reserved35_IRQHandler:
399    ldr   r0,=Reserved35_DriverIRQHandler
400    bx    r0
401    .size Reserved35_IRQHandler, . - Reserved35_IRQHandler
402
403    .align 1
404    .thumb_func
405    .weak Reserved36_IRQHandler
406    .type Reserved36_IRQHandler, %function
407Reserved36_IRQHandler:
408    ldr   r0,=Reserved36_DriverIRQHandler
409    bx    r0
410    .size Reserved36_IRQHandler, . - Reserved36_IRQHandler
411
412    .align 1
413    .thumb_func
414    .weak Reserved37_IRQHandler
415    .type Reserved37_IRQHandler, %function
416Reserved37_IRQHandler:
417    ldr   r0,=Reserved37_DriverIRQHandler
418    bx    r0
419    .size Reserved37_IRQHandler, . - Reserved37_IRQHandler
420
421    .align 1
422    .thumb_func
423    .weak Reserved38_IRQHandler
424    .type Reserved38_IRQHandler, %function
425Reserved38_IRQHandler:
426    ldr   r0,=Reserved38_DriverIRQHandler
427    bx    r0
428    .size Reserved38_IRQHandler, . - Reserved38_IRQHandler
429
430    .align 1
431    .thumb_func
432    .weak Reserved39_IRQHandler
433    .type Reserved39_IRQHandler, %function
434Reserved39_IRQHandler:
435    ldr   r0,=Reserved39_DriverIRQHandler
436    bx    r0
437    .size Reserved39_IRQHandler, . - Reserved39_IRQHandler
438
439    .align 1
440    .thumb_func
441    .weak PIN_INT0_IRQHandler
442    .type PIN_INT0_IRQHandler, %function
443PIN_INT0_IRQHandler:
444    ldr   r0,=PIN_INT0_DriverIRQHandler
445    bx    r0
446    .size PIN_INT0_IRQHandler, . - PIN_INT0_IRQHandler
447
448    .align 1
449    .thumb_func
450    .weak PIN_INT1_IRQHandler
451    .type PIN_INT1_IRQHandler, %function
452PIN_INT1_IRQHandler:
453    ldr   r0,=PIN_INT1_DriverIRQHandler
454    bx    r0
455    .size PIN_INT1_IRQHandler, . - PIN_INT1_IRQHandler
456
457    .align 1
458    .thumb_func
459    .weak PIN_INT2_IRQHandler
460    .type PIN_INT2_IRQHandler, %function
461PIN_INT2_IRQHandler:
462    ldr   r0,=PIN_INT2_DriverIRQHandler
463    bx    r0
464    .size PIN_INT2_IRQHandler, . - PIN_INT2_IRQHandler
465
466    .align 1
467    .thumb_func
468    .weak PIN_INT3_IRQHandler
469    .type PIN_INT3_IRQHandler, %function
470PIN_INT3_IRQHandler:
471    ldr   r0,=PIN_INT3_DriverIRQHandler
472    bx    r0
473    .size PIN_INT3_IRQHandler, . - PIN_INT3_IRQHandler
474
475    .align 1
476    .thumb_func
477    .weak PIN_INT4_IRQHandler
478    .type PIN_INT4_IRQHandler, %function
479PIN_INT4_IRQHandler:
480    ldr   r0,=PIN_INT4_DriverIRQHandler
481    bx    r0
482    .size PIN_INT4_IRQHandler, . - PIN_INT4_IRQHandler
483
484    .align 1
485    .thumb_func
486    .weak PIN_INT5_IRQHandler
487    .type PIN_INT5_IRQHandler, %function
488PIN_INT5_IRQHandler:
489    ldr   r0,=PIN_INT5_DriverIRQHandler
490    bx    r0
491    .size PIN_INT5_IRQHandler, . - PIN_INT5_IRQHandler
492
493    .align 1
494    .thumb_func
495    .weak PIN_INT6_IRQHandler
496    .type PIN_INT6_IRQHandler, %function
497PIN_INT6_IRQHandler:
498    ldr   r0,=PIN_INT6_DriverIRQHandler
499    bx    r0
500    .size PIN_INT6_IRQHandler, . - PIN_INT6_IRQHandler
501
502    .align 1
503    .thumb_func
504    .weak PIN_INT7_IRQHandler
505    .type PIN_INT7_IRQHandler, %function
506PIN_INT7_IRQHandler:
507    ldr   r0,=PIN_INT7_DriverIRQHandler
508    bx    r0
509    .size PIN_INT7_IRQHandler, . - PIN_INT7_IRQHandler
510
511/*    Macro to define default handlers. Default handler
512 *    will be weak symbol and just dead loops. They can be
513 *    overwritten by other handlers */
514    .macro def_irq_handler  handler_name
515    .weak \handler_name
516    .set  \handler_name, DefaultISR
517    .endm
518    def_irq_handler    SPI0_DriverIRQHandler
519    def_irq_handler    SPI1_DriverIRQHandler
520    def_irq_handler    Reserved18_DriverIRQHandler
521    def_irq_handler    USART0_DriverIRQHandler
522    def_irq_handler    USART1_DriverIRQHandler
523    def_irq_handler    USART2_DriverIRQHandler
524    def_irq_handler    Reserved22_DriverIRQHandler
525    def_irq_handler    Reserved23_DriverIRQHandler
526    def_irq_handler    I2C0_DriverIRQHandler
527    def_irq_handler    SCT0_DriverIRQHandler
528    def_irq_handler    MRT0_DriverIRQHandler
529    def_irq_handler    CMP_DriverIRQHandler
530    def_irq_handler    WDT_DriverIRQHandler
531    def_irq_handler    BOD_DriverIRQHandler
532    def_irq_handler    Reserved30_DriverIRQHandler
533    def_irq_handler    WKT_DriverIRQHandler
534    def_irq_handler    Reserved32_DriverIRQHandler
535    def_irq_handler    Reserved33_DriverIRQHandler
536    def_irq_handler    Reserved34_DriverIRQHandler
537    def_irq_handler    Reserved35_DriverIRQHandler
538    def_irq_handler    Reserved36_DriverIRQHandler
539    def_irq_handler    Reserved37_DriverIRQHandler
540    def_irq_handler    Reserved38_DriverIRQHandler
541    def_irq_handler    Reserved39_DriverIRQHandler
542    def_irq_handler    PIN_INT0_DriverIRQHandler
543    def_irq_handler    PIN_INT1_DriverIRQHandler
544    def_irq_handler    PIN_INT2_DriverIRQHandler
545    def_irq_handler    PIN_INT3_DriverIRQHandler
546    def_irq_handler    PIN_INT4_DriverIRQHandler
547    def_irq_handler    PIN_INT5_DriverIRQHandler
548    def_irq_handler    PIN_INT6_DriverIRQHandler
549    def_irq_handler    PIN_INT7_DriverIRQHandler
550
551    .end
552