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