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
38 /* External declaration for the reset handler that is to be called when the */
39 /* processor is started */
40 extern void _c_int00(void);
41
42 /* External declaration for system initialization function */
43 extern void SystemInit(void);
44
45 /* Linker variable that marks the top of the stack. */
46 extern uint32_t __STACK_TOP;
47
48 /* Forward declaration of the default fault handlers. */
49 void Default_Handler(void) __attribute__((weak));
50 extern void Reset_Handler(void) __attribute__((weak));
51
52 /* Cortex-M4 Processor Exceptions */
53 extern void NMI_Handler(void) __attribute__((weak, alias("Default_Handler")));
54 extern void HardFault_Handler(void) __attribute__((weak, alias("Default_Handler")));
55 extern void MemManage_Handler(void) __attribute__((weak, alias("Default_Handler")));
56 extern void BusFault_Handler(void) __attribute__((weak, alias("Default_Handler")));
57 extern void UsageFault_Handler(void) __attribute__((weak, alias("Default_Handler")));
58 extern void SVC_Handler(void) __attribute__((weak, alias("Default_Handler")));
59 extern void DebugMon_Handler(void) __attribute__((weak, alias("Default_Handler")));
60 extern void PendSV_Handler(void) __attribute__((weak, alias("Default_Handler")));
61 extern void SysTick_Handler(void) __attribute__((weak, alias("Default_Handler")));
62
63 /* device specific interrupt handler */
64 extern void GPIOA_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
65 extern void GPIOB_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
66 extern void GPIOC_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
67 extern void GPIOD_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
68 extern void GPIOE_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
69 extern void UART0_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
70 extern void UART1_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
71 extern void SSI0_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
72 extern void I2C0_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
73 extern void PWM0_FAULT_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
74 extern void PWM0_0_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
75 extern void PWM0_1_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
76 extern void PWM0_2_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
77 extern void QEI0_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
78 extern void ADC0SS0_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
79 extern void ADC0SS1_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
80 extern void ADC0SS2_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
81 extern void ADC0SS3_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
82 extern void WATCHDOG_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
83 extern void TIMER0A_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
84 extern void TIMER0B_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
85 extern void TIMER1A_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
86 extern void TIMER1B_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
87 extern void TIMER2A_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
88 extern void TIMER2B_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
89 extern void COMP0_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
90 extern void COMP1_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
91 extern void COMP2_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
92 extern void SYSCTL_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
93 extern void FLASH_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
94 extern void GPIOF_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
95 extern void GPIOG_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
96 extern void GPIOH_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
97 extern void UART2_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
98 extern void SSI1_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
99 extern void TIMER3A_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
100 extern void TIMER3B_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
101 extern void I2C1_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
102 extern void CAN0_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
103 extern void CAN1_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
104 extern void EMAC0_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
105 extern void HIBERNATE_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
106 extern void USB0_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
107 extern void PWM0_3_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
108 extern void UDMA_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
109 extern void UDMAERR_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
110 extern void ADC1SS0_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
111 extern void ADC1SS1_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
112 extern void ADC1SS2_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
113 extern void ADC1SS3_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
114 extern void EPI0_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
115 extern void GPIOJ_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
116 extern void GPIOK_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
117 extern void GPIOL_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
118 extern void SSI2_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
119 extern void SSI3_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
120 extern void UART3_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
121 extern void UART4_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
122 extern void UART5_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
123 extern void UART6_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
124 extern void UART7_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
125 extern void I2C2_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
126 extern void I2C3_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
127 extern void TIMER4A_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
128 extern void TIMER4B_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
129 extern void TIMER5A_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
130 extern void TIMER5B_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
131 extern void SYSEXC_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
132 extern void I2C4_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
133 extern void I2C5_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
134 extern void GPIOM_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
135 extern void GPION_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
136 extern void TAMPER0_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
137 extern void GPIOP0_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
138 extern void GPIOP1_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
139 extern void GPIOP2_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
140 extern void GPIOP3_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
141 extern void GPIOP4_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
142 extern void GPIOP5_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
143 extern void GPIOP6_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
144 extern void GPIOP7_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
145 extern void GPIOQ0_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
146 extern void GPIOQ1_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
147 extern void GPIOQ2_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
148 extern void GPIOQ3_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
149 extern void GPIOQ4_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
150 extern void GPIOQ5_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
151 extern void GPIOQ6_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
152 extern void GPIOQ7_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
153 extern void SHA0_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
154 extern void AES0_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
155 extern void DES0_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
156 extern void TIMER6A_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
157 extern void TIMER6B_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
158 extern void TIMER7A_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
159 extern void TIMER7B_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
160 extern void I2C6_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
161 extern void I2C7_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
162 extern void I2C8_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
163 extern void I2C9_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
164
165 /* Interrupt vector table. Note that the proper constructs must be placed on this to */
166 /* ensure that it ends up at physical address 0x0000.0000 or at the start of */
167 /* the program if located at a start address other than 0. */
168 #pragma RETAIN(interruptVectors)
169 #pragma DATA_SECTION(interruptVectors, ".intvecs")
170 void (* const interruptVectors[])(void) =
171 {
172 (void (*)(void))((uint32_t)&__STACK_TOP),
173 /* The initial stack pointer */
174 Reset_Handler, /* The reset handler */
175 NMI_Handler, /* The NMI handler */
176 HardFault_Handler, /* The hard fault handler */
177 MemManage_Handler, /* The MPU fault handler */
178 BusFault_Handler, /* The bus fault handler */
179 UsageFault_Handler, /* The usage fault handler */
180 0, /* Reserved */
181 0, /* Reserved */
182 0, /* Reserved */
183 0, /* Reserved */
184 SVC_Handler, /* SVCall handler */
185 DebugMon_Handler, /* Debug monitor handler */
186 0, /* Reserved */
187 PendSV_Handler, /* The PendSV handler */
188 SysTick_Handler, /* The SysTick handler */
189 GPIOA_IRQHandler, /* GPIO Port A */
190 GPIOB_IRQHandler, /* GPIO Port B */
191 GPIOC_IRQHandler, /* GPIO Port C */
192 GPIOD_IRQHandler, /* GPIO Port D */
193 GPIOE_IRQHandler, /* GPIO Port E */
194 UART0_IRQHandler, /* UART0 Rx and Tx */
195 UART1_IRQHandler, /* UART1 Rx and Tx */
196 SSI0_IRQHandler, /* SSI0 Rx and Tx */
197 I2C0_IRQHandler, /* I2C0 Master and Slave */
198 PWM0_FAULT_IRQHandler, /* PWM Fault */
199 PWM0_0_IRQHandler, /* PWM Generator 0 */
200 PWM0_1_IRQHandler, /* PWM Generator 1 */
201 PWM0_2_IRQHandler, /* PWM Generator 2 */
202 QEI0_IRQHandler, /* Quadrature Encoder 0 */
203 ADC0SS0_IRQHandler, /* ADC Sequence 0 */
204 ADC0SS1_IRQHandler, /* ADC Sequence 1 */
205 ADC0SS2_IRQHandler, /* ADC Sequence 2 */
206 ADC0SS3_IRQHandler, /* ADC Sequence 3 */
207 WATCHDOG_IRQHandler, /* Watchdog timer */
208 TIMER0A_IRQHandler, /* Timer 0 subtimer A */
209 TIMER0B_IRQHandler, /* Timer 0 subtimer B */
210 TIMER1A_IRQHandler, /* Timer 1 subtimer A */
211 TIMER1B_IRQHandler, /* Timer 1 subtimer B */
212 TIMER2A_IRQHandler, /* Timer 2 subtimer A */
213 TIMER2B_IRQHandler, /* Timer 2 subtimer B */
214 COMP0_IRQHandler, /* Analog Comparator 0 */
215 COMP1_IRQHandler, /* Analog Comparator 1 */
216 COMP2_IRQHandler, /* Analog Comparator 2 */
217 SYSCTL_IRQHandler, /* System Control */
218 FLASH_IRQHandler, /* FLASH Control */
219 GPIOF_IRQHandler, /* GPIO Port F */
220 GPIOG_IRQHandler, /* GPIO Port G */
221 GPIOH_IRQHandler, /* GPIO Port H */
222 UART2_IRQHandler, /* UART2 Rx and Tx */
223 SSI1_IRQHandler, /* SSI1 Rx and Tx */
224 TIMER3A_IRQHandler, /* Timer 3 subtimer A */
225 TIMER3B_IRQHandler, /* Timer 3 subtimer B */
226 I2C1_IRQHandler, /* I2C1 Master and Slave */
227 CAN0_IRQHandler, /* CAN0 */
228 CAN1_IRQHandler, /* CAN1 */
229 EMAC0_IRQHandler, /* Ethernet */
230 HIBERNATE_IRQHandler, /* Hibernate */
231 USB0_IRQHandler, /* USB0 */
232 PWM0_3_IRQHandler, /* PWM Generator 3 */
233 UDMA_IRQHandler, /* uDMA Software Transfer */
234 UDMAERR_IRQHandler, /* uDMA Error */
235 ADC1SS0_IRQHandler, /* ADC1 Sequence 0 */
236 ADC1SS1_IRQHandler, /* ADC1 Sequence 1 */
237 ADC1SS2_IRQHandler, /* ADC1 Sequence 2 */
238 ADC1SS3_IRQHandler, /* ADC1 Sequence 3 */
239 EPI0_IRQHandler, /* External Bus Interface 0 */
240 GPIOJ_IRQHandler, /* GPIO Port J */
241 GPIOK_IRQHandler, /* GPIO Port K */
242 GPIOL_IRQHandler, /* GPIO Port L */
243 SSI2_IRQHandler, /* SSI2 Rx and Tx */
244 SSI3_IRQHandler, /* SSI3 Rx and Tx */
245 UART3_IRQHandler, /* UART3 Rx and Tx */
246 UART4_IRQHandler, /* UART4 Rx and Tx */
247 UART5_IRQHandler, /* UART5 Rx and Tx */
248 UART6_IRQHandler, /* UART6 Rx and Tx */
249 UART7_IRQHandler, /* UART7 Rx and Tx */
250 I2C2_IRQHandler, /* I2C2 Master and Slave */
251 I2C3_IRQHandler, /* I2C3 Master and Slave */
252 TIMER4A_IRQHandler, /* Timer 4 subtimer A */
253 TIMER4B_IRQHandler, /* Timer 4 subtimer B */
254 TIMER5A_IRQHandler, /* Timer 5 subtimer A */
255 TIMER5B_IRQHandler, /* Timer 5 subtimer B */
256 SYSEXC_IRQHandler, /* FPU */
257 0, /* Reserved */
258 0, /* Reserved */
259 I2C4_IRQHandler, /* I2C4 Master and Slave */
260 I2C5_IRQHandler, /* I2C5 Master and Slave */
261 GPIOM_IRQHandler, /* GPIO Port M */
262 GPION_IRQHandler, /* GPIO Port N */
263 0, /* Reserved */
264 TAMPER0_IRQHandler, /* Tamper */
265 GPIOP0_IRQHandler, /* GPIO Port P(Summary or P0)*/
266 GPIOP1_IRQHandler, /* GPIO Port P1 */
267 GPIOP2_IRQHandler, /* GPIO Port P2 */
268 GPIOP3_IRQHandler, /* GPIO Port P3 */
269 GPIOP4_IRQHandler, /* GPIO Port P4 */
270 GPIOP5_IRQHandler, /* GPIO Port P5 */
271 GPIOP6_IRQHandler, /* GPIO Port P6 */
272 GPIOP7_IRQHandler, /* GPIO Port P7 */
273 GPIOQ0_IRQHandler, /* GPIO Port Q(Summary or Q0)*/
274 GPIOQ1_IRQHandler, /* GPIO Port Q1 */
275 GPIOQ2_IRQHandler, /* GPIO Port Q2 */
276 GPIOQ3_IRQHandler, /* GPIO Port Q3 */
277 GPIOQ4_IRQHandler, /* GPIO Port Q4 */
278 GPIOQ5_IRQHandler, /* GPIO Port Q5 */
279 GPIOQ6_IRQHandler, /* GPIO Port Q6 */
280 GPIOQ7_IRQHandler, /* GPIO Port Q7 */
281 0, /* Reserved */
282 0, /* Reserved */
283 SHA0_IRQHandler, /* SHA/MD5 0 */
284 AES0_IRQHandler, /* AES 0 */
285 DES0_IRQHandler, /* DES3DES 0 */
286 0, /* Reserved */
287 TIMER6A_IRQHandler, /* Timer 6 subtimer A */
288 TIMER6B_IRQHandler, /* Timer 6 subtimer B */
289 TIMER7A_IRQHandler, /* Timer 7 subtimer A */
290 TIMER7B_IRQHandler, /* Timer 7 subtimer B */
291 I2C6_IRQHandler, /* I2C6 Master and Slave */
292 I2C7_IRQHandler, /* I2C7 Master and Slave */
293 0, /* Reserved */
294 0, /* Reserved */
295 0, /* Reserved */
296 0, /* Reserved */
297 0, /* Reserved */
298 I2C8_IRQHandler, /* I2C8 Master and Slave */
299 I2C9_IRQHandler, /* I2C9 Master and Slave */
300 0, /* Reserved */
301 0, /* Reserved */
302 0, /* Reserved */
303 };
304
305 /* Forward declaration of the default fault handlers. */
306 /* This is the code that gets called when the processor first starts execution */
307 /* following a reset event. Only the absolutely necessary set is performed, */
308 /* after which the application supplied entry() routine is called. Any fancy */
309 /* actions (such as making decisions based on the reset cause register, and */
310 /* resetting the bits in that register) are left solely in the hands of the */
311 /* application. */
Reset_Handler(void)312 void Reset_Handler(void)
313 {
314 SystemInit();
315
316 /* Jump to the CCS C Initialization Routine. */
317 __asm(" .global _c_int00\n"
318 " b.w _c_int00");
319 }
320
321 /* This is the code that gets called when the processor receives an unexpected */
322 /* interrupt. This simply enters an infinite loop, preserving the system state */
323 /* for examination by a debugger. */
Default_Handler(void)324 void Default_Handler(void)
325 {
326 /* Fault trap exempt from ULP advisor */
327 #pragma diag_push
328 #pragma CHECK_ULP("-2.1")
329
330 /* Enter an infinite loop. */
331 while (1)
332 {
333 }
334
335 #pragma diag_pop
336 }
337