3 * LPC17xx (ARM Cortex M3) family startup code
5 * adapted from startup_LPC17xx.c
6 * by Marek Peca <mp@duch.cz> 2010/06
7 * modified by Jiri Kubias <jiri.kubias@addat.cz>
9 * ( file : startup_LPC17xx.c )
10 * ( brief : CMSIS Cortex-M3 Core Device Startup File )
12 * ( date : 4. Feb. 2009 )
13 * ( Copyright (C) 2009 ARM Limited. All rights reserved. )
15 * ( ARM Limited (ARM) is supplying this software for use with Cortex-Mx )
16 * ( processor based microcontrollers. This file can be freely distributed )
17 * ( within development tools that are supporting such ARM based processors. )
20 #include <sys/types.h>
23 #define WEAK __attribute__((weak))
25 /* System exception vector handler */
26 void WEAK Reset_Handler(); /* Reset Handler */
27 void WEAK NMI_Handler(); /* NMI Handler */
28 void WEAK HardFault_Handler(); /* Hard Fault Handler */
29 void WEAK MemManage_Handler(); /* MPU Fault Handler */
30 void WEAK BusFault_Handler(); /* Bus Fault Handler */
31 void WEAK UsageFault_Handler(); /* Usage Fault Handler */
32 void WEAK SVC_Handler(); /* SVCall Handler */
33 void WEAK DebugMon_Handler(); /* Debug Monitor Handler */
34 void WEAK PendSV_Handler(); /* PendSV Handler */
35 void WEAK SysTick_Handler(); /* SysTick Handler */
37 /* External interrupt vector handler */
38 void WEAK WAKEUP_IRQHandler();
39 void WEAK I2C_IRQHandler();
40 void WEAK TIMER16_0_IRQHandler();
41 void WEAK TIMER16_1_IRQHandler();
42 void WEAK TIMER32_0_IRQHandler();
43 void WEAK TIMER32_1_IRQHandler();
44 void WEAK SSP_IRQHandler();
45 void WEAK UART_IRQHandler();
46 void WEAK USB_IRQHandler();
47 void WEAK USB_FIQHandler();
48 void WEAK ADC_IRQHandler();
49 void WEAK WDT_IRQHandler();
50 void WEAK BOD_IRQHandler();
51 void WEAK FMC_IRQHandler();
52 void WEAK PIOINT3_IRQHandler();
53 void WEAK PIOINT2_IRQHandler();
54 void WEAK PIOINT1_IRQHandler();
55 void WEAK PIOINT0_IRQHandler();
57 /** memory map pointers (defined in ldscript) **/
58 extern uint32_t _data, _edata, _datainit;
59 extern uint32_t __bss_start, __bss_end__;
60 extern uint32_t _stack;
62 /** function prototypes **/
63 extern void WEAK _memory_init();
64 extern void WEAK __libc_init_array();
65 ////void _start() __attribute__((__interrupt__));
70 * The minimal vector table for a Cortex M3. Note that the proper constructs
71 * must be placed on this to ensure that it ends up at physical address
74 __attribute__((section(".ivec")))
75 void (* const _vectors[])() =
77 /* Cortex M3 common */
78 (void (*)())&_stack, /* The initial stack pointer */
79 _start, /* Reset Handler */
80 NMI_Handler, /* NMI Handler */
81 HardFault_Handler, /* Hard Fault Handler */
82 MemManage_Handler, /* MPU Fault Handler */
83 BusFault_Handler, /* Bus Fault Handler */
84 UsageFault_Handler, /* Usage Fault Handler */
89 SVC_Handler, /* SVCall Handler */
90 DebugMon_Handler, /* Debug Monitor Handler */
92 PendSV_Handler, /* PendSV Handler */
93 SysTick_Handler, /* SysTick Handler */
95 /* LPC13xx specific interrupts */
96 WAKEUP_IRQHandler, /* 16 0 Wake-up on pin PIO0_0 */
97 WAKEUP_IRQHandler, /* 17 1 Wake-up on pin PIO0_1 */
98 WAKEUP_IRQHandler, /* 18 2 Wake-up on pin PIO0_2 */
99 WAKEUP_IRQHandler, /* 19 3 Wake-up on pin PIO0_3 */
100 WAKEUP_IRQHandler, /* 20 4 Wake-up on pin PIO0_4 */
101 WAKEUP_IRQHandler, /* 21 5 Wake-up on pin PIO0_5 */
102 WAKEUP_IRQHandler, /* 22 6 Wake-up on pin PIO0_6 */
103 WAKEUP_IRQHandler, /* 23 7 Wake-up on pin PIO0_7 */
104 WAKEUP_IRQHandler, /* 24 8 Wake-up on pin PIO0_8 */
105 WAKEUP_IRQHandler, /* 25 9 Wake-up on pin PIO0_9 */
106 WAKEUP_IRQHandler, /* 26 10 Wake-up on pin PIO0_10 */
107 WAKEUP_IRQHandler, /* 27 11 Wake-up on pin PIO0_11 */
108 WAKEUP_IRQHandler, /* 28 12 Wake-up on pin PIO1_0 */
109 WAKEUP_IRQHandler, /* 29 13 Wake-up on pin PIO1_1 */
110 WAKEUP_IRQHandler, /* 30 14 Wake-up on pin PIO1_2 */
111 WAKEUP_IRQHandler, /* 31 15 Wake-up on pin PIO1_3 */
112 WAKEUP_IRQHandler, /* 32 16 Wake-up on pin PIO1_4 */
113 WAKEUP_IRQHandler, /* 33 17 Wake-up on pin PIO1_5 */
114 WAKEUP_IRQHandler, /* 34 18 Wake-up on pin PIO1_6 */
115 WAKEUP_IRQHandler, /* 35 19 Wake-up on pin PIO1_7 */
116 WAKEUP_IRQHandler, /* 36 20 Wake-up on pin PIO1_8 */
117 WAKEUP_IRQHandler, /* 37 21 Wake-up on pin PIO1_9 */
118 WAKEUP_IRQHandler, /* 38 22 Wake-up on pin PIO1_10 */
119 WAKEUP_IRQHandler, /* 39 23 Wake-up on pin PIO1_11 */
120 WAKEUP_IRQHandler, /* 40 24 Wake-up on pin PIO2_0 */
121 WAKEUP_IRQHandler, /* 41 25 Wake-up on pin PIO2_1 */
122 WAKEUP_IRQHandler, /* 42 26 Wake-up on pin PIO2_2 */
123 WAKEUP_IRQHandler, /* 43 27 Wake-up on pin PIO2_3 */
124 WAKEUP_IRQHandler, /* 44 28 Wake-up on pin PIO2_4 */
125 WAKEUP_IRQHandler, /* 45 29 Wake-up on pin PIO2_5 */
126 WAKEUP_IRQHandler, /* 46 30 Wake-up on pin PIO2_6 */
127 WAKEUP_IRQHandler, /* 47 31 Wake-up on pin PIO2_7 */
128 WAKEUP_IRQHandler, /* 48 32 Wake-up on pin PIO2_8 */
129 WAKEUP_IRQHandler, /* 49 33 Wake-up on pin PIO2_9 */
130 WAKEUP_IRQHandler, /* 50 34 Wake-up on pin PIO2_10 */
131 WAKEUP_IRQHandler, /* 51 35 Wake-up on pin PIO2_11 */
132 WAKEUP_IRQHandler, /* 52 36 Wake-up on pin PIO3_0 */
133 WAKEUP_IRQHandler, /* 53 37 Wake-up on pin PIO3_1 */
134 WAKEUP_IRQHandler, /* 54 38 Wake-up on pin PIO3_2 */
135 WAKEUP_IRQHandler, /* 55 39 Wake-up on pin PIO3_3 */
136 I2C_IRQHandler, /* 56 40 I2C0 SI (state change) */
137 TIMER16_0_IRQHandler, /* 57 41 CT16B0 16 bit timer 0 */
138 TIMER16_1_IRQHandler, /* 58 42 CT16B1 16 bit timer 1 */
139 TIMER32_0_IRQHandler, /* 59 43 CT32B0 32 bit timer 0 */
140 TIMER32_1_IRQHandler, /* 60 44 CT32B1 32 bit timer 1 */
141 SSP_IRQHandler, /* 61 45 SSP */
142 UART_IRQHandler, /* 62 46 UART */
143 USB_IRQHandler, /* 63 47 USB IRQ low priority */
144 USB_FIQHandler, /* 64 48 USB FIQ high priority */
145 ADC_IRQHandler, /* 65 49 ADC end of conversion */
146 WDT_IRQHandler, /* 66 50 Watchdog interrupt (WDINT) */
147 BOD_IRQHandler, /* 67 51 BOD Brown-out detect */
148 FMC_IRQHandler, /* 68 52 Reserved also marked as IP2111 Flash Memory */
149 PIOINT3_IRQHandler, /* 69 53 PIO_3 GPIO interrupt status of port 3 */
150 PIOINT2_IRQHandler, /* 70 54 PIO_2 GPIO interrupt status of port 2 */
151 PIOINT1_IRQHandler, /* 71 55 PIO_1 GPIO interrupt status of port 1 */
152 PIOINT0_IRQHandler, /* 72 56 PIO_0 GPIO interrupt status of port 0 */
156 * startup code (Reset Handler)
162 * External memory initialization (only if _memory_init linked)
163 * (can not be called from init_array, must precede data initialization)
168 /* Copy initialized data to its execution address in RAM */
169 if (&_datainit != &_data) { /* _datainit == _data indicates RAM, ie. no need of copying */
170 for (src = &_datainit, dst = &_data; dst < &_edata; src++, dst++)
175 for (dst = &__bss_start; dst < &__bss_end__; dst++)
179 * remap IRQ vector or not, depending on their RAM/ROM location
182 * set IRQ vectors location
184 //SYSMEMREMAP = 2; /* do NOT use NXP LPC fashioned vectors remapping.. */
185 SCB->VTOR = (uint32_t)&_vectors; /* ..follow Cortex M3's way instead */
187 /* Call init functions in .init_array section (only if __libc_init_array exists) */
188 if (__libc_init_array)
192 //SCB->VTOR=0x10000000;
194 /* Call the application's entry point. */
197 /* Requiescat In Pacem */
202 * This is the code that gets called when the processor receives an unexpected
203 * interrupt. This simply enters an infinite loop, preserving the system state
204 * for examination by a debugger.
206 void Default_Handler() {
211 * Provide weak aliases for each Exception handler to the Default_Handler.
212 * As they are weak aliases, any function with the same name will override
215 #pragma weak MemManage_Handler = Default_Handler /* MPU Fault Handler */
216 #pragma weak BusFault_Handler = Default_Handler /* Bus Fault Handler */
217 #pragma weak UsageFault_Handler = Default_Handler /* Usage Fault Handler */
218 #pragma weak SVC_Handler = Default_Handler /* SVCall Handler */
219 #pragma weak DebugMon_Handler = Default_Handler /* Debug Monitor Handler */
220 #pragma weak PendSV_Handler = Default_Handler /* PendSV Handler */
221 #pragma weak SysTick_Handler = Default_Handler /* SysTick Handler */
223 /* External interrupt vector handler */
224 #pragma weak WAKEUP_IRQHandler = Default_Handler
225 #pragma weak I2C_IRQHandler = Default_Handler
226 #pragma weak TIMER16_0_IRQHandler = Default_Handler
227 #pragma weak TIMER16_1_IRQHandler = Default_Handler
228 #pragma weak TIMER32_0_IRQHandler = Default_Handler
229 #pragma weak TIMER32_1_IRQHandler = Default_Handler
230 #pragma weak SSP_IRQHandler = Default_Handler
231 #pragma weak UART_IRQHandler = Default_Handler
232 #pragma weak USB_IRQHandler = Default_Handler
233 #pragma weak USB_FIQHandler = Default_Handler
234 #pragma weak ADC_IRQHandler = Default_Handler
235 #pragma weak WDT_IRQHandler = Default_Handler
236 #pragma weak BOD_IRQHandler = Default_Handler
237 #pragma weak FMC_IRQHandler = Default_Handler
238 #pragma weak PIOINT3_IRQHandler = Default_Handler
239 #pragma weak PIOINT2_IRQHandler = Default_Handler
240 #pragma weak PIOINT1_IRQHandler = Default_Handler
241 #pragma weak PIOINT0_IRQHandler = Default_Handler