1 /****************************************************************************//**
2 * @file : startup_LPC17xx.c
3 * @brief : CMSIS Cortex-M3 Core Device Startup File
7 *----------------------------------------------------------------------------
9 * Copyright (C) 2009 ARM Limited. All rights reserved.
11 * ARM Limited (ARM) is supplying this software for use with Cortex-Mx
12 * processor based microcontrollers. This file can be freely distributed
13 * within development tools that are supporting such ARM based processors.
15 * THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED
16 * OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF
17 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE.
18 * ARM SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR
19 * CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER.
21 ******************************************************************************/
23 // Mod by nio for the .fastcode part
27 #define WEAK __attribute__ ((weak))
28 //*****************************************************************************
30 // Forward declaration of the default fault handlers.
32 //*****************************************************************************
33 /* System exception vector handler */
34 void WEAK Reset_Handler(void); /* Reset Handler */
35 void WEAK NMI_Handler(void); /* NMI Handler */
36 void WEAK HardFault_Handler(void); /* Hard Fault Handler */
37 void WEAK MemManage_Handler(void); /* MPU Fault Handler */
38 void WEAK BusFault_Handler(void); /* Bus Fault Handler */
39 void WEAK UsageFault_Handler(void); /* Usage Fault Handler */
40 void WEAK SVC_Handler(void); /* SVCall Handler */
41 void WEAK DebugMon_Handler(void); /* Debug Monitor Handler */
42 void WEAK PendSV_Handler(void); /* PendSV Handler */
43 void WEAK SysTick_Handler(void); /* SysTick Handler */
46 void WEAK WAKEUP0_IRQHandler(void);
47 void WEAK WAKEUP1_IRQHandler(void);
48 void WEAK WAKEUP2_IRQHandler(void);
49 void WEAK WAKEUP3_IRQHandler(void);
50 void WEAK WAKEUP4_IRQHandler(void);
51 void WEAK WAKEUP5_IRQHandler(void);
52 void WEAK WAKEUP6_IRQHandler(void);
53 void WEAK WAKEUP7_IRQHandler(void);
54 void WEAK WAKEUP8_IRQHandler(void);
55 void WEAK WAKEUP9_IRQHandler(void);
56 void WEAK WAKEUP10_IRQHandler(void);
57 void WEAK WAKEUP11_IRQHandler(void);
58 void WEAK WAKEUP12_IRQHandler(void);
59 void WEAK WAKEUP13_IRQHandler(void);
60 void WEAK WAKEUP14_IRQHandler(void);
61 void WEAK WAKEUP15_IRQHandler(void);
62 void WEAK WAKEUP16_IRQHandler(void);
63 void WEAK WAKEUP17_IRQHandler(void);
64 void WEAK WAKEUP18_IRQHandler(void);
65 void WEAK WAKEUP19_IRQHandler(void);
66 void WEAK WAKEUP20_IRQHandler(void);
67 void WEAK WAKEUP21_IRQHandler(void);
68 void WEAK WAKEUP22_IRQHandler(void);
69 void WEAK WAKEUP23_IRQHandler(void);
70 void WEAK WAKEUP24_IRQHandler(void);
71 void WEAK WAKEUP25_IRQHandler(void);
72 void WEAK WAKEUP26_IRQHandler(void);
73 void WEAK WAKEUP27_IRQHandler(void);
74 void WEAK WAKEUP28_IRQHandler(void);
75 void WEAK WAKEUP29_IRQHandler(void);
76 void WEAK WAKEUP30_IRQHandler(void);
77 void WEAK WAKEUP31_IRQHandler(void);
78 void WEAK WAKEUP32_IRQHandler(void);
79 void WEAK WAKEUP33_IRQHandler(void);
80 void WEAK WAKEUP34_IRQHandler(void);
81 void WEAK WAKEUP35_IRQHandler(void);
82 void WEAK WAKEUP36_IRQHandler(void);
83 void WEAK WAKEUP37_IRQHandler(void);
84 void WEAK WAKEUP38_IRQHandler(void);
85 void WEAK WAKEUP39_IRQHandler(void);
86 void WEAK I2C_IRQHandler(void);
87 void WEAK TIMER_16_0_IRQHandler(void);
88 void WEAK TIMER_16_1_IRQHandler(void);
89 void WEAK TIMER_32_0_IRQHandler(void);
90 void WEAK TIMER_32_1_IRQHandler(void);
91 void WEAK SSP_IRQHandler(void);
92 void WEAK UART_IRQHandler(void);
93 void WEAK USB_IRQHandler(void);
94 void WEAK USB_FIQHandler(void);
95 void WEAK ADC_IRQHandler(void);
96 void WEAK WDT_IRQHandler(void);
97 void WEAK BOD_IRQHandler(void);
98 void WEAK EINT3_IRQHandler(void);
99 void WEAK EINT2_IRQHandler(void);
100 void WEAK EINT1_IRQHandler(void);
101 void WEAK EINT0_IRQHandler(void);
104 /* Exported types --------------------------------------------------------------*/
105 /* Exported constants --------------------------------------------------------*/
106 extern unsigned long _etext;
107 extern unsigned long _sidata; /* start address for the initialization values of the .data section. defined in linker script */
108 extern unsigned long _sdata; /* start address for the .data section. defined in linker script */
109 extern unsigned long _edata; /* end address for the .data section. defined in linker script */
111 extern unsigned long _sifastcode; /* start address for the initialization values of the .fastcode section. defined in linker script */
112 extern unsigned long _sfastcode; /* start address for the .fastcode section. defined in linker script */
113 extern unsigned long _efastcode; /* end address for the .fastcode section. defined in linker script */
115 extern unsigned long _sbss; /* start address for the .bss section. defined in linker script */
116 extern unsigned long _ebss; /* end address for the .bss section. defined in linker script */
118 extern void _estack; /* init value for the stack pointer. defined in linker script */
120 extern void (_setup_board)(void); /* setup_board adress function */
121 extern unsigned long _mem_app_start;
124 /* Private typedef -----------------------------------------------------------*/
125 /* function prototypes ------------------------------------------------------*/
126 void Reset_Handler(void) __attribute__((__interrupt__));
127 //void Reset_Handler(void);
128 extern int main(void);
130 typedef void (*FNC)(void);
133 /******************************************************************************
135 * The minimal vector table for a Cortex M3. Note that the proper constructs
136 * must be placed on this to ensure that it ends up at physical address
139 ******************************************************************************/
141 extern unsigned long _stack;
143 __attribute__ ((section(".isr_vector")))
144 void (* const g_pfnVectors[])(void) =
146 (void (*)(void))&_stack, /* The initial stack pointer */
147 Reset_Handler, /* Reset Handler */
148 NMI_Handler, /* NMI Handler */
149 HardFault_Handler, /* Hard Fault Handler */
150 MemManage_Handler, /* MPU Fault Handler */
151 BusFault_Handler, /* Bus Fault Handler */
152 UsageFault_Handler, /* Usage Fault Handler */
157 SVC_Handler, /* SVCall Handler */
158 DebugMon_Handler, /* Debug Monitor Handler */
160 PendSV_Handler, /* PendSV Handler */
161 SysTick_Handler, /* SysTick Handler */
163 // External Interrupts
205 TIMER_16_0_IRQHandler,
206 TIMER_16_1_IRQHandler,
207 TIMER_32_0_IRQHandler,
208 TIMER_32_1_IRQHandler,
222 /*******************************************************************************
223 * Function Name : Reset_Handler
224 * Description : This is the code that gets called when the processor first starts execution
225 * following a reset event. Only the absolutely necessary set is performed,
226 * after which the application supplied main() routine is called.
230 *******************************************************************************/
232 void Reset_Handler(void)
234 unsigned long *pulDest;
235 unsigned long *pulSrc;
238 // Copy the data segment initializers from flash to SRAM in ROM mode
241 if (&_sidata != &_sdata) { // only if needed
243 for(pulDest = &_sdata; pulDest < &_edata; ) {
244 *(pulDest++) = *(pulSrc++);
248 // Copy the .fastcode code from ROM to SRAM
250 if (&_sifastcode != &_sfastcode) { // only if needed
251 pulSrc = &_sifastcode;
252 for(pulDest = &_sfastcode; pulDest < &_efastcode; ) {
253 *(pulDest++) = *(pulSrc++);
258 // Zero fill the bss segment.
260 for(pulDest = &_sbss; pulDest < &_ebss; )
266 SCB->VTOR=0x10000000;
268 // remap IRQ vector or not, depending on their RAM/ROM location
270 LPC_SYSCON->SYSMEMREMAP = 1 + ((&g_pfnVectors == (void*)0x0)?0:1);
278 // Call the application's entry point.
282 /* disable interrupts */
283 NVIC->ICER[0] = 0xffffffff;
284 NVIC->ICER[1] = 0x00000007;
285 __set_MSP(*(unsigned long *)(&_mem_app_start)); /* Stack pointer */
286 fnc_entry = (FNC)*(unsigned long *)(&_mem_app_start+1); /* Reset handler */
290 //*****************************************************************************
292 // Provide weak aliases for each Exception handler to the Default_Handler.
293 // As they are weak aliases, any function with the same name will override
296 //*****************************************************************************
297 #pragma weak MemManage_Handler = Default_Handler /* MPU Fault Handler */
298 #pragma weak BusFault_Handler = Default_Handler /* Bus Fault Handler */
299 #pragma weak UsageFault_Handler = Default_Handler /* Usage Fault Handler */
300 #pragma weak SVC_Handler = Default_Handler /* SVCall Handler */
301 #pragma weak DebugMon_Handler = Default_Handler /* Debug Monitor Handler */
302 #pragma weak PendSV_Handler = Default_Handler /* PendSV Handler */
303 #pragma weak SysTick_Handler = Default_Handler /* SysTick Handler */
306 /* External interrupt vector handler */
307 #pragma weak WAKEUP0_IRQHandler = Default_Handler
308 #pragma weak WAKEUP1_IRQHandler = Default_Handler
309 #pragma weak WAKEUP2_IRQHandler = Default_Handler
310 #pragma weak WAKEUP3_IRQHandler = Default_Handler
311 #pragma weak WAKEUP4_IRQHandler = Default_Handler
312 #pragma weak WAKEUP5_IRQHandler = Default_Handler
313 #pragma weak WAKEUP6_IRQHandler = Default_Handler
314 #pragma weak WAKEUP7_IRQHandler = Default_Handler
315 #pragma weak WAKEUP8_IRQHandler = Default_Handler
316 #pragma weak WAKEUP9_IRQHandler = Default_Handler
317 #pragma weak WAKEUP10_IRQHandler = Default_Handler
318 #pragma weak WAKEUP11_IRQHandler = Default_Handler
319 #pragma weak WAKEUP12_IRQHandler = Default_Handler
320 #pragma weak WAKEUP13_IRQHandler = Default_Handler
321 #pragma weak WAKEUP14_IRQHandler = Default_Handler
322 #pragma weak WAKEUP15_IRQHandler = Default_Handler
323 #pragma weak WAKEUP16_IRQHandler = Default_Handler
324 #pragma weak WAKEUP17_IRQHandler = Default_Handler
325 #pragma weak WAKEUP18_IRQHandler = Default_Handler
326 #pragma weak WAKEUP19_IRQHandler = Default_Handler
327 #pragma weak WAKEUP20_IRQHandler = Default_Handler
328 #pragma weak WAKEUP21_IRQHandler = Default_Handler
329 #pragma weak WAKEUP22_IRQHandler = Default_Handler
330 #pragma weak WAKEUP23_IRQHandler = Default_Handler
331 #pragma weak WAKEUP24_IRQHandler = Default_Handler
332 #pragma weak WAKEUP25_IRQHandler = Default_Handler
333 #pragma weak WAKEUP26_IRQHandler = Default_Handler
334 #pragma weak WAKEUP27_IRQHandler = Default_Handler
335 #pragma weak WAKEUP28_IRQHandler = Default_Handler
336 #pragma weak WAKEUP29_IRQHandler = Default_Handler
337 #pragma weak WAKEUP30_IRQHandler = Default_Handler
338 #pragma weak WAKEUP31_IRQHandler = Default_Handler
339 #pragma weak WAKEUP32_IRQHandler = Default_Handler
340 #pragma weak WAKEUP33_IRQHandler = Default_Handler
341 #pragma weak WAKEUP34_IRQHandler = Default_Handler
342 #pragma weak WAKEUP35_IRQHandler = Default_Handler
343 #pragma weak WAKEUP36_IRQHandler = Default_Handler
344 #pragma weak WAKEUP37_IRQHandler = Default_Handler
345 #pragma weak WAKEUP38_IRQHandler = Default_Handler
346 #pragma weak WAKEUP39_IRQHandler = Default_Handler
347 #pragma weak I2C_IRQHandler = Default_Handler
348 #pragma weak TIMER16_0_IRQHandler = Default_Handler
349 #pragma weak TIMER16_1_IRQHandler = Default_Handler
350 #pragma weak TIMER32_0_IRQHandler = Default_Handler
351 #pragma weak TIMER32_1_IRQHandler = Default_Handler
352 #pragma weak SSP_IRQHandler = Default_Handler
353 #pragma weak UART_IRQHandler = Default_Handler
354 #pragma weak USB_IRQHandler = Default_Handler
355 #pragma weak USB_FIQHandler = Default_Handler
356 #pragma weak ADC_IRQHandler = Default_Handler
357 #pragma weak WDT_IRQHandler = Default_Handler
358 #pragma weak BOD_IRQHandler = Default_Handler
359 #pragma weak FMC_IRQHandler = Default_Handler
360 #pragma weak PIOINT3_IRQHandler = Default_Handler
361 #pragma weak PIOINT2_IRQHandler = Default_Handler
362 #pragma weak PIOINT1_IRQHandler = Default_Handler
363 #pragma weak PIOINT0_IRQHandler = Default_Handler
366 //*****************************************************************************
368 // This is the code that gets called when the processor receives an unexpected
369 // interrupt. This simply enters an infinite loop, preserving the system state
370 // for examination by a debugger.
372 //*****************************************************************************
373 void Default_Handler(void) {
374 // Go into an infinite loop.