]> git.sur5r.net Git - freertos/blob - FreeRTOS/Demo/CORTEX_M7_SAMV71_Xplained_IAR_Keil/libboard_samv7-ek/resources/IAR/startup_sam.c
Final V8.2.1 release ready for tagging:
[freertos] / FreeRTOS / Demo / CORTEX_M7_SAMV71_Xplained_IAR_Keil / libboard_samv7-ek / resources / IAR / startup_sam.c
1 /* ---------------------------------------------------------------------------- */\r
2 /*                  Atmel Microcontroller Software Support                      */\r
3 /*                       SAM Software Package License                           */\r
4 /* ---------------------------------------------------------------------------- */\r
5 /* Copyright (c) 2014, Atmel Corporation                                        */\r
6 /*                                                                              */\r
7 /* All rights reserved.                                                         */\r
8 /*                                                                              */\r
9 /* Redistribution and use in source and binary forms, with or without           */\r
10 /* modification, are permitted provided that the following condition is met:    */\r
11 /*                                                                              */\r
12 /* - Redistributions of source code must retain the above copyright notice,     */\r
13 /* this list of conditions and the disclaimer below.                            */\r
14 /*                                                                              */\r
15 /* Atmel's name may not be used to endorse or promote products derived from     */\r
16 /* this software without specific prior written permission.                     */\r
17 /*                                                                              */\r
18 /* DISCLAIMER:  THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR   */\r
19 /* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF */\r
20 /* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE   */\r
21 /* DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR ANY DIRECT, INDIRECT,      */\r
22 /* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT */\r
23 /* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,  */\r
24 /* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF    */\r
25 /* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING         */\r
26 /* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, */\r
27 /* EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.                           */\r
28 /* ---------------------------------------------------------------------------- */\r
29 \r
30 #include "sam.h"\r
31 \r
32 typedef void (*intfunc) (void);\r
33 typedef union { intfunc __fun; void * __ptr; } intvec_elem;\r
34 \r
35 void __iar_program_start(void);\r
36 int __low_level_init(void);\r
37 \r
38 /* Default empty handler */\r
39 void Dummy_Handler(void);\r
40 \r
41 /* Cortex-M4 core handlers */\r
42 #pragma weak NMI_Handler=Dummy_Handler\r
43 #pragma weak HardFault_Handler=Dummy_Handler\r
44 #pragma weak MemManage_Handler=Dummy_Handler\r
45 #pragma weak BusFault_Handler=Dummy_Handler\r
46 #pragma weak UsageFault_Handler=Dummy_Handler\r
47 #pragma weak SVC_Handler=Dummy_Handler\r
48 #pragma weak DebugMon_Handler=Dummy_Handler\r
49 #pragma weak PendSV_Handler=Dummy_Handler\r
50 #pragma weak SysTick_Handler=Dummy_Handler\r
51 \r
52 /* Peripherals handlers */\r
53 #pragma weak SUPC_Handler=Dummy_Handler\r
54 #pragma weak RSTC_Handler=Dummy_Handler\r
55 #pragma weak RTC_Handler=Dummy_Handler\r
56 #pragma weak RTT_Handler=Dummy_Handler\r
57 #pragma weak WDT0_Handler=Dummy_Handler\r
58 #pragma weak PMC_Handler=Dummy_Handler\r
59 #pragma weak EFC_Handler=Dummy_Handler\r
60 #pragma weak UART0_Handler=Dummy_Handler\r
61 #pragma weak UART1_Handler=Dummy_Handler\r
62 #pragma weak PIOA_Handler=Dummy_Handler\r
63 #pragma weak PIOB_Handler=Dummy_Handler\r
64 #ifdef _SAM_PIOC_INSTANCE_\r
65 #pragma weak PIOC_Handler=Dummy_Handler\r
66 #endif /* _SAM_PIOC_INSTANCE_ */\r
67 #pragma weak USART0_Handler=Dummy_Handler\r
68 #pragma weak USART1_Handler=Dummy_Handler\r
69 #pragma weak USART2_Handler=Dummy_Handler\r
70 #pragma weak PIOD_Handler=Dummy_Handler\r
71 #ifdef _SAM_PIOE_INSTANCE_\r
72 #pragma weak PIOE_Handler=Dummy_Handler\r
73 #endif /* _SAM_PIOE_INSTANCE_ */\r
74 #ifdef _SAM_HSMCI_INSTANCE_\r
75 #pragma weak HSMCI_Handler=Dummy_Handler\r
76 #endif /* _SAM_HSMCI_INSTANCE_ */\r
77 #pragma weak TWI0_Handler=Dummy_Handler\r
78 #pragma weak TWI1_Handler=Dummy_Handler\r
79 #pragma weak SPI0_Handler=Dummy_Handler\r
80 #pragma weak SSC_Handler=Dummy_Handler\r
81 #pragma weak TC0_Handler=Dummy_Handler\r
82 #pragma weak TC1_Handler=Dummy_Handler\r
83 #pragma weak TC2_Handler=Dummy_Handler\r
84 #ifdef _SAM_TC1_INSTANCE_\r
85 #pragma weak TC3_Handler=Dummy_Handler\r
86 #endif /* _SAM_TC1_INSTANCE_ */\r
87 #ifdef _SAM_TC1_INSTANCE_\r
88 #pragma weak TC4_Handler=Dummy_Handler\r
89 #endif /* _SAM_TC1_INSTANCE_ */\r
90 #ifdef _SAM_TC1_INSTANCE_\r
91 #pragma weak TC5_Handler=Dummy_Handler\r
92 #endif /* _SAM_TC1_INSTANCE_ */\r
93 #pragma weak AFEC0_Handler=Dummy_Handler\r
94 #ifdef _SAM_DACC_INSTANCE_\r
95 #pragma weak DACC_Handler=Dummy_Handler\r
96 #endif /* _SAM_DACC_INSTANCE_ */\r
97 #pragma weak PWM0_Handler=Dummy_Handler\r
98 #pragma weak ICM_Handler=Dummy_Handler\r
99 #pragma weak ACC_Handler=Dummy_Handler\r
100 #pragma weak USBHS_Handler=Dummy_Handler\r
101 #pragma weak CAN0_Handler=Dummy_Handler\r
102 #pragma weak CAN1_Handler=Dummy_Handler\r
103 #pragma weak GMAC_Handler=Dummy_Handler\r
104 #pragma weak GMACQ1_Handler=Dummy_Handler\r
105 #pragma weak GMACQ2_Handler=Dummy_Handler\r
106 #pragma weak AFEC1_Handler=Dummy_Handler\r
107 #ifdef _SAM_TWI2_INSTANCE_\r
108 #pragma weak TWI2_Handler=Dummy_Handler\r
109 #endif /* _SAM_TWI2_INSTANCE_ */\r
110 #pragma weak SPI1_Handler=Dummy_Handler\r
111 #pragma weak QSPI_Handler=Dummy_Handler\r
112 #pragma weak UART2_Handler=Dummy_Handler\r
113 #pragma weak UART3_Handler=Dummy_Handler\r
114 #pragma weak UART4_Handler=Dummy_Handler\r
115 #ifdef _SAM_TC2_INSTANCE_\r
116 #pragma weak TC6_Handler=Dummy_Handler\r
117 #endif /* _SAM_TC2_INSTANCE_ */\r
118 #ifdef _SAM_TC2_INSTANCE_\r
119 #pragma weak TC7_Handler=Dummy_Handler\r
120 #endif /* _SAM_TC2_INSTANCE_ */\r
121 #ifdef _SAM_TC2_INSTANCE_\r
122 #pragma weak TC8_Handler=Dummy_Handler\r
123 #endif /* _SAM_TC2_INSTANCE_ */\r
124 #pragma weak TC9_Handler=Dummy_Handler\r
125 #pragma weak TC10_Handler=Dummy_Handler\r
126 #pragma weak TC11_Handler=Dummy_Handler\r
127 #pragma weak MLB_Handler=Dummy_Handler\r
128 #pragma weak AES_Handler=Dummy_Handler\r
129 #pragma weak TRNG_Handler=Dummy_Handler\r
130 #pragma weak XDMAC_Handler=Dummy_Handler\r
131 #pragma weak ISI_Handler=Dummy_Handler\r
132 #pragma weak PWM1_Handler=Dummy_Handler\r
133 #pragma weak FPU_Handler=Dummy_Handler\r
134 #ifdef _SAM_SDRAMC_INSTANCE_\r
135 #pragma weak SDRAMC_Handler=Dummy_Handler\r
136 #endif /* _SAM_SDRAMC_INSTANCE_ */\r
137 #pragma weak WDT1_Handler=Dummy_Handler\r
138 #pragma weak CCF_Handler=Dummy_Handler\r
139 #pragma weak CCW_Handler=Dummy_Handler\r
140 \r
141 /* Exception Table */\r
142 #pragma language = extended\r
143 #pragma segment = "CSTACK"\r
144 \r
145 /* The name "__vector_table" has special meaning for C-SPY: */\r
146 /* it is where the SP start value is found, and the NVIC vector */\r
147 /* table register (VTOR) is initialized to this address if != 0 */\r
148 \r
149 #pragma section = ".intvec"\r
150 #pragma location = ".intvec"\r
151 const intvec_elem __vector_table[] =\r
152 {\r
153     { .__ptr = __sfe( "CSTACK" ) },\r
154     __iar_program_start,\r
155     NMI_Handler,\r
156     HardFault_Handler,\r
157     MemManage_Handler,\r
158     BusFault_Handler,\r
159     UsageFault_Handler,\r
160     (0UL), (0UL), (0UL), (0UL),          /* Reserved */\r
161     SVC_Handler,\r
162     DebugMon_Handler,\r
163     (0UL),          /* Reserved */\r
164     PendSV_Handler,\r
165     SysTick_Handler,\r
166 \r
167     SUPC_Handler,   /* 0  Supply Controller */\r
168     RSTC_Handler,   /* 1  Reset Controller */\r
169     RTC_Handler,    /* 2  Real Time Clock */\r
170     RTT_Handler,    /* 3  Real Time Timer */\r
171     WDT0_Handler,   /* 4  Watchdog Timer 0 */\r
172     PMC_Handler,    /* 5  Power Management Controller */\r
173     EFC_Handler,    /* 6  Enhanced Embedded Flash Controller */\r
174     UART0_Handler,  /* 7  UART 0 */\r
175     UART1_Handler,  /* 8  UART 1 */\r
176     (0UL),          /* 9  Reserved */\r
177     PIOA_Handler,   /* 10 Parallel I/O Controller A */\r
178     PIOB_Handler,   /* 11 Parallel I/O Controller B */\r
179     PIOC_Handler,   /* 12 Parallel I/O Controller C */\r
180     USART0_Handler, /* 13 USART 0 */\r
181     USART1_Handler, /* 14 USART 1 */\r
182     USART2_Handler, /* 15 USART 2 */\r
183     PIOD_Handler,   /* 16 Parallel I/O Controller D */\r
184     PIOE_Handler,   /* 17 Parallel I/O Controller E */    \r
185     HSMCI_Handler,  /* 18 Multimedia Card Interface */\r
186     TWI0_Handler,   /* 19 Two Wire Interface 0 HS */\r
187     TWI1_Handler,   /* 20 Two Wire Interface 1 HS */\r
188     SPI0_Handler,   /* 21 Serial Peripheral Interface 0 */\r
189     SSC_Handler,    /* 22 Synchronous Serial Controller */\r
190     TC0_Handler,    /* 23 Timer/Counter 0 */\r
191     TC1_Handler,    /* 24 Timer/Counter 1 */\r
192     TC2_Handler,    /* 25 Timer/Counter 2 */\r
193     TC3_Handler,    /* 26 Timer/Counter 3 */\r
194     TC4_Handler,    /* 27 Timer/Counter 4 */\r
195     TC5_Handler,    /* 28 Timer/Counter 5 */\r
196     AFEC0_Handler,  /* 29 Analog Front End 0 */\r
197     DACC_Handler,   /* 30 Digital To Analog Converter */\r
198     PWM0_Handler,   /* 31 Pulse Width Modulation 0 */\r
199     ICM_Handler,    /* 32 Integrity Check Monitor */\r
200     ACC_Handler,    /* 33 Analog Comparator */\r
201     USBHS_Handler,  /* 34 USB Host / Device Controller */\r
202     CAN0_Handler,   /* 35 CAN Controller 0 */\r
203     (0UL),          /* 36 Reserved */\r
204     CAN1_Handler,   /* 37 CAN Controller 1 */\r
205     (0UL),          /* 38 Reserved */\r
206     GMAC_Handler,   /* 39 Ethernet MAC */\r
207     AFEC1_Handler,  /* 40 Analog Front End 1 */\r
208     TWI2_Handler,   /* 41 Two Wire Interface 2 HS */\r
209     SPI1_Handler,   /* 42 Serial Peripheral Interface 1 */\r
210     QSPI_Handler,   /* 43 Quad I/O Serial Peripheral Interface */\r
211     UART2_Handler,  /* 44 UART 2 */\r
212     UART3_Handler,  /* 45 UART 3 */\r
213     UART4_Handler,  /* 46 UART 4 */\r
214     TC6_Handler,    /* 47 Timer/Counter 6 */\r
215     TC7_Handler,    /* 48 Timer/Counter 7 */\r
216     TC8_Handler,    /* 49 Timer/Counter 8 */\r
217     TC9_Handler,    /* 50 Timer/Counter 9 */\r
218     TC10_Handler,   /* 51 Timer/Counter 10 */\r
219     TC11_Handler,   /* 52 Timer/Counter 11 */\r
220     MLB_Handler,    /* 53 MediaLB */\r
221     (0UL),          /* 54 Reserved */\r
222     (0UL),          /* 55 Reserved */\r
223     AES_Handler,    /* 56 AES */\r
224     TRNG_Handler,   /* 57 True Random Generator */\r
225     XDMAC_Handler,  /* 58 DMA */\r
226     ISI_Handler,    /* 59 Camera Interface */\r
227     PWM1_Handler,   /* 60 Pulse Width Modulation 1 */\r
228     FPU_Handler,    /* 61 Floating Point Unit */\r
229     SDRAMC_Handler, /* 62 SDRAM Controller */\r
230     WDT1_Handler,   /* 63 Watchdog Timer 1 */\r
231     CCW_Handler,    /* 64 ARM Cache ECC Warning */\r
232     CCF_Handler,    /* 65 ARM Cache ECC Fault */\r
233     GMACQ1_Handler, /* 66 GMAC Queue 1 Handler */\r
234     GMACQ2_Handler  /* 67 GMAC Queue 2 Handler */\r
235 };\r
236 \r
237 void LowLevelInit(void);\r
238 \r
239 #if 0\r
240 /** \brief  TCM memory enable\r
241 \r
242     The function enables TCM memories\r
243  */\r
244 __STATIC_INLINE void TCM_Enable(void) \r
245 {\r
246 \r
247   __DSB();\r
248   __ISB();\r
249   SCB->ITCMCR = (SCB_ITCMCR_EN_Msk  | SCB_ITCMCR_RMW_Msk | SCB_ITCMCR_RETEN_Msk);\r
250   SCB->DTCMCR = ( SCB_DTCMCR_EN_Msk | SCB_DTCMCR_RMW_Msk | SCB_DTCMCR_RETEN_Msk);\r
251   __DSB();\r
252   __ISB();\r
253 }\r
254 #endif\r
255 /**------------------------------------------------------------------------------\r
256  * This is the code that gets called on processor reset. To initialize the\r
257  * device.\r
258  *------------------------------------------------------------------------------*/\r
259 int __low_level_init(void)\r
260 {\r
261         uint32_t *pSrc = __section_begin(".intvec");        \r
262         SCB->VTOR = ((uint32_t) pSrc & SCB_VTOR_TBLOFF_Msk);\r
263 #ifdef ENABLE_TCM\r
264         //TCM_Enable();\r
265 #endif \r
266         LowLevelInit();\r
267         return 1; /* if return 0, the data sections will not be initialized */\r
268 }\r
269 \r
270 \r
271 /**\r
272  * \brief Default interrupt handler for unused IRQs.\r
273  */\r
274 void Dummy_Handler(void)\r
275 {\r
276         while (1) {\r
277         }\r
278 }\r
279 \r