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