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 entry(void);
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 SHA0_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
157 extern void AES0_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
158 extern void DES0_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
159 extern void TIMER6A_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
160 extern void TIMER6B_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
161 extern void TIMER7A_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
162 extern void TIMER7B_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
163 extern void I2C6_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
164 extern void I2C7_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
165 extern void I2C8_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
166 extern void I2C9_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
167
168
169 /* The vector table. Note that the proper constructs must be placed on this to */
170 /* ensure that it ends up at physical address 0x0000.0000 or at the start of */
171 /* the program if located at a start address other than 0. */
172
173 void (* const interruptVectors[])(void) __attribute__((section(".intvecs"))) =
174 {
175 (pFunc) &__StackTop,
176 /* The initial stack pointer */
177 Reset_Handler, /* The reset handler */
178 NMI_Handler, /* The NMI handler */
179 HardFault_Handler, /* The hard fault handler */
180 MemManage_Handler, /* The MPU fault handler */
181 BusFault_Handler, /* The bus fault handler */
182 UsageFault_Handler, /* The usage fault handler */
183 0, /* Reserved */
184 0, /* Reserved */
185 0, /* Reserved */
186 0, /* Reserved */
187 SVC_Handler, /* SVCall handler */
188 DebugMon_Handler, /* Debug monitor handler */
189 0, /* Reserved */
190 PendSV_Handler, /* The PendSV handler */
191 SysTick_Handler, /* The SysTick handler */
192 GPIOA_IRQHandler, /* GPIO Port A */
193 GPIOB_IRQHandler, /* GPIO Port B */
194 GPIOC_IRQHandler, /* GPIO Port C */
195 GPIOD_IRQHandler, /* GPIO Port D */
196 GPIOE_IRQHandler, /* GPIO Port E */
197 UART0_IRQHandler, /* UART0 Rx and Tx */
198 UART1_IRQHandler, /* UART1 Rx and Tx */
199 SSI0_IRQHandler, /* SSI0 Rx and Tx */
200 I2C0_IRQHandler, /* I2C0 Master and Slave */
201 PWM0_FAULT_IRQHandler, /* PWM Fault */
202 PWM0_0_IRQHandler, /* PWM Generator 0 */
203 PWM0_1_IRQHandler, /* PWM Generator 1 */
204 PWM0_2_IRQHandler, /* PWM Generator 2 */
205 QEI0_IRQHandler, /* Quadrature Encoder 0 */
206 ADC0SS0_IRQHandler, /* ADC Sequence 0 */
207 ADC0SS1_IRQHandler, /* ADC Sequence 1 */
208 ADC0SS2_IRQHandler, /* ADC Sequence 2 */
209 ADC0SS3_IRQHandler, /* ADC Sequence 3 */
210 WATCHDOG_IRQHandler, /* Watchdog timer */
211 TIMER0A_IRQHandler, /* Timer 0 subtimer A */
212 TIMER0B_IRQHandler, /* Timer 0 subtimer B */
213 TIMER1A_IRQHandler, /* Timer 1 subtimer A */
214 TIMER1B_IRQHandler, /* Timer 1 subtimer B */
215 TIMER2A_IRQHandler, /* Timer 2 subtimer A */
216 TIMER2B_IRQHandler, /* Timer 2 subtimer B */
217 COMP0_IRQHandler, /* Analog Comparator 0 */
218 COMP1_IRQHandler, /* Analog Comparator 1 */
219 COMP2_IRQHandler, /* Analog Comparator 2 */
220 SYSCTL_IRQHandler, /* System Control */
221 FLASH_IRQHandler, /* FLASH Control */
222 GPIOF_IRQHandler, /* GPIO Port F */
223 GPIOG_IRQHandler, /* GPIO Port G */
224 GPIOH_IRQHandler, /* GPIO Port H */
225 UART2_IRQHandler, /* UART2 Rx and Tx */
226 SSI1_IRQHandler, /* SSI1 Rx and Tx */
227 TIMER3A_IRQHandler, /* Timer 3 subtimer A */
228 TIMER3B_IRQHandler, /* Timer 3 subtimer B */
229 I2C1_IRQHandler, /* I2C1 Master and Slave */
230 CAN0_IRQHandler, /* CAN0 */
231 CAN1_IRQHandler, /* CAN1 */
232 EMAC0_IRQHandler, /* Ethernet */
233 HIBERNATE_IRQHandler, /* Hibernate */
234 USB0_IRQHandler, /* USB0 */
235 PWM0_3_IRQHandler, /* PWM Generator 3 */
236 UDMA_IRQHandler, /* uDMA Software Transfer */
237 UDMAERR_IRQHandler, /* uDMA Error */
238 ADC1SS0_IRQHandler, /* ADC1 Sequence 0 */
239 ADC1SS1_IRQHandler, /* ADC1 Sequence 1 */
240 ADC1SS2_IRQHandler, /* ADC1 Sequence 2 */
241 ADC1SS3_IRQHandler, /* ADC1 Sequence 3 */
242 EPI0_IRQHandler, /* External Bus Interface 0 */
243 GPIOJ_IRQHandler, /* GPIO Port J */
244 GPIOK_IRQHandler, /* GPIO Port K */
245 GPIOL_IRQHandler, /* GPIO Port L */
246 SSI2_IRQHandler, /* SSI2 Rx and Tx */
247 SSI3_IRQHandler, /* SSI3 Rx and Tx */
248 UART3_IRQHandler, /* UART3 Rx and Tx */
249 UART4_IRQHandler, /* UART4 Rx and Tx */
250 UART5_IRQHandler, /* UART5 Rx and Tx */
251 UART6_IRQHandler, /* UART6 Rx and Tx */
252 UART7_IRQHandler, /* UART7 Rx and Tx */
253 I2C2_IRQHandler, /* I2C2 Master and Slave */
254 I2C3_IRQHandler, /* I2C3 Master and Slave */
255 TIMER4A_IRQHandler, /* Timer 4 subtimer A */
256 TIMER4B_IRQHandler, /* Timer 4 subtimer B */
257 TIMER5A_IRQHandler, /* Timer 5 subtimer A */
258 TIMER5B_IRQHandler, /* Timer 5 subtimer B */
259 SYSEXC_IRQHandler, /* FPU */
260 0, /* Reserved */
261 0, /* Reserved */
262 I2C4_IRQHandler, /* I2C4 Master and Slave */
263 I2C5_IRQHandler, /* I2C5 Master and Slave */
264 GPIOM_IRQHandler, /* GPIO Port M */
265 GPION_IRQHandler, /* GPIO Port N */
266 0, /* Reserved */
267 TAMPER0_IRQHandler, /* Tamper */
268 GPIOP0_IRQHandler, /* GPIO Port P(Summary or P0)*/
269 GPIOP1_IRQHandler, /* GPIO Port P1 */
270 GPIOP2_IRQHandler, /* GPIO Port P2 */
271 GPIOP3_IRQHandler, /* GPIO Port P3 */
272 GPIOP4_IRQHandler, /* GPIO Port P4 */
273 GPIOP5_IRQHandler, /* GPIO Port P5 */
274 GPIOP6_IRQHandler, /* GPIO Port P6 */
275 GPIOP7_IRQHandler, /* GPIO Port P7 */
276 GPIOQ0_IRQHandler, /* GPIO Port Q(Summary or Q0)*/
277 GPIOQ1_IRQHandler, /* GPIO Port Q1 */
278 GPIOQ2_IRQHandler, /* GPIO Port Q2 */
279 GPIOQ3_IRQHandler, /* GPIO Port Q3 */
280 GPIOQ4_IRQHandler, /* GPIO Port Q4 */
281 GPIOQ5_IRQHandler, /* GPIO Port Q5 */
282 GPIOQ6_IRQHandler, /* GPIO Port Q6 */
283 GPIOQ7_IRQHandler, /* GPIO Port Q7 */
284 0, /* Reserved */
285 0, /* Reserved */
286 SHA0_IRQHandler, /* SHA/MD5 0 */
287 AES0_IRQHandler, /* AES 0 */
288 DES0_IRQHandler, /* DES3DES 0 */
289 0, /* Reserved */
290 TIMER6A_IRQHandler, /* Timer 6 subtimer A */
291 TIMER6B_IRQHandler, /* Timer 6 subtimer B */
292 TIMER7A_IRQHandler, /* Timer 7 subtimer A */
293 TIMER7B_IRQHandler, /* Timer 7 subtimer B */
294 I2C6_IRQHandler, /* I2C6 Master and Slave */
295 I2C7_IRQHandler, /* I2C7 Master and Slave */
296 0, /* Reserved */
297 0, /* Reserved */
298 0, /* Reserved */
299 0, /* Reserved */
300 0, /* Reserved */
301 I2C8_IRQHandler, /* I2C8 Master and Slave */
302 I2C9_IRQHandler, /* I2C9 Master and Slave */
303 0, /* Reserved */
304 0, /* Reserved */
305 0 /* Reserved */
306 };
307
308 /* The following are constructs created by the linker, indicating where the */
309 /* the "data" and "bss" segments reside in memory. The initializers for the */
310 /* for the "data" segment resides immediately following the "text" segment. */
311 extern uint32_t __data_load__;
312 extern uint32_t __data_start__;
313 extern uint32_t __data_end__;
314
315
316 /* This is the code that gets called when the processor first starts execution */
317 /* following a reset event. Only the absolutely necessary set is performed, */
318 /* after which the application supplied entry() routine is called. Any fancy */
319 /* actions (such as making decisions based on the reset cause register, and */
320 /* resetting the bits in that register) are left solely in the hands of the */
321 /* application. */
Reset_Handler(void)322 void Reset_Handler(void)
323 {
324 uint32_t *pui32Src, *pui32Dest;
325
326 //
327 // Copy the data segment initializers from flash to SRAM.
328 //
329 pui32Src = &__data_load__;
330 for (pui32Dest = &__data_start__; pui32Dest < &__data_end__;)
331 {
332 *pui32Dest++ = *pui32Src++;
333 }
334
335 /* Call system initialization routine */
336 SystemInit();
337
338 /* Jump to the main initialization routine. */
339 entry();
340 }
341
342 /* This is the code that gets called when the processor receives an unexpected */
343 /* interrupt. This simply enters an infinite loop, preserving the system state */
344 /* for examination by a debugger. */
Default_Handler(void)345 void Default_Handler(void)
346 {
347 /* Enter an infinite loop. */
348 while (1)
349 {
350 }
351 }