1 //*****************************************************************************
\r
3 // startup_gcc.c - Startup code for use with GNU tools.
\r
5 // Copyright (c) 2009 Luminary Micro, Inc. All rights reserved.
\r
6 // Software License Agreement
\r
8 // Luminary Micro, Inc. (LMI) is supplying this software for use solely and
\r
9 // exclusively on LMI's microcontroller products.
\r
11 // The software is owned by LMI and/or its suppliers, and is protected under
\r
12 // applicable copyright laws. All rights are reserved. You may not combine
\r
13 // this software with "viral" open-source software in order to form a larger
\r
14 // program. Any use in violation of the foregoing restrictions may subject
\r
15 // the user to criminal sanctions under applicable laws, as well as to civil
\r
16 // liability for the breach of the terms and conditions of this license.
\r
18 // THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED
\r
19 // OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF
\r
20 // MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE.
\r
21 // LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR
\r
22 // CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER.
\r
24 // This is part of revision 32 of the Stellaris CMSIS Package.
\r
26 //*****************************************************************************
\r
28 #define WEAK __attribute__ ((weak))
\r
30 //*****************************************************************************
\r
32 // Forward declaration of the default fault handlers.
\r
34 //*****************************************************************************
\r
35 void WEAK Reset_Handler(void);
\r
36 static void Default_Handler(void);
\r
37 void WEAK NMI_Handler(void);
\r
38 void WEAK HardFault_Handler(void);
\r
39 void WEAK MemManage_Handler(void);
\r
40 void WEAK BusFault_Handler(void);
\r
41 void WEAK UsageFault_Handler(void);
\r
42 void WEAK MemManage_Handler(void);
\r
43 void WEAK SVC_Handler(void);
\r
44 void WEAK DebugMon_Handler(void);
\r
45 void WEAK PendSV_Handler(void);
\r
46 void WEAK SysTick_Handler(void);
\r
47 void WEAK GPIOPortA_IRQHandler(void);
\r
48 void WEAK GPIOPortB_IRQHandler(void);
\r
49 void WEAK GPIOPortC_IRQHandler(void);
\r
50 void WEAK GPIOPortD_IRQHandler(void);
\r
51 void WEAK GPIOPortE_IRQHandler(void);
\r
52 void WEAK UART0_IRQHandler(void);
\r
53 void WEAK UART1_IRQHandler(void);
\r
54 void WEAK SSI0_IRQHandler(void);
\r
55 void WEAK I2C0_IRQHandler(void);
\r
56 void WEAK PWMFault_IRQHandler(void);
\r
57 void WEAK PWMGen0_IRQHandler(void);
\r
58 void WEAK PWMGen1_IRQHandler(void);
\r
59 void WEAK PWMGen2_IRQHandler(void);
\r
60 void WEAK QEI0_IRQHandler(void);
\r
61 void WEAK ADCSeq0_IRQHandler(void);
\r
62 void WEAK ADCSeq1_IRQHandler(void);
\r
63 void WEAK ADCSeq2_IRQHandler(void);
\r
64 void WEAK ADCSeq3_IRQHandler(void);
\r
65 void WEAK Watchdog_IRQHandler(void);
\r
66 void WEAK Timer0A_IRQHandler(void);
\r
67 void WEAK Timer0B_IRQHandler(void);
\r
68 void WEAK Timer1A_IRQHandler(void);
\r
69 void WEAK Timer1B_IRQHandler(void);
\r
70 void WEAK Timer2A_IRQHandler(void);
\r
71 void WEAK Timer2B_IRQHandler(void);
\r
72 void WEAK Comp0_IRQHandler(void);
\r
73 void WEAK Comp1_IRQHandler(void);
\r
74 void WEAK Comp2_IRQHandler(void);
\r
75 void WEAK SysCtrl_IRQHandler(void);
\r
76 void WEAK FlashCtrl_IRQHandler(void);
\r
77 void WEAK GPIOPortF_IRQHandler(void);
\r
78 void WEAK GPIOPortG_IRQHandler(void);
\r
79 void WEAK GPIOPortH_IRQHandler(void);
\r
80 void WEAK UART2_IRQHandler(void);
\r
81 void WEAK SSI1_IRQHandler(void);
\r
82 void WEAK Timer3A_IRQHandler(void);
\r
83 void WEAK Timer3B_IRQHandler(void);
\r
84 void WEAK I2C1_IRQHandler(void);
\r
85 void WEAK QEI1_IRQHandler(void);
\r
86 void WEAK CAN0_IRQHandler(void);
\r
87 void WEAK CAN1_IRQHandler(void);
\r
88 void WEAK CAN2_IRQHandler(void);
\r
89 void WEAK Ethernet_IRQHandler(void);
\r
90 void WEAK Hibernate_IRQHandler(void);
\r
92 //*****************************************************************************
\r
94 // The entry point for the application.
\r
96 //*****************************************************************************
\r
97 extern int main(void);
\r
99 //*****************************************************************************
\r
101 // Reserve space for the system stack.
\r
103 //*****************************************************************************
\r
104 static unsigned long pulStack[64];
\r
106 //*****************************************************************************
\r
108 // The vector table. Note that the proper constructs must be placed on this to
\r
109 // ensure that it ends up at physical address 0x0000.0000.
\r
111 //*****************************************************************************
\r
112 __attribute__ ((section(".isr_vector")))
\r
113 void (* const g_pfnVectors[])(void) =
\r
115 (void (*)(void))((unsigned long)pulStack + sizeof(pulStack)),
\r
116 // The initial stack pointer
\r
117 Reset_Handler, // The reset handler
\r
118 NMI_Handler, // The NMI handler
\r
119 HardFault_Handler, // The hard fault handler
\r
120 MemManage_Handler, // The MPU fault handler
\r
121 BusFault_Handler, // The bus fault handler
\r
122 UsageFault_Handler, // The usage fault handler
\r
123 0xeffff74e, // Reserved
\r
127 SVC_Handler, // SVCall handler
\r
128 DebugMon_Handler, // Debug monitor handler
\r
130 PendSV_Handler, // The PendSV handler
\r
131 SysTick_Handler, // The SysTick handler
\r
134 // External Interrupts
\r
136 GPIOPortA_IRQHandler, // GPIO Port A
\r
137 GPIOPortB_IRQHandler, // GPIO Port B
\r
138 GPIOPortC_IRQHandler, // GPIO Port C
\r
139 GPIOPortD_IRQHandler, // GPIO Port D
\r
140 GPIOPortE_IRQHandler, // GPIO Port E
\r
141 UART0_IRQHandler, // UART0 Rx and Tx
\r
142 UART1_IRQHandler, // UART1 Rx and Tx
\r
143 SSI0_IRQHandler, // SSI0 Rx and Tx
\r
144 I2C0_IRQHandler, // I2C0 Master and Slave
\r
145 PWMFault_IRQHandler, // PWM Fault
\r
146 PWMGen0_IRQHandler, // PWM Generator 0
\r
147 PWMGen1_IRQHandler, // PWM Generator 1
\r
148 PWMGen2_IRQHandler, // PWM Generator 2
\r
149 QEI0_IRQHandler, // Quadrature Encoder 0
\r
150 ADCSeq0_IRQHandler, // ADC Sequence 0
\r
151 ADCSeq1_IRQHandler, // ADC Sequence 1
\r
152 ADCSeq2_IRQHandler, // ADC Sequence 2
\r
153 ADCSeq3_IRQHandler, // ADC Sequence 3
\r
154 Watchdog_IRQHandler, // Watchdog timer
\r
155 Timer0A_IRQHandler, // Timer 0 subtimer A
\r
156 Timer0B_IRQHandler, // Timer 0 subtimer B
\r
157 Timer1A_IRQHandler, // Timer 1 subtimer A
\r
158 Timer1B_IRQHandler, // Timer 1 subtimer B
\r
159 Timer2A_IRQHandler, // Timer 2 subtimer A
\r
160 Timer2B_IRQHandler, // Timer 2 subtimer B
\r
161 Comp0_IRQHandler, // Analog Comparator 0
\r
162 Comp1_IRQHandler, // Analog Comparator 1
\r
163 Comp2_IRQHandler, // Analog Comparator 2
\r
164 SysCtrl_IRQHandler, // System Control (PLL, OSC, BO)
\r
165 FlashCtrl_IRQHandler, // FLASH Control
\r
166 GPIOPortF_IRQHandler, // GPIO Port F
\r
167 GPIOPortG_IRQHandler, // GPIO Port G
\r
168 GPIOPortH_IRQHandler, // GPIO Port H
\r
169 UART2_IRQHandler, // UART2 Rx and Tx
\r
170 SSI1_IRQHandler, // SSI1 Rx and Tx
\r
171 Timer3A_IRQHandler, // Timer 3 subtimer A
\r
172 Timer3B_IRQHandler, // Timer 3 subtimer B
\r
173 I2C1_IRQHandler, // I2C1 Master and Slave
\r
174 QEI1_IRQHandler, // Quadrature Encoder 1
\r
175 CAN0_IRQHandler, // CAN0
\r
176 CAN1_IRQHandler, // CAN1
\r
177 CAN2_IRQHandler, // CAN2
\r
178 Ethernet_IRQHandler, // Ethernet
\r
179 Hibernate_IRQHandler // Hibernate
\r
182 //*****************************************************************************
\r
184 // The following are constructs created by the linker, indicating where the
\r
185 // the "data" and "bss" segments reside in memory. The initializers for the
\r
186 // for the "data" segment resides immediately following the "text" segment.
\r
188 //*****************************************************************************
\r
189 extern unsigned long _etext;
\r
190 extern unsigned long _sdata;
\r
191 extern unsigned long _edata;
\r
192 extern unsigned long _sbss;
\r
193 extern unsigned long _ebss;
\r
195 //*****************************************************************************
\r
197 // This is the code that gets called when the processor first starts execution
\r
198 // following a reset event. Only the absolutely necessary set is performed,
\r
199 // after which the application supplied entry() routine is called. Any fancy
\r
200 // actions (such as making decisions based on the reset cause register, and
\r
201 // resetting the bits in that register) are left solely in the hands of the
\r
204 //*****************************************************************************
\r
206 Reset_Handler(void)
\r
208 unsigned long *pulSrc, *pulDest;
\r
211 // Copy the data segment initializers from flash to SRAM.
\r
214 for(pulDest = &_sdata; pulDest < &_edata; )
\r
216 *pulDest++ = *pulSrc++;
\r
220 // Zero fill the bss segment. This is done with inline assembly since this
\r
221 // will clear the value of pulDest if it is not kept in a register.
\r
223 __asm(" ldr r0, =_sbss\n"
\r
224 " ldr r1, =_ebss\n"
\r
230 " strlt r2, [r0], #4\n"
\r
234 // Call the application's entry point.
\r
239 //*****************************************************************************
\r
241 // Provide weak aliases for each Exception handler to the Default_Handler.
\r
242 // As they are weak aliases, any function with the same name will override
\r
243 // this definition.
\r
245 //*****************************************************************************
\r
246 #pragma weak NMI_Handler = Default_Handler
\r
247 #pragma weak HardFault_Handler = Default_Handler
\r
248 #pragma weak MemManage_Handler = Default_Handler
\r
249 #pragma weak BusFault_Handler = Default_Handler
\r
250 #pragma weak UsageFault_Handler = Default_Handler
\r
251 #pragma weak SVC_Handler = Default_Handler
\r
252 #pragma weak DebugMon_Handler = Default_Handler
\r
253 #pragma weak PendSV_Handler = Default_Handler
\r
254 #pragma weak SysTick_Handler = Default_Handler
\r
255 #pragma weak GPIOPortA_IRQHandler = Default_Handler
\r
256 #pragma weak GPIOPortB_IRQHandler = Default_Handler
\r
257 #pragma weak GPIOPortC_IRQHandler = Default_Handler
\r
258 #pragma weak GPIOPortD_IRQHandler = Default_Handler
\r
259 #pragma weak GPIOPortE_IRQHandler = Default_Handler
\r
260 #pragma weak UART0_IRQHandler = Default_Handler
\r
261 #pragma weak UART1_IRQHandler = Default_Handler
\r
262 #pragma weak SSI0_IRQHandler = Default_Handler
\r
263 #pragma weak I2C0_IRQHandler = Default_Handler
\r
264 #pragma weak PWMFault_IRQHandler = Default_Handler
\r
265 #pragma weak PWMGen0_IRQHandler = Default_Handler
\r
266 #pragma weak PWMGen1_IRQHandler = Default_Handler
\r
267 #pragma weak PWMGen2_IRQHandler = Default_Handler
\r
268 #pragma weak QEI0_IRQHandler = Default_Handler
\r
269 #pragma weak ADCSeq0_IRQHandler = Default_Handler
\r
270 #pragma weak ADCSeq1_IRQHandler = Default_Handler
\r
271 #pragma weak ADCSeq2_IRQHandler = Default_Handler
\r
272 #pragma weak ADCSeq3_IRQHandler = Default_Handler
\r
273 #pragma weak Watchdog_IRQHandler = Default_Handler
\r
274 #pragma weak Timer0A_IRQHandler = Default_Handler
\r
275 #pragma weak Timer0B_IRQHandler = Default_Handler
\r
276 #pragma weak Timer1A_IRQHandler = Default_Handler
\r
277 #pragma weak Timer1B_IRQHandler = Default_Handler
\r
278 #pragma weak Timer2A_IRQHandler = Default_Handler
\r
279 #pragma weak Timer2B_IRQHandler = Default_Handler
\r
280 #pragma weak Comp0_IRQHandler = Default_Handler
\r
281 #pragma weak Comp1_IRQHandler = Default_Handler
\r
282 #pragma weak Comp2_IRQHandler = Default_Handler
\r
283 #pragma weak SysCtrl_IRQHandler = Default_Handler
\r
284 #pragma weak FlashCtrl_IRQHandler = Default_Handler
\r
285 #pragma weak GPIOPortF_IRQHandler = Default_Handler
\r
286 #pragma weak GPIOPortG_IRQHandler = Default_Handler
\r
287 #pragma weak GPIOPortH_IRQHandler = Default_Handler
\r
288 #pragma weak UART2_IRQHandler = Default_Handler
\r
289 #pragma weak SSI1_IRQHandler = Default_Handler
\r
290 #pragma weak Timer3A_IRQHandler = Default_Handler
\r
291 #pragma weak Timer3B_IRQHandler = Default_Handler
\r
292 #pragma weak I2C1_IRQHandler = Default_Handler
\r
293 #pragma weak QEI1_IRQHandler = Default_Handler
\r
294 #pragma weak CAN0_IRQHandler = Default_Handler
\r
295 #pragma weak CAN1_IRQHandler = Default_Handler
\r
296 #pragma weak CAN2_IRQHandler = Default_Handler
\r
297 #pragma weak Ethernet_IRQHandler = Default_Handler
\r
298 #pragma weak Hibernate_IRQHandler = Default_Handler
\r
300 //*****************************************************************************
\r
302 // This is the code that gets called when the processor receives an unexpected
\r
303 // interrupt. This simply enters an infinite loop, preserving the system state
\r
304 // for examination by a debugger.
\r
306 //*****************************************************************************
\r
308 Default_Handler(void)
\r
311 // Go into an infinite loop.
\r