]> git.sur5r.net Git - freertos/blob - FreeRTOS/Demo/CORTEX_M7_SAMV71_Xplained_IAR_Keil/libchip_samv7/source/exceptions.c
Final V8.2.1 release ready for tagging:
[freertos] / FreeRTOS / Demo / CORTEX_M7_SAMV71_Xplained_IAR_Keil / libchip_samv7 / source / exceptions.c
1 /* ----------------------------------------------------------------------------\r
2  *         SAM Software Package License\r
3  * ----------------------------------------------------------------------------\r
4  * Copyright (c) 2014, Atmel Corporation\r
5  *\r
6  * All rights reserved.\r
7  *\r
8  * Redistribution and use in source and binary forms, with or without\r
9  * modification, are permitted provided that the following conditions are met:\r
10  *\r
11  * - Redistributions of source code must retain the above copyright notice,\r
12  * this list of conditions and the disclaimer below.\r
13  *\r
14  * Atmel's name may not be used to endorse or promote products derived from\r
15  * this software without specific prior written permission.\r
16  *\r
17  * DISCLAIMER: THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR\r
18  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\r
19  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE\r
20  * DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR ANY DIRECT, INDIRECT,\r
21  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\r
22  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,\r
23  * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\r
24  * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\r
25  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,\r
26  * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
27  * ----------------------------------------------------------------------------\r
28  */\r
29 \r
30 /**\r
31  * \file\r
32  * This file contains the default exception handlers.\r
33  *\r
34  * \note\r
35  * The exception handler has weak aliases.\r
36  * As they are weak aliases, any function with the same name will override\r
37  * this definition.\r
38  */\r
39 \r
40 /*----------------------------------------------------------------------------\r
41  *        Headers\r
42  *----------------------------------------------------------------------------*/\r
43 \r
44 #include "chip.h"\r
45 \r
46 /*----------------------------------------------------------------------------\r
47  *        Exported functions\r
48  *----------------------------------------------------------------------------*/\r
49 \r
50 /** Flag to indicate whether the svc is done */\r
51 volatile uint32_t dwRaisePriDone=0;\r
52 \r
53 /**\r
54  * \brief Default NMI interrupt handler.\r
55  */\r
56 void NMI_Handler( void )\r
57 {\r
58     while ( 1 ) ;\r
59 }\r
60 \r
61 __INLINE static uint32_t StackUnwind(void)\r
62 {\r
63     uint32_t Fault_Add;\r
64     asm volatile (" mrs r0, msp " );\r
65     asm volatile (" ldr %0, [r0,#28]" :"=r" (Fault_Add));  \r
66     return Fault_Add;\r
67 }\r
68 \r
69 static void HardFault_reason(void)\r
70 {\r
71     uint32_t CFSRValue, BFAR;\r
72     printf("In Hard Fault Handler\n\r");\r
73     printf("SCB->HFSR = 0x%08x\n\r", SCB->HFSR);\r
74 \r
75     if ((SCB->HFSR & SCB_HFSR_DEBUGEVT_Msk)) {\r
76         printf("Debug Event Hard Fault\n\r");\r
77         printf("SCB->DFSR = 0x%08x\n", SCB->DFSR );\r
78     }\r
79 \r
80     if ((SCB->HFSR & SCB_HFSR_VECTTBL_Msk)) {\r
81         printf("Fault was due to vector table read on exception processing\n\r");     \r
82     }\r
83 \r
84     if ((SCB->HFSR & SCB_HFSR_FORCED_Msk)) {\r
85         printf("Forced Hard Fault\n\r");\r
86         printf("SCB->CFSR = 0x%08x\n\r", SCB->CFSR );\r
87         // Usage Fault\r
88         if((SCB->CFSR & SCB_CFSR_USGFAULTSR_Msk)) \r
89         {\r
90             CFSRValue = SCB->CFSR;\r
91             printf("Usage fault: ");\r
92             CFSRValue >>= SCB_CFSR_USGFAULTSR_Pos;                  \r
93             if((CFSRValue & (1 << 9))) {\r
94                 printf("Divide by zero\n\r");\r
95             }\r
96             if((CFSRValue & (1 << 8))) {\r
97                 printf("Unaligned access error\n\r");\r
98             }\r
99             if((CFSRValue & (1 << 3))) {\r
100                 printf("Coprocessor access error\n\r");\r
101             }\r
102             if((CFSRValue & (1 << 2))) {\r
103                 printf("Integrity check error on EXC_RETURN\n\r");\r
104             }\r
105         }\r
106 \r
107         // Bus Fault\r
108         if((SCB->CFSR & SCB_CFSR_BUSFAULTSR_Msk)) \r
109         {\r
110             CFSRValue = SCB->CFSR;\r
111             printf("Bus fault: ");\r
112             CFSRValue >>= SCB_CFSR_BUSFAULTSR_Pos;                 \r
113 \r
114             if((CFSRValue & (1 << 7)) && (CFSRValue & (1 << 1))) {\r
115                 BFAR = SCB->BFAR;\r
116                 printf("Precise data access error. Bus Fault Address Register is: %x \n\r", BFAR );\r
117             }\r
118             if((CFSRValue & (1 << 4))) {\r
119                 printf("Bus fault has occurred on exception entry\n\r");\r
120             }\r
121             if((CFSRValue & (1 << 3))) {\r
122                 printf("bus fault has occurred on exception return\n\r");\r
123             }\r
124             if((CFSRValue & (1 << 2))) {\r
125                 printf("Imprecise data access error\n\r");\r
126             }\r
127 \r
128             if((CFSRValue & (1 << 0))) {\r
129                 printf("This bit indicates a bus fault on an instruction prefetch. \n\r");\r
130             }\r
131 \r
132         }\r
133     }\r
134 \r
135     // MemoryFault      \r
136     if((SCB->CFSR & SCB_CFSR_MEMFAULTSR_Msk)) \r
137     {\r
138         CFSRValue = SCB->CFSR;\r
139         printf("Memory fault: ");\r
140         CFSRValue >>= SCB_CFSR_MEMFAULTSR_Pos;                 \r
141         if((CFSRValue & (1 << 9)) != 0) {\r
142             printf("Divide by zero\n\r");\r
143         }\r
144     }\r
145     __ISB();\r
146     __DMB();\r
147     __ASM volatile("BKPT #01");  \r
148 }\r
149 /**\r
150  * \brief Default HardFault interrupt handler.\r
151  */\r
152 \r
153 void HardFault_Handler( void )\r
154 {\r
155 \r
156     printf("HardFault at addr 0X%x\n\r", StackUnwind());\r
157 \r
158     __ISB();\r
159     __DMB();\r
160     HardFault_reason();\r
161 \r
162 }\r
163 \r
164 /**\r
165  * \brief Default MemManage interrupt handler.\r
166  */\r
167 void MemManage_Handler( void )\r
168 {\r
169     printf("MemoryMemFault (MPU fault) at addr 0X%x\n\r", StackUnwind());\r
170 \r
171     __ISB();\r
172     __DMB();\r
173     __ASM volatile("BKPT #01");  \r
174 }\r
175 \r
176 /**\r
177  * \brief Default BusFault interrupt handler.\r
178  */\r
179 void BusFault_Handler( void )\r
180 {\r
181     asm("nop");\r
182     asm("nop");\r
183     printf("Bus Fault at addr 0X%x\n\r", StackUnwind());\r
184 \r
185     __ISB();\r
186     __DMB();\r
187     __ASM volatile("BKPT #01");  \r
188 }\r
189 \r
190 /**\r
191  * \brief Default UsageFault interrupt handler.\r
192  */\r
193 void UsageFault_Handler( void )\r
194 {\r
195     printf("Usage fault at addr 0X%x", StackUnwind());\r
196 \r
197     __ISB();\r
198     __DMB();\r
199     __ASM volatile("BKPT #01");  \r
200 }\r
201 \r
202 /**\r
203  * \brief Default SVC interrupt handler.\r
204  */\r
205 WEAK void SVC_Handler( void )\r
206 {\r
207     while ( 1 ) ;\r
208 }\r
209 \r
210 /**\r
211  * \brief Default DebugMon interrupt handler.\r
212  */\r
213 WEAK void DebugMon_Handler( void )\r
214 {\r
215     while ( 1 ) ;\r
216 }\r
217 \r
218 /**\r
219  * \brief Default PendSV interrupt handler.\r
220  */\r
221 void PendSV_Handler( void )\r
222 {\r
223     while ( 1 ) ;\r
224 }\r
225 \r
226 /**\r
227  * \brief Default SysTick interrupt handler.\r
228  */\r
229 WEAK void SysTick_Handler( void )\r
230 {\r
231     while ( 1 ) ;\r
232 }\r
233 \r
234 /**\r
235  * \brief Default interrupt handler for Supply Controller.\r
236  */\r
237 WEAK void SUPC_Handler( void )\r
238 {\r
239     while ( 1 ) ;\r
240 }\r
241 \r
242 /**\r
243  * \brief Default interrupt handler for Reset Controller.\r
244  */\r
245 WEAK void RSTC_Handler( void )\r
246 {\r
247     while ( 1 ) ;\r
248 }\r
249 \r
250 /**\r
251  * \brief Default interrupt handler for Real Time Clock.\r
252  */\r
253 WEAK void RTC_Handler( void )\r
254 {\r
255     while ( 1 ) ;\r
256 }\r
257 \r
258 /**\r
259  * \brief Default interrupt handler for Real Time Timer.\r
260  */\r
261 WEAK void RTT_Handler( void )\r
262 {\r
263     while ( 1 ) ;\r
264 }\r
265 \r
266 /**\r
267  * \brief Default interrupt handler for Watchdog Timer.\r
268  */\r
269 WEAK void WDT0_Handler( void )\r
270 {\r
271     while ( 1 ) ;\r
272 }\r
273 \r
274 /**\r
275  * \brief Default interrupt handler for PMC.\r
276  */\r
277 WEAK void PMC_Handler( void )\r
278 {\r
279     while ( 1 ) ;\r
280 }\r
281 \r
282 /**\r
283  * \brief Default interrupt handler for EEFC.\r
284  */\r
285 WEAK void EFC_Handler( void )\r
286 {\r
287     while ( 1 ) ;\r
288 }\r
289 \r
290 /**\r
291  * \brief Default interrupt handler for UART0.\r
292  */\r
293 WEAK void UART0_Handler( void )\r
294 {\r
295     while ( 1 ) ;\r
296 }\r
297 \r
298 /**\r
299  * \brief Default interrupt handler for UART1.\r
300  */\r
301 WEAK void UART1_Handler( void )\r
302 {\r
303     while ( 1 ) ;\r
304 }\r
305 \r
306 /**\r
307  * \brief Default interrupt handler for SMC.\r
308  */\r
309 WEAK void TC10_Handler( void )\r
310 {\r
311     while ( 1 ) ;\r
312 }\r
313 \r
314 /**\r
315  * \brief Default interrupt handler for PIOA Controller.\r
316  */\r
317 WEAK void PIOA_Handler( void )\r
318 {\r
319     while ( 1 ) ;\r
320 }\r
321 \r
322 /**\r
323  * \brief Default interrupt handler for PIOB Controller.\r
324  */\r
325 WEAK void PIOB_Handler( void )\r
326 {\r
327     while ( 1 ) ;\r
328 }\r
329 \r
330 /**\r
331  * \brief Default interrupt handler for PIOC Controller.\r
332  */\r
333 WEAK void PIOC_Handler( void )\r
334 {\r
335     while ( 1 ) ;\r
336 }\r
337 \r
338 /**\r
339  * \brief Default interrupt handler for USART0.\r
340  */\r
341 WEAK void USART0_Handler( void )\r
342 {\r
343     while ( 1 ) ;\r
344 }\r
345 \r
346 /**\r
347  * \brief Default interrupt handler for USART1.\r
348  */\r
349 WEAK void USART1_Handler( void )\r
350 {\r
351     while ( 1 ) ;\r
352 }\r
353 \r
354 /**\r
355  * \brief Default interrupt handler for USART2.\r
356  */\r
357 WEAK void USART2_Handler( void )\r
358 {\r
359     while ( 1 ) ;\r
360 }\r
361 \r
362 /**\r
363  * \brief Default interrupt handler for MCI.\r
364  */\r
365 WEAK void HSMCI_Handler( void )\r
366 {\r
367     while ( 1 ) ;\r
368 }\r
369 \r
370 /**\r
371  * \brief Default interrupt handler for TWI0.\r
372  */\r
373 WEAK void TWI0_Handler( void )\r
374 {\r
375     while ( 1 ) ;\r
376 }\r
377 \r
378 /**\r
379  * \brief Default interrupt handler for TWI1.\r
380  */\r
381 WEAK void TWI1_Handler( void )\r
382 {\r
383     while ( 1 ) ;\r
384 }\r
385 \r
386 /**\r
387  * \brief Default interrupt handler for SPI.\r
388  */\r
389 WEAK void SPI0_Handler( void )\r
390 {\r
391     while ( 1 ) ;\r
392 }\r
393 \r
394 /**\r
395  * \brief Default interrupt handler for SSC.\r
396  */\r
397 WEAK void SSC_Handler( void )\r
398 {\r
399     while ( 1 ) ;\r
400 }\r
401 \r
402 /**\r
403  * \brief Default interrupt handler for TC0.\r
404  */\r
405 WEAK void TC0_Handler( void )\r
406 {\r
407     while ( 1 ) ;\r
408 }\r
409 \r
410 /**\r
411  * \brief Default interrupt handler for TC1.\r
412  */\r
413 WEAK void TC1_Handler( void )\r
414 {\r
415     while ( 1 ) ;\r
416 }\r
417 \r
418 /**\r
419  * \brief Default interrupt handler for TC2.\r
420  */\r
421 WEAK void TC2_Handler( void )\r
422 {\r
423     while ( 1 ) ;\r
424 }\r
425 \r
426 /**\r
427  * \brief Default SUPC interrupt handler for TC3.\r
428  */\r
429 WEAK void TC3_Handler( void )\r
430 {\r
431     while ( 1 ) ;\r
432 }\r
433 \r
434 /**\r
435  * \brief Default SUPC interrupt handler for TC4.\r
436  */\r
437 WEAK void TC4_Handler( void )\r
438 {\r
439     while ( 1 ) ;\r
440 }\r
441 \r
442 /**\r
443  * \brief Default SUPC interrupt handler for TC5.\r
444  */\r
445 WEAK void TC5_Handler( void )\r
446 {\r
447     while ( 1 ) ;\r
448 }\r
449 \r
450 /**\r
451  * \brief Default SUPC interrupt handler for ADC.\r
452  */\r
453 WEAK void AFEC1_Handler( void )\r
454 {\r
455     while ( 1 ) ;\r
456 }\r
457 \r
458 /**\r
459  * \brief Default SUPC interrupt handler for DAC.\r
460  */\r
461 WEAK void DACC_Handler( void )\r
462 {\r
463     while ( 1 ) ;\r
464 }\r
465 \r
466 /**\r
467  * \brief Default SUPC interrupt handler for PWM.\r
468  */\r
469 WEAK void PWM0_Handler( void )\r
470 {\r
471     while ( 1 ) ;\r
472 }\r
473 \r
474 /**\r
475  * \brief Default SUPC interrupt handler for CRCCU.\r
476  */\r
477 WEAK void TC9_Handler( void )\r
478 {\r
479     while ( 1 ) ;\r
480 }\r
481 \r
482 /**\r
483  * \brief Default SUPC interrupt handler for ACC.\r
484  */\r
485 WEAK void ACC_Handler( void )\r
486 {\r
487     while ( 1 ) ;\r
488 }\r
489 \r
490 /**\r
491  * \brief Default SUPC interrupt handler for USBD.\r
492  */\r
493 WEAK void TC11_Handler( void )\r
494 {\r
495     while ( 1 ) ;\r
496 }\r
497 \r
498 WEAK void USBHS_Handler(void)\r
499 {\r
500     //  udd_interrupt();\r
501     while(1);\r
502 }\r