Contiki 3.x
interrupt-vector-k60.c
1 /*
2  * Interrupt vector for K60 MCU.
3  *
4  * Note: It is not necessary to modify this file to define custom interrupt
5  * service routines. All symbols are defined weak, it is only necessary to
6  * define a function with the same name in another file to override the default
7  * interrupt handlers.
8  */
9 
10 #include "K60.h"
11 
12 #define SECTION(x) __attribute__ ((section(#x)))
13 #define ISR_VECTOR_SECTION SECTION(.vector_table)
14 void reset_handler(void) __attribute__((naked));
15 void _isr_nmi(void) __attribute__((interrupt));
16 void _isr_hardfault(void) __attribute__((interrupt));
17 void _isr_memmanage(void) __attribute__((interrupt));
18 void _isr_busfault(void) __attribute__((interrupt));
19 void _isr_usagefault(void) __attribute__((interrupt));
20 
21 /* Default handler for interrupts, infinite loop */
22 static void unhandled_interrupt(void) __attribute__((interrupt, unused));
23 
24 #define UNHANDLED_ALIAS __attribute__((weak, alias("unhandled_interrupt")));
25 
26 /* __attribute__((naked)) in order to not add any function prologue to the
27  * default hardfault handler written in asm */
28 /* __attribute__((unused)) in order to avoid (incorrect) compiler warnings about
29  * the functions being unused when only referenced from the weak alias. */
30 static void dHardFault_handler(void) __attribute__((naked, unused));
31 static void dMemManage_handler(void) __attribute__((unused));
32 static void dUsageFault_handler(void) __attribute__((unused));
33 static void dBusFault_handler(void) __attribute__((unused));
34 
35 /* ARM Cortex defined interrupt vectors */
36 void reset_handler(void) __attribute__((naked));
37 void _isr_nmi(void) __attribute__((interrupt));
38 void _isr_hardfault(void) __attribute__((weak, alias("dHardFault_handler")));
39 void _isr_memmanage(void) __attribute__((weak, alias("dMemManage_handler")));
40 void _isr_busfault(void) __attribute__((weak, alias("dBusFault_handler")));
41 void _isr_usagefault(void) __attribute__((weak, alias("dUsageFault_handler")));
42 void _isr_reserved(void) UNHANDLED_ALIAS;
43 /* void _isr_reserved(void) UNHANDLED_ALIAS; */
44 /* void _isr_reserved(void) UNHANDLED_ALIAS; */
45 /* void _isr_reserved(void) UNHANDLED_ALIAS; */
46 void _isr_svcall(void) UNHANDLED_ALIAS;
47 void _isr_debugmonitor(void) UNHANDLED_ALIAS;
48 /* void _isr_reserved(void) UNHANDLED_ALIAS; */
49 void _isr_pendsv(void) UNHANDLED_ALIAS;
50 void _isr_systick(void) UNHANDLED_ALIAS;
51 
52 /* device-specific (freescale) defined interrupt vectors */
53 void _isr_dma0_complete(void) UNHANDLED_ALIAS;
54 void _isr_dma1_complete(void) UNHANDLED_ALIAS;
55 void _isr_dma2_complete(void) UNHANDLED_ALIAS;
56 void _isr_dma3_complete(void) UNHANDLED_ALIAS;
57 void _isr_dma4_complete(void) UNHANDLED_ALIAS;
58 void _isr_dma5_complete(void) UNHANDLED_ALIAS;
59 void _isr_dma6_complete(void) UNHANDLED_ALIAS;
60 void _isr_dma7_complete(void) UNHANDLED_ALIAS;
61 void _isr_dma8_complete(void) UNHANDLED_ALIAS;
62 void _isr_dma9_complete(void) UNHANDLED_ALIAS;
63 void _isr_dma10_complete(void) UNHANDLED_ALIAS;
64 void _isr_dma11_complete(void) UNHANDLED_ALIAS;
65 void _isr_dma12_complete(void) UNHANDLED_ALIAS;
66 void _isr_dma13_complete(void) UNHANDLED_ALIAS;
67 void _isr_dma14_complete(void) UNHANDLED_ALIAS;
68 void _isr_dma15_complete(void) UNHANDLED_ALIAS;
69 void _isr_dma_error(void) UNHANDLED_ALIAS;
70 void _isr_mcm(void) UNHANDLED_ALIAS;
71 void _isr_flash_command_complete(void) UNHANDLED_ALIAS;
72 void _isr_flash_read_collision(void) UNHANDLED_ALIAS;
73 void _isr_low_voltage(void) UNHANDLED_ALIAS;
74 void _isr_llwu(void) UNHANDLED_ALIAS;
75 void _isr_watchdog(void) UNHANDLED_ALIAS;
76 void _isr_random_number_generator(void) UNHANDLED_ALIAS;
77 void _isr_i2c0(void) UNHANDLED_ALIAS;
78 void _isr_i2c1(void) UNHANDLED_ALIAS;
79 void _isr_spi0(void) UNHANDLED_ALIAS;
80 void _isr_spi1(void) UNHANDLED_ALIAS;
81 void _isr_spi2(void) UNHANDLED_ALIAS;
82 void _isr_can0_ored_msg_buffer(void) UNHANDLED_ALIAS;
83 void _isr_can0_bus_off(void) UNHANDLED_ALIAS;
84 void _isr_can0_error(void) UNHANDLED_ALIAS;
85 void _isr_can0_tx_warn(void) UNHANDLED_ALIAS;
86 void _isr_can0_rx_warn(void) UNHANDLED_ALIAS;
87 void _isr_can0_wake_up(void) UNHANDLED_ALIAS;
88 void _isr_i2s0_tx(void) UNHANDLED_ALIAS;
89 void _isr_i2s0_rx(void) UNHANDLED_ALIAS;
90 void _isr_can1_ored_msg_buffer(void) UNHANDLED_ALIAS;
91 void _isr_can1_bus_off(void) UNHANDLED_ALIAS;
92 void _isr_can1_error(void) UNHANDLED_ALIAS;
93 void _isr_can1_tx_warn(void) UNHANDLED_ALIAS;
94 void _isr_can1_rx_warn(void) UNHANDLED_ALIAS;
95 void _isr_can1_wake_up(void) UNHANDLED_ALIAS;
96 /* void _isr_reserved(void) UNHANDLED_ALIAS; */
97 void _isr_uart0_lon(void) UNHANDLED_ALIAS;
98 void _isr_uart0_status(void) UNHANDLED_ALIAS;
99 void _isr_uart0_error(void) UNHANDLED_ALIAS;
100 void _isr_uart1_status(void) UNHANDLED_ALIAS;
101 void _isr_uart1_error(void) UNHANDLED_ALIAS;
102 void _isr_uart2_status(void) UNHANDLED_ALIAS;
103 void _isr_uart2_error(void) UNHANDLED_ALIAS;
104 void _isr_uart3_status(void) UNHANDLED_ALIAS;
105 void _isr_uart3_error(void) UNHANDLED_ALIAS;
106 void _isr_uart4_status(void) UNHANDLED_ALIAS;
107 void _isr_uart4_error(void) UNHANDLED_ALIAS;
108 /* void _isr_reserved(void) UNHANDLED_ALIAS; */
109 /* void _isr_reserved(void) UNHANDLED_ALIAS; */
110 void _isr_adc0(void) UNHANDLED_ALIAS;
111 void _isr_adc1(void) UNHANDLED_ALIAS;
112 void _isr_cmp0(void) UNHANDLED_ALIAS;
113 void _isr_cmp1(void) UNHANDLED_ALIAS;
114 void _isr_cmp2(void) UNHANDLED_ALIAS;
115 void _isr_ftm0(void) UNHANDLED_ALIAS;
116 void _isr_ftm1(void) UNHANDLED_ALIAS;
117 void _isr_ftm2(void) UNHANDLED_ALIAS;
118 void _isr_cmt(void) UNHANDLED_ALIAS;
119 void _isr_rtc_alarm(void) UNHANDLED_ALIAS;
120 void _isr_rtc_seconds(void) UNHANDLED_ALIAS;
121 void _isr_pit0(void) UNHANDLED_ALIAS;
122 void _isr_pit1(void) UNHANDLED_ALIAS;
123 void _isr_pit2(void) UNHANDLED_ALIAS;
124 void _isr_pit3(void) UNHANDLED_ALIAS;
125 void _isr_pdb(void) UNHANDLED_ALIAS;
126 void _isr_usb_otg(void) UNHANDLED_ALIAS;
127 void _isr_usb_charger_detect(void) UNHANDLED_ALIAS;
128 void _isr_enet_1588_timer(void) UNHANDLED_ALIAS;
129 void _isr_enet_tx(void) UNHANDLED_ALIAS;
130 void _isr_enet_rx(void) UNHANDLED_ALIAS;
131 void _isr_enet_error_misc(void) UNHANDLED_ALIAS;
132 /* void _isr_reserved(void) UNHANDLED_ALIAS; */
133 void _isr_sdhc(void) UNHANDLED_ALIAS;
134 void _isr_dac0(void) UNHANDLED_ALIAS;
135 /* void _isr_reserved(void) UNHANDLED_ALIAS; */
136 void _isr_tsi(void) UNHANDLED_ALIAS;
137 void _isr_mcg(void) UNHANDLED_ALIAS;
138 void _isr_lpt(void) UNHANDLED_ALIAS;
139 /* void _isr_reserved(void) UNHANDLED_ALIAS; */
140 void _isr_porta_pin_detect(void) UNHANDLED_ALIAS;
141 void _isr_portb_pin_detect(void) UNHANDLED_ALIAS;
142 void _isr_portc_pin_detect(void) UNHANDLED_ALIAS;
143 void _isr_portd_pin_detect(void) UNHANDLED_ALIAS;
144 void _isr_porte_pin_detect(void) UNHANDLED_ALIAS;
145 /* void _isr_reserved(void) UNHANDLED_ALIAS; */
146 /* void _isr_reserved(void) UNHANDLED_ALIAS; */
147 void _isr_software(void) UNHANDLED_ALIAS;
148 
149 /* This is the value of the stack pointer at power on. This is not a real function. */
150 void __stack_top(void);
151 
152 typedef void (*ISR_func)(void);
153 
154 const ISR_func isr_vector[111] ISR_VECTOR_SECTION =
155 {
156  /* ARM Cortex defined interrupt vectors */
157  __stack_top,
158  reset_handler,
159  _isr_nmi,
160  _isr_hardfault,
161  _isr_memmanage,
162  _isr_busfault,
163  _isr_usagefault,
164  _isr_reserved,
165  _isr_reserved,
166  _isr_reserved,
167  _isr_reserved,
168  _isr_svcall,
169  _isr_debugmonitor,
170  _isr_reserved,
171  _isr_pendsv,
172  _isr_systick,
173 
174  /* Device-specific (Freescale defined) interrupt vectors */
175  _isr_dma0_complete,
176  _isr_dma1_complete,
177  _isr_dma2_complete,
178  _isr_dma3_complete,
179  _isr_dma4_complete,
180  _isr_dma5_complete,
181  _isr_dma6_complete,
182  _isr_dma7_complete,
183  _isr_dma8_complete,
184  _isr_dma9_complete,
185  _isr_dma10_complete,
186  _isr_dma11_complete,
187  _isr_dma12_complete,
188  _isr_dma13_complete,
189  _isr_dma14_complete,
190  _isr_dma15_complete,
191  _isr_dma_error,
192  _isr_mcm,
193  _isr_flash_command_complete,
194  _isr_flash_read_collision,
195  _isr_low_voltage,
196  _isr_llwu,
197  _isr_watchdog,
198  _isr_random_number_generator,
199  _isr_i2c0,
200  _isr_i2c1,
201  _isr_spi0,
202  _isr_spi1,
203  _isr_spi2,
204  _isr_can0_ored_msg_buffer,
205  _isr_can0_bus_off,
206  _isr_can0_error,
207  _isr_can0_tx_warn,
208  _isr_can0_rx_warn,
209  _isr_can0_wake_up,
210  _isr_i2s0_tx,
211  _isr_i2s0_rx,
212  _isr_can1_ored_msg_buffer,
213  _isr_can1_bus_off,
214  _isr_can1_error,
215  _isr_can1_tx_warn,
216  _isr_can1_rx_warn,
217  _isr_can1_wake_up,
218  _isr_reserved,
219  _isr_uart0_lon,
220  _isr_uart0_status,
221  _isr_uart0_error,
222  _isr_uart1_status,
223  _isr_uart1_error,
224  _isr_uart2_status,
225  _isr_uart2_error,
226  _isr_uart3_status,
227  _isr_uart3_error,
228  _isr_uart4_status,
229  _isr_uart4_error,
230  _isr_reserved,
231  _isr_reserved,
232  _isr_adc0,
233  _isr_adc1,
234  _isr_cmp0,
235  _isr_cmp1,
236  _isr_cmp2,
237  _isr_ftm0,
238  _isr_ftm1,
239  _isr_ftm2,
240  _isr_cmt,
241  _isr_rtc_alarm,
242  _isr_rtc_seconds,
243  _isr_pit0,
244  _isr_pit1,
245  _isr_pit2,
246  _isr_pit3,
247  _isr_pdb,
248  _isr_usb_otg,
249  _isr_usb_charger_detect,
250  _isr_enet_1588_timer,
251  _isr_enet_tx,
252  _isr_enet_rx,
253  _isr_enet_error_misc,
254  _isr_reserved,
255  _isr_sdhc,
256  _isr_dac0,
257  _isr_reserved,
258  _isr_tsi,
259  _isr_mcg,
260  _isr_lpt,
261  _isr_reserved,
262  _isr_porta_pin_detect,
263  _isr_portb_pin_detect,
264  _isr_portc_pin_detect,
265  _isr_portd_pin_detect,
266  _isr_porte_pin_detect,
267  _isr_reserved,
268  _isr_reserved,
269  _isr_software
270 };
271 
272 void
273 _isr_nmi(void)
274 {
275  while(1);
276 }
277 
278 static void
279 unhandled_interrupt(void)
280 {
281  /* The IPSR register can be used to identify which interrupt caused the
282  * unhandled interrupt handler to be invoked. See Cortex-M4 Devices Generic User Guide. */
283  volatile uint32_t ipsr = __get_IPSR();
284  (void)ipsr;
285  while(1);
286 }
287 
288 /**
289  * Default handler of Hard Faults
290  *
291  * This function is only an assembly language wrapper for the function
292  * hard_fault_handler_c, defined in fault-handlers.c
293  */
294 static void
295 dHardFault_handler(void)
296 {
297  __asm volatile
298  (
299  "tst lr, #4\n"
300  "ite eq\n"
301  "mrseq r0, msp\n"
302  "mrsne r0, psp\n"
303  "b hard_fault_handler_c\n"
304  );
305  while(1);
306 }
307 
308 /**
309  * Default handler of Usage Fault
310  */
311 static void
312 dUsageFault_handler(void)
313 {
314  while(1);
315 }
316 
317 /**
318  * Default handler of MemManage Fault
319  */
320 static void
321 dMemManage_handler(void)
322 {
323  while(1);
324 }
325 
326 /**
327  * Default handler of Bus Fault
328  */
329 static void
330 dBusFault_handler(void)
331 {
332  while(1);
333 }
void __attribute__((interrupt))
This ISR handles most of the business interacting with the 1-wire bus.
Definition: onewire.c:174
K60 hardware register header wrapper.
void _isr_pit0(void)
Definition: rtimer-arch.c:133