]> git.sur5r.net Git - freertos/blob - Demo/CORTEX_LM3Sxxxx_IAR_Keil/startup_ewarm.c
Update to V4.5.0 files and directory structure.
[freertos] / Demo / CORTEX_LM3Sxxxx_IAR_Keil / startup_ewarm.c
1 //*****************************************************************************\r
2 //\r
3 // startup_ewarm.c - Boot code for Stellaris.\r
4 //\r
5 // Copyright (c) 2006-2007 Luminary Micro, Inc.  All rights reserved.\r
6 //\r
7 // Software License Agreement\r
8 //\r
9 // Luminary Micro, Inc. (LMI) is supplying this software for use solely and\r
10 // exclusively on LMI's microcontroller products.\r
11 //\r
12 // The software is owned by LMI and/or its suppliers, and is protected under\r
13 // applicable copyright laws.  All rights are reserved.  Any use in violation\r
14 // of the foregoing restrictions may subject the user to criminal sanctions\r
15 // under applicable laws, as well as to civil liability for the breach of the\r
16 // terms and conditions of this license.\r
17 //\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
23 //\r
24 // This is part of revision 100 of the Stellaris Ethernet\r
25 // Applications Library.\r
26 //\r
27 //*****************************************************************************\r
28 \r
29 //*****************************************************************************\r
30 //\r
31 // Enable the IAR extensions for this source file.\r
32 //\r
33 //*****************************************************************************\r
34 #pragma language=extended\r
35 \r
36 //*****************************************************************************\r
37 //\r
38 // Forward declaration of the default fault handlers.\r
39 //\r
40 //*****************************************************************************\r
41 void ResetISR(void);\r
42 static void NmiSR(void);\r
43 static void FaultISR(void);\r
44 static void IntDefaultHandler(void);\r
45 \r
46 //*****************************************************************************\r
47 //\r
48 // External declaration for the interrupt handler used by the application.\r
49 //\r
50 //*****************************************************************************\r
51 \r
52 \r
53 //*****************************************************************************\r
54 //\r
55 // The entry point for the application.\r
56 //\r
57 //*****************************************************************************\r
58 extern int main(void);\r
59 extern void xPortPendSVHandler(void);\r
60 extern void xPortSysTickHandler(void);\r
61 extern void vEMAC_ISR( void );\r
62 extern Timer0IntHandler( void );\r
63 \r
64 //*****************************************************************************\r
65 //\r
66 // Reserve space for the system stack.\r
67 //\r
68 //*****************************************************************************\r
69 #ifndef STACK_SIZE\r
70 #define STACK_SIZE                              64\r
71 #endif\r
72 static unsigned long pulStack[STACK_SIZE];\r
73 \r
74 //*****************************************************************************\r
75 //\r
76 // A union that describes the entries of the vector table.  The union is needed\r
77 // since the first entry is the stack pointer and the remainder are function\r
78 // pointers.\r
79 //\r
80 //*****************************************************************************\r
81 typedef union\r
82 {\r
83     void (*pfnHandler)(void);\r
84     unsigned long ulPtr;\r
85 }\r
86 uVectorEntry;\r
87 \r
88 //*****************************************************************************\r
89 //\r
90 // The minimal vector table for a Cortex M3.  Note that the proper constructs\r
91 // must be placed on this to ensure that it ends up at physical address\r
92 // 0x0000.0000.\r
93 //\r
94 //*****************************************************************************\r
95 __root const uVectorEntry g_pfnVectors[] @ "INTVEC" =\r
96 {\r
97     { .ulPtr = (unsigned long)pulStack + sizeof(pulStack) },\r
98                                             // The initial stack pointer\r
99     ResetISR,                               // The reset handler\r
100     NmiSR,                                  // The NMI handler\r
101     FaultISR,                               // The hard fault handler\r
102     IntDefaultHandler,                      // The MPU fault handler\r
103     IntDefaultHandler,                      // The bus fault handler\r
104     IntDefaultHandler,                      // The usage fault handler\r
105     0,                                      // Reserved\r
106     0,                                      // Reserved\r
107     0,                                      // Reserved\r
108     0,                                      // Reserved\r
109     IntDefaultHandler,                      // SVCall handler\r
110     IntDefaultHandler,                      // Debug monitor handler\r
111     0,                                      // Reserved\r
112     xPortPendSVHandler,                     // The PendSV handler\r
113     xPortSysTickHandler,                    // The SysTick handler\r
114     IntDefaultHandler,                      // GPIO Port A\r
115     IntDefaultHandler,                      // GPIO Port B\r
116     IntDefaultHandler,                      // GPIO Port C\r
117     IntDefaultHandler,                      // GPIO Port D\r
118     IntDefaultHandler,                      // GPIO Port E\r
119     IntDefaultHandler,                      // UART0 Rx and Tx\r
120     IntDefaultHandler,                      // UART1 Rx and Tx\r
121     IntDefaultHandler,                      // SSI Rx and Tx\r
122     IntDefaultHandler,                      // I2C Master and Slave\r
123     IntDefaultHandler,                      // PWM Fault\r
124     IntDefaultHandler,                      // PWM Generator 0\r
125     IntDefaultHandler,                      // PWM Generator 1\r
126     IntDefaultHandler,                      // PWM Generator 2\r
127     IntDefaultHandler,                      // Quadrature Encoder\r
128     IntDefaultHandler,                      // ADC Sequence 0\r
129     IntDefaultHandler,                      // ADC Sequence 1\r
130     IntDefaultHandler,                      // ADC Sequence 2\r
131     IntDefaultHandler,                      // ADC Sequence 3\r
132     IntDefaultHandler,                      // Watchdog timer\r
133     Timer0IntHandler,                       // Timer 0 subtimer A\r
134     IntDefaultHandler,                      // Timer 0 subtimer B\r
135     IntDefaultHandler,                      // Timer 1 subtimer A\r
136     IntDefaultHandler,                      // Timer 1 subtimer B\r
137     IntDefaultHandler,                      // Timer 2 subtimer A\r
138     IntDefaultHandler,                      // Timer 2 subtimer B\r
139     IntDefaultHandler,                      // Analog Comparator 0\r
140     IntDefaultHandler,                      // Analog Comparator 1\r
141     IntDefaultHandler,                      // Analog Comparator 2\r
142     IntDefaultHandler,                      // System Control (PLL, OSC, BO)\r
143     IntDefaultHandler,                      // FLASH Control\r
144     IntDefaultHandler,                      // GPIO Port F\r
145     IntDefaultHandler,                      // GPIO Port G\r
146     IntDefaultHandler,                      // GPIO Port H\r
147     IntDefaultHandler,                      // UART2 Rx and Tx\r
148     IntDefaultHandler,                      // SSI1 Rx and Tx\r
149     IntDefaultHandler,                      // Timer 3 subtimer A\r
150     IntDefaultHandler,                      // Timer 3 subtimer B\r
151     IntDefaultHandler,                      // I2C1 Master and Slave\r
152     IntDefaultHandler,                      // Quadrature Encoder 1\r
153     IntDefaultHandler,                      // CAN0\r
154     IntDefaultHandler,                      // CAN1\r
155     IntDefaultHandler,                      // CAN2\r
156     vEMAC_ISR,                                          // Ethernet\r
157     IntDefaultHandler                       // Power Island\r
158 };\r
159 \r
160 //*****************************************************************************\r
161 //\r
162 // The following are constructs created by the linker, indicating where the\r
163 // the "data" and "bss" segments reside in memory.  The initializers for the\r
164 // for the "data" segment resides immediately following the "text" segment.\r
165 //\r
166 //*****************************************************************************\r
167 #pragma segment="DATA_ID"\r
168 #pragma segment="DATA_I"\r
169 #pragma segment="DATA_Z"\r
170 \r
171 //*****************************************************************************\r
172 //\r
173 // This is the code that gets called when the processor first starts execution\r
174 // following a reset event.  Only the absolutely necessary set is performed,\r
175 // after which the application supplied entry() routine is called.  Any fancy\r
176 // actions (such as making decisions based on the reset cause register, and\r
177 // resetting the bits in that register) are left solely in the hands of the\r
178 // application.\r
179 //\r
180 //*****************************************************************************\r
181 void\r
182 ResetISR(void)\r
183 {\r
184     unsigned long *pulSrc, *pulDest, *pulEnd;\r
185 \r
186     //\r
187     // Copy the data segment initializers from flash to SRAM.\r
188     //\r
189     pulSrc = __segment_begin("DATA_ID");\r
190     pulDest = __segment_begin("DATA_I");\r
191     pulEnd = __segment_end("DATA_I");\r
192     while(pulDest < pulEnd)\r
193     {\r
194         *pulDest++ = *pulSrc++;\r
195     }\r
196 \r
197     //\r
198     // Zero fill the bss segment.\r
199     //\r
200     pulDest = __segment_begin("DATA_Z");\r
201     pulEnd = __segment_end("DATA_Z");\r
202     while(pulDest < pulEnd)\r
203     {\r
204         *pulDest++ = 0;\r
205     }\r
206 \r
207     //\r
208     // Call the application's entry point.\r
209     //\r
210     main();\r
211 }\r
212 \r
213 //*****************************************************************************\r
214 //\r
215 // This is the code that gets called when the processor receives a NMI.  This\r
216 // simply enters an infinite loop, preserving the system state for examination\r
217 // by a debugger.\r
218 //\r
219 //*****************************************************************************\r
220 static void\r
221 NmiSR(void)\r
222 {\r
223     //\r
224     // Enter an infinite loop.\r
225     //\r
226     while(1)\r
227     {\r
228     }\r
229 }\r
230 \r
231 //*****************************************************************************\r
232 //\r
233 // This is the code that gets called when the processor receives a fault\r
234 // interrupt.  This simply enters an infinite loop, preserving the system state\r
235 // for examination by a debugger.\r
236 //\r
237 //*****************************************************************************\r
238 static void\r
239 FaultISR(void)\r
240 {\r
241     //\r
242     // Enter an infinite loop.\r
243     //\r
244     while(1)\r
245     {\r
246     }\r
247 }\r
248 \r
249 //*****************************************************************************\r
250 //\r
251 // This is the code that gets called when the processor receives an unexpected\r
252 // interrupt.  This simply enters an infinite loop, preserving the system state\r
253 // for examination by a debugger.\r
254 //\r
255 //*****************************************************************************\r
256 static void\r
257 IntDefaultHandler(void)\r
258 {\r
259     //\r
260     // Go into an infinite loop.\r
261     //\r
262     while(1)\r
263     {\r
264     }\r
265 }\r