1 /******************************************************************************
2 *
3 * Copyright (C) 2017 Texas Instruments Incorporated - http://www.ti.com/
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 *
9 * Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer.
11 *
12 * Redistributions in binary form must reproduce the above copyright
13 * notice, this list of conditions and the following disclaimer in the
14 * documentation and/or other materials provided with the
15 * distribution.
16 *
17 * Neither the name of Texas Instruments Incorporated nor the names of
18 * its contributors may be used to endorse or promote products derived
19 * from this software without specific prior written permission.
20 *
21 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
22 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
23 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
24 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
25 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
26 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
27 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
28 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
29 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
30 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
31 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
32 *
33 *****************************************************************************/
34
35 #include <stdint.h>
36
37 #ifndef HWREG
38 #define HWREG(x) (*((volatile uint32_t *)(x)))
39 #endif
40
41 /* Reserve space for the system stack. */
42 extern uint32_t __StackTop;
43 typedef void(*pFunc)(void);
44
45 /* Entry point for the application. */
46 extern int _mainCRTStartup();
47
48 /* External declaration for system initialization function */
49 extern void SystemInit(void);
50
51 /* Forward declaration of the default fault handlers. */
52 void Default_Handler(void) __attribute__((weak));
53 extern void Reset_Handler(void) __attribute__((weak));
54
55 /* Cortex-M4 Processor Exceptions */
56 extern void NMI_Handler(void) __attribute__((weak, alias("Default_Handler")));
57 extern void HardFault_Handler(void) __attribute__((weak, alias("Default_Handler")));
58 extern void MemManage_Handler(void) __attribute__((weak, alias("Default_Handler")));
59 extern void BusFault_Handler(void) __attribute__((weak, alias("Default_Handler")));
60 extern void UsageFault_Handler(void) __attribute__((weak, alias("Default_Handler")));
61 extern void SVC_Handler(void) __attribute__((weak, alias("Default_Handler")));
62 extern void DebugMon_Handler(void) __attribute__((weak, alias("Default_Handler")));
63 extern void PendSV_Handler(void) __attribute__((weak, alias("Default_Handler")));
64 extern void SysTick_Handler(void) __attribute__((weak, alias("Default_Handler")));
65
66 /* device specific interrupt handler */
67 extern void GPIOA_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
68 extern void GPIOB_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
69 extern void GPIOC_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
70 extern void GPIOD_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
71 extern void GPIOE_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
72 extern void UART0_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
73 extern void UART1_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
74 extern void SSI0_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
75 extern void I2C0_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
76 extern void PWM0_FAULT_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
77 extern void PWM0_0_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
78 extern void PWM0_1_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
79 extern void PWM0_2_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
80 extern void QEI0_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
81 extern void ADC0SS0_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
82 extern void ADC0SS1_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
83 extern void ADC0SS2_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
84 extern void ADC0SS3_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
85 extern void WATCHDOG_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
86 extern void TIMER0A_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
87 extern void TIMER0B_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
88 extern void TIMER1A_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
89 extern void TIMER1B_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
90 extern void TIMER2A_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
91 extern void TIMER2B_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
92 extern void COMP0_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
93 extern void COMP1_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
94 extern void COMP2_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
95 extern void SYSCTL_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
96 extern void FLASH_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
97 extern void GPIOF_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
98 extern void GPIOG_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
99 extern void GPIOH_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
100 extern void UART2_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
101 extern void SSI1_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
102 extern void TIMER3A_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
103 extern void TIMER3B_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
104 extern void I2C1_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
105 extern void CAN0_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
106 extern void CAN1_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
107 extern void EMAC0_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
108 extern void HIBERNATE_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
109 extern void USB0_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
110 extern void PWM0_3_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
111 extern void UDMA_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
112 extern void UDMAERR_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
113 extern void ADC1SS0_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
114 extern void ADC1SS1_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
115 extern void ADC1SS2_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
116 extern void ADC1SS3_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
117 extern void EPI0_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
118 extern void GPIOJ_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
119 extern void GPIOK_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
120 extern void GPIOL_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
121 extern void SSI2_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
122 extern void SSI3_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
123 extern void UART3_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
124 extern void UART4_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
125 extern void UART5_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
126 extern void UART6_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
127 extern void UART7_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
128 extern void I2C2_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
129 extern void I2C3_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
130 extern void TIMER4A_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
131 extern void TIMER4B_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
132 extern void TIMER5A_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
133 extern void TIMER5B_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
134 extern void SYSEXC_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
135 extern void I2C4_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
136 extern void I2C5_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
137 extern void GPIOM_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
138 extern void GPION_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
139 extern void TAMPER0_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
140 extern void GPIOP0_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
141 extern void GPIOP1_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
142 extern void GPIOP2_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
143 extern void GPIOP3_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
144 extern void GPIOP4_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
145 extern void GPIOP5_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
146 extern void GPIOP6_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
147 extern void GPIOP7_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
148 extern void GPIOQ0_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
149 extern void GPIOQ1_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
150 extern void GPIOQ2_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
151 extern void GPIOQ3_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
152 extern void GPIOQ4_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
153 extern void GPIOQ5_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
154 extern void GPIOQ6_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
155 extern void GPIOQ7_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
156 extern void GPIOR_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
157 extern void GPIOS_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
158 extern void SHA0_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
159 extern void AES0_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
160 extern void DES0_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
161 extern void LCD0_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
162 extern void TIMER6A_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
163 extern void TIMER6B_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
164 extern void TIMER7A_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
165 extern void TIMER7B_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
166 extern void I2C6_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
167 extern void I2C7_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
168 extern void ONEWIRE0_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
169 extern void I2C8_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
170 extern void I2C9_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
171 extern void GPIOT_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
172
173
174 /* The vector table. Note that the proper constructs must be placed on this to */
175 /* ensure that it ends up at physical address 0x0000.0000 or at the start of */
176 /* the program if located at a start address other than 0. */
177
178 void (* const interruptVectors[])(void) __attribute__((section(".intvecs"))) =
179 {
180 (pFunc) &__StackTop,
181 /* The initial stack pointer */
182 Reset_Handler, /* The reset handler */
183 NMI_Handler, /* The NMI handler */
184 HardFault_Handler, /* The hard fault handler */
185 MemManage_Handler, /* The MPU fault handler */
186 BusFault_Handler, /* The bus fault handler */
187 UsageFault_Handler, /* The usage fault handler */
188 0, /* Reserved */
189 0, /* Reserved */
190 0, /* Reserved */
191 0, /* Reserved */
192 SVC_Handler, /* SVCall handler */
193 DebugMon_Handler, /* Debug monitor handler */
194 0, /* Reserved */
195 PendSV_Handler, /* The PendSV handler */
196 SysTick_Handler, /* The SysTick handler */
197 GPIOA_IRQHandler, /* GPIO Port A */
198 GPIOB_IRQHandler, /* GPIO Port B */
199 GPIOC_IRQHandler, /* GPIO Port C */
200 GPIOD_IRQHandler, /* GPIO Port D */
201 GPIOE_IRQHandler, /* GPIO Port E */
202 UART0_IRQHandler, /* UART0 Rx and Tx */
203 UART1_IRQHandler, /* UART1 Rx and Tx */
204 SSI0_IRQHandler, /* SSI0 Rx and Tx */
205 I2C0_IRQHandler, /* I2C0 Master and Slave */
206 PWM0_FAULT_IRQHandler, /* PWM Fault */
207 PWM0_0_IRQHandler, /* PWM Generator 0 */
208 PWM0_1_IRQHandler, /* PWM Generator 1 */
209 PWM0_2_IRQHandler, /* PWM Generator 2 */
210 QEI0_IRQHandler, /* Quadrature Encoder 0 */
211 ADC0SS0_IRQHandler, /* ADC Sequence 0 */
212 ADC0SS1_IRQHandler, /* ADC Sequence 1 */
213 ADC0SS2_IRQHandler, /* ADC Sequence 2 */
214 ADC0SS3_IRQHandler, /* ADC Sequence 3 */
215 WATCHDOG_IRQHandler, /* Watchdog timer */
216 TIMER0A_IRQHandler, /* Timer 0 subtimer A */
217 TIMER0B_IRQHandler, /* Timer 0 subtimer B */
218 TIMER1A_IRQHandler, /* Timer 1 subtimer A */
219 TIMER1B_IRQHandler, /* Timer 1 subtimer B */
220 TIMER2A_IRQHandler, /* Timer 2 subtimer A */
221 TIMER2B_IRQHandler, /* Timer 2 subtimer B */
222 COMP0_IRQHandler, /* Analog Comparator 0 */
223 COMP1_IRQHandler, /* Analog Comparator 1 */
224 COMP2_IRQHandler, /* Analog Comparator 2 */
225 SYSCTL_IRQHandler, /* System Control */
226 FLASH_IRQHandler, /* FLASH Control */
227 GPIOF_IRQHandler, /* GPIO Port F */
228 GPIOG_IRQHandler, /* GPIO Port G */
229 GPIOH_IRQHandler, /* GPIO Port H */
230 UART2_IRQHandler, /* UART2 Rx and Tx */
231 SSI1_IRQHandler, /* SSI1 Rx and Tx */
232 TIMER3A_IRQHandler, /* Timer 3 subtimer A */
233 TIMER3B_IRQHandler, /* Timer 3 subtimer B */
234 I2C1_IRQHandler, /* I2C1 Master and Slave */
235 CAN0_IRQHandler, /* CAN0 */
236 CAN1_IRQHandler, /* CAN1 */
237 EMAC0_IRQHandler, /* Ethernet */
238 HIBERNATE_IRQHandler, /* Hibernate */
239 USB0_IRQHandler, /* USB0 */
240 PWM0_3_IRQHandler, /* PWM Generator 3 */
241 UDMA_IRQHandler, /* uDMA Software Transfer */
242 UDMAERR_IRQHandler, /* uDMA Error */
243 ADC1SS0_IRQHandler, /* ADC1 Sequence 0 */
244 ADC1SS1_IRQHandler, /* ADC1 Sequence 1 */
245 ADC1SS2_IRQHandler, /* ADC1 Sequence 2 */
246 ADC1SS3_IRQHandler, /* ADC1 Sequence 3 */
247 EPI0_IRQHandler, /* External Bus Interface 0 */
248 GPIOJ_IRQHandler, /* GPIO Port J */
249 GPIOK_IRQHandler, /* GPIO Port K */
250 GPIOL_IRQHandler, /* GPIO Port L */
251 SSI2_IRQHandler, /* SSI2 Rx and Tx */
252 SSI3_IRQHandler, /* SSI3 Rx and Tx */
253 UART3_IRQHandler, /* UART3 Rx and Tx */
254 UART4_IRQHandler, /* UART4 Rx and Tx */
255 UART5_IRQHandler, /* UART5 Rx and Tx */
256 UART6_IRQHandler, /* UART6 Rx and Tx */
257 UART7_IRQHandler, /* UART7 Rx and Tx */
258 I2C2_IRQHandler, /* I2C2 Master and Slave */
259 I2C3_IRQHandler, /* I2C3 Master and Slave */
260 TIMER4A_IRQHandler, /* Timer 4 subtimer A */
261 TIMER4B_IRQHandler, /* Timer 4 subtimer B */
262 TIMER5A_IRQHandler, /* Timer 5 subtimer A */
263 TIMER5B_IRQHandler, /* Timer 5 subtimer B */
264 SYSEXC_IRQHandler, /* FPU */
265 0, /* Reserved */
266 0, /* Reserved */
267 I2C4_IRQHandler, /* I2C4 Master and Slave */
268 I2C5_IRQHandler, /* I2C5 Master and Slave */
269 GPIOM_IRQHandler, /* GPIO Port M */
270 GPION_IRQHandler, /* GPIO Port N */
271 0, /* Reserved */
272 TAMPER0_IRQHandler, /* Tamper */
273 GPIOP0_IRQHandler, /* GPIO Port P(Summary or P0)*/
274 GPIOP1_IRQHandler, /* GPIO Port P1 */
275 GPIOP2_IRQHandler, /* GPIO Port P2 */
276 GPIOP3_IRQHandler, /* GPIO Port P3 */
277 GPIOP4_IRQHandler, /* GPIO Port P4 */
278 GPIOP5_IRQHandler, /* GPIO Port P5 */
279 GPIOP6_IRQHandler, /* GPIO Port P6 */
280 GPIOP7_IRQHandler, /* GPIO Port P7 */
281 GPIOQ0_IRQHandler, /* GPIO Port Q(Summary or Q0)*/
282 GPIOQ1_IRQHandler, /* GPIO Port Q1 */
283 GPIOQ2_IRQHandler, /* GPIO Port Q2 */
284 GPIOQ3_IRQHandler, /* GPIO Port Q3 */
285 GPIOQ4_IRQHandler, /* GPIO Port Q4 */
286 GPIOQ5_IRQHandler, /* GPIO Port Q5 */
287 GPIOQ6_IRQHandler, /* GPIO Port Q6 */
288 GPIOQ7_IRQHandler, /* GPIO Port Q7 */
289 GPIOR_IRQHandler, /* GPIO Port R */
290 GPIOS_IRQHandler, /* GPIO Port S */
291 SHA0_IRQHandler, /* SHA/MD5 0 */
292 AES0_IRQHandler, /* AES 0 */
293 DES0_IRQHandler, /* DES3DES 0 */
294 LCD0_IRQHandler, /* LCD Controller 0 */
295 TIMER6A_IRQHandler, /* Timer 6 subtimer A */
296 TIMER6B_IRQHandler, /* Timer 6 subtimer B */
297 TIMER7A_IRQHandler, /* Timer 7 subtimer A */
298 TIMER7B_IRQHandler, /* Timer 7 subtimer B */
299 I2C6_IRQHandler, /* I2C6 Master and Slave */
300 I2C7_IRQHandler, /* I2C7 Master and Slave */
301 0, /* Reserved */
302 ONEWIRE0_IRQHandler, /* One Wire 0 */
303 0, /* Reserved */
304 0, /* Reserved */
305 0, /* Reserved */
306 I2C8_IRQHandler, /* I2C8 Master and Slave */
307 I2C9_IRQHandler, /* I2C9 Master and Slave */
308 GPIOT_IRQHandler, /* GPIO Port T */
309 0, /* Reserved */
310 0, /* Reserved */
311 };
312
313 /* The following are constructs created by the linker, indicating where the */
314 /* the "data" and "bss" segments reside in memory. The initializers for the */
315 /* for the "data" segment resides immediately following the "text" segment. */
316 extern uint32_t __data_load__;
317 extern uint32_t __data_start__;
318 extern uint32_t __data_end__;
319
320
321 /* This is the code that gets called when the processor first starts execution */
322 /* following a reset event. Only the absolutely necessary set is performed, */
323 /* after which the application supplied entry() routine is called. Any fancy */
324 /* actions (such as making decisions based on the reset cause register, and */
325 /* resetting the bits in that register) are left solely in the hands of the */
326 /* application. */
Reset_Handler(void)327 void Reset_Handler(void)
328 {
329 uint32_t *pui32Src, *pui32Dest;
330
331 //
332 // Copy the data segment initializers from flash to SRAM.
333 //
334 pui32Src = &__data_load__;
335 for (pui32Dest = &__data_start__; pui32Dest < &__data_end__;)
336 {
337 *pui32Dest++ = *pui32Src++;
338 }
339
340 /* Call system initialization routine */
341 SystemInit();
342
343 /* Jump to the main initialization routine. */
344 _mainCRTStartup();
345 }
346
347 /* This is the code that gets called when the processor receives an unexpected */
348 /* interrupt. This simply enters an infinite loop, preserving the system state */
349 /* for examination by a debugger. */
Default_Handler(void)350 void Default_Handler(void)
351 {
352 /* Enter an infinite loop. */
353 while (1)
354 {
355 }
356 }