]> git.sur5r.net Git - freertos/blob - FreeRTOS/Demo/CORTEX_M7_SAMV71_Xplained/libboard_samv7-ek/resources/mdk/startup_sam.c
Update version number ready for V8.2.1 release.
[freertos] / FreeRTOS / Demo / CORTEX_M7_SAMV71_Xplained / libboard_samv7-ek / resources / mdk / 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 extern int Image$$ARM_LIB_STACK$$ZI$$Limit ;\r
36 extern int Image$$Vector_region$$Base ;\r
37 extern int Image$$Vector_region$$Limit ;\r
38 \r
39 extern void __main( void ) ;\r
40 static void Reset_Handler( void ) ;\r
41 \r
42 int __low_level_init(void);\r
43 \r
44 /* Default empty handler */\r
45 void Dummy_Handler(void);\r
46 void NMI_Handler(void);\r
47 \r
48 /* Cortex-M7 core handlers */\r
49 //#pragma weak NMI_Handler=Dummy_Handler\r
50 #pragma weak HardFault_Handler=Dummy_Handler\r
51 #pragma weak MemManage_Handler=Dummy_Handler\r
52 #pragma weak BusFault_Handler=Dummy_Handler\r
53 #pragma weak UsageFault_Handler=Dummy_Handler\r
54 #pragma weak SVC_Handler=Dummy_Handler\r
55 #pragma weak DebugMon_Handler=Dummy_Handler\r
56 #pragma weak PendSV_Handler=Dummy_Handler\r
57 #pragma weak SysTick_Handler=Dummy_Handler\r
58 \r
59 /* Peripherals handlers */\r
60 #pragma weak SUPC_Handler=Dummy_Handler\r
61 #pragma weak RSTC_Handler=Dummy_Handler\r
62 #pragma weak RTC_Handler=Dummy_Handler\r
63 #pragma weak RTT_Handler=Dummy_Handler\r
64 #pragma weak WDT0_Handler=Dummy_Handler\r
65 #pragma weak PMC_Handler=Dummy_Handler\r
66 #pragma weak EFC_Handler=Dummy_Handler\r
67 #pragma weak UART0_Handler=Dummy_Handler\r
68 #pragma weak UART1_Handler=Dummy_Handler\r
69 #pragma weak PIOA_Handler=Dummy_Handler\r
70 #pragma weak PIOB_Handler=Dummy_Handler\r
71 #ifdef _SAM_PIOC_INSTANCE_\r
72 #pragma weak PIOC_Handler=Dummy_Handler\r
73 #endif /* _SAM_PIOC_INSTANCE_ */\r
74 #pragma weak USART0_Handler=Dummy_Handler\r
75 #pragma weak USART1_Handler=Dummy_Handler\r
76 #pragma weak USART2_Handler=Dummy_Handler\r
77 #pragma weak PIOD_Handler=Dummy_Handler\r
78 #ifdef _SAM_PIOE_INSTANCE_\r
79 #pragma weak PIOE_Handler=Dummy_Handler\r
80 #endif /* _SAM_PIOE_INSTANCE_ */\r
81 #ifdef _SAM_HSMCI_INSTANCE_\r
82 #pragma weak HSMCI_Handler=Dummy_Handler\r
83 #endif /* _SAM_HSMCI_INSTANCE_ */\r
84 #pragma weak TWI0_Handler=Dummy_Handler\r
85 #pragma weak TWI1_Handler=Dummy_Handler\r
86 #pragma weak SPI0_Handler=Dummy_Handler\r
87 #pragma weak SSC_Handler=Dummy_Handler\r
88 #pragma weak TC0_Handler=Dummy_Handler\r
89 #pragma weak TC1_Handler=Dummy_Handler\r
90 #pragma weak TC2_Handler=Dummy_Handler\r
91 #ifdef _SAM_TC1_INSTANCE_\r
92 #pragma weak TC3_Handler=Dummy_Handler\r
93 #endif /* _SAM_TC1_INSTANCE_ */\r
94 #ifdef _SAM_TC1_INSTANCE_\r
95 #pragma weak TC4_Handler=Dummy_Handler\r
96 #endif /* _SAM_TC1_INSTANCE_ */\r
97 #ifdef _SAM_TC1_INSTANCE_\r
98 #pragma weak TC5_Handler=Dummy_Handler\r
99 #endif /* _SAM_TC1_INSTANCE_ */\r
100 #pragma weak AFEC0_Handler=Dummy_Handler\r
101 #ifdef _SAM_DACC_INSTANCE_\r
102 #pragma weak DACC_Handler=Dummy_Handler\r
103 #endif /* _SAM_DACC_INSTANCE_ */\r
104 #pragma weak PWM0_Handler=Dummy_Handler\r
105 #pragma weak ICM_Handler=Dummy_Handler\r
106 #pragma weak ACC_Handler=Dummy_Handler\r
107 #pragma weak USBHS_Handler=Dummy_Handler\r
108 #pragma weak CAN0_Handler=Dummy_Handler\r
109 #pragma weak CAN1_Handler=Dummy_Handler\r
110 #pragma weak GMAC_Handler=Dummy_Handler\r
111 #pragma weak GMACQ1_Handler=Dummy_Handler\r
112 #pragma weak GMACQ2_Handler=Dummy_Handler\r
113 #pragma weak AFEC1_Handler=Dummy_Handler\r
114 #ifdef _SAM_TWI2_INSTANCE_\r
115 #pragma weak TWI2_Handler=Dummy_Handler\r
116 #endif /* _SAM_TWI2_INSTANCE_ */\r
117 #pragma weak SPI1_Handler=Dummy_Handler\r
118 #pragma weak QSPI_Handler=Dummy_Handler\r
119 #pragma weak UART2_Handler=Dummy_Handler\r
120 #pragma weak UART3_Handler=Dummy_Handler\r
121 #pragma weak UART4_Handler=Dummy_Handler\r
122 #ifdef _SAM_TC2_INSTANCE_\r
123 #pragma weak TC6_Handler=Dummy_Handler\r
124 #endif /* _SAM_TC2_INSTANCE_ */\r
125 #ifdef _SAM_TC2_INSTANCE_\r
126 #pragma weak TC7_Handler=Dummy_Handler\r
127 #endif /* _SAM_TC2_INSTANCE_ */\r
128 #ifdef _SAM_TC2_INSTANCE_\r
129 #pragma weak TC8_Handler=Dummy_Handler\r
130 #endif /* _SAM_TC2_INSTANCE_ */\r
131 #pragma weak TC9_Handler=Dummy_Handler\r
132 #pragma weak TC10_Handler=Dummy_Handler\r
133 #pragma weak TC11_Handler=Dummy_Handler\r
134 #pragma weak MLB_Handler=Dummy_Handler\r
135 #pragma weak AES_Handler=Dummy_Handler\r
136 #pragma weak TRNG_Handler=Dummy_Handler\r
137 #pragma weak XDMAC_Handler=Dummy_Handler\r
138 #pragma weak ISI_Handler=Dummy_Handler\r
139 #pragma weak PWM1_Handler=Dummy_Handler\r
140 #pragma weak FPU_Handler=Dummy_Handler\r
141 #ifdef _SAM_SDRAMC_INSTANCE_\r
142 #pragma weak SDRAMC_Handler=Dummy_Handler\r
143 #endif /* _SAM_SDRAMC_INSTANCE_ */\r
144 #pragma weak WDT1_Handler=Dummy_Handler\r
145 #pragma weak CCF_Handler=Dummy_Handler\r
146 #pragma weak CCW_Handler=Dummy_Handler\r
147 \r
148 \r
149 /* The name "__vector_table" has special meaning for C-SPY: */\r
150 /* it is where the SP start value is found, and the NVIC vector */\r
151 /* table register (VTOR) is initialized to this address if != 0 */\r
152 #pragma arm section rodata = "vectors"\r
153 const intvec_elem __vector_table[] =\r
154 {\r
155     (intfunc)&Image$$ARM_LIB_STACK$$ZI$$Limit,\r
156     Reset_Handler,\r
157     NMI_Handler,\r
158           HardFault_Handler,\r
159     MemManage_Handler,\r
160           BusFault_Handler,\r
161     UsageFault_Handler,\r
162     (0UL), (0UL), (0UL), (0UL),          /* Reserved */\r
163     SVC_Handler,\r
164     DebugMon_Handler,\r
165     (0UL),          /* Reserved */\r
166     PendSV_Handler,\r
167     SysTick_Handler,\r
168 \r
169     SUPC_Handler,   /* 0  Supply Controller */\r
170     RSTC_Handler,   /* 1  Reset Controller */\r
171     RTC_Handler,    /* 2  Real Time Clock */\r
172     RTT_Handler,    /* 3  Real Time Timer */\r
173     WDT0_Handler,   /* 4  Watchdog Timer 0 */\r
174     PMC_Handler,    /* 5  Power Management Controller */\r
175     EFC_Handler,    /* 6  Enhanced Embedded Flash Controller */\r
176     UART0_Handler,  /* 7  UART 0 */\r
177     UART1_Handler,  /* 8  UART 1 */\r
178     (0UL),          /* 9  Reserved */\r
179     PIOA_Handler,   /* 10 Parallel I/O Controller A */\r
180     PIOB_Handler,   /* 11 Parallel I/O Controller B */\r
181     PIOC_Handler,   /* 12 Parallel I/O Controller C */\r
182     USART0_Handler, /* 13 USART 0 */\r
183     USART1_Handler, /* 14 USART 1 */\r
184     USART2_Handler, /* 15 USART 2 */\r
185     PIOD_Handler,   /* 16 Parallel I/O Controller D */\r
186     PIOE_Handler,   /* 17 Parallel I/O Controller E */    \r
187     HSMCI_Handler,  /* 18 Multimedia Card Interface */\r
188     TWI0_Handler,   /* 19 Two Wire Interface 0 HS */\r
189     TWI1_Handler,   /* 20 Two Wire Interface 1 HS */\r
190     SPI0_Handler,   /* 21 Serial Peripheral Interface 0 */\r
191     SSC_Handler,    /* 22 Synchronous Serial Controller */\r
192     TC0_Handler,    /* 23 Timer/Counter 0 */\r
193     TC1_Handler,    /* 24 Timer/Counter 1 */\r
194     TC2_Handler,    /* 25 Timer/Counter 2 */\r
195     TC3_Handler,    /* 26 Timer/Counter 3 */\r
196     TC4_Handler,    /* 27 Timer/Counter 4 */\r
197     TC5_Handler,    /* 28 Timer/Counter 5 */\r
198     AFEC0_Handler,  /* 29 Analog Front End 0 */\r
199     DACC_Handler,   /* 30 Digital To Analog Converter */\r
200     PWM0_Handler,   /* 31 Pulse Width Modulation 0 */\r
201     ICM_Handler,    /* 32 Integrity Check Monitor */\r
202     ACC_Handler,    /* 33 Analog Comparator */\r
203     USBHS_Handler,  /* 34 USB Host / Device Controller */\r
204     CAN0_Handler,   /* 35 CAN Controller 0 */\r
205     (0UL),          /* 36 Reserved */\r
206     CAN1_Handler,   /* 37 CAN Controller 1 */\r
207     (0UL),          /* 38 Reserved */\r
208     GMAC_Handler,   /* 39 Ethernet MAC */\r
209     AFEC1_Handler,  /* 40 Analog Front End 1 */\r
210     TWI2_Handler,   /* 41 Two Wire Interface 2 HS */\r
211     SPI1_Handler,   /* 42 Serial Peripheral Interface 1 */\r
212     QSPI_Handler,   /* 43 Quad I/O Serial Peripheral Interface */\r
213     UART2_Handler,  /* 44 UART 2 */\r
214     UART3_Handler,  /* 45 UART 3 */\r
215     UART4_Handler,  /* 46 UART 4 */\r
216     TC6_Handler,    /* 47 Timer/Counter 6 */\r
217     TC7_Handler,    /* 48 Timer/Counter 7 */\r
218     TC8_Handler,    /* 49 Timer/Counter 8 */\r
219     TC9_Handler,    /* 50 Timer/Counter 9 */\r
220     TC10_Handler,   /* 51 Timer/Counter 10 */\r
221     TC11_Handler,   /* 52 Timer/Counter 11 */\r
222     MLB_Handler,    /* 53 MediaLB */\r
223     (0UL),          /* 54 Reserved */\r
224     (0UL),          /* 55 Reserved */\r
225     AES_Handler,    /* 56 AES */\r
226     TRNG_Handler,   /* 57 True Random Generator */\r
227     XDMAC_Handler,  /* 58 DMA */\r
228     ISI_Handler,    /* 59 Camera Interface */\r
229     PWM1_Handler,   /* 60 Pulse Width Modulation 1 */\r
230     FPU_Handler,    /* 61 Floating Point Unit */\r
231     SDRAMC_Handler, /* 62 SDRAM Controller */\r
232     WDT1_Handler,   /* 63 Watchdog Timer 1 */\r
233     CCW_Handler,    /* 64 ARM Cache ECC Warning */\r
234     CCF_Handler,    /* 65 ARM Cache ECC Fault */\r
235     GMACQ1_Handler, /* 66 GMAC Queue 1 Handler */\r
236     GMACQ2_Handler  /* 67 GMAC Queue 2 Handler */\r
237 };\r
238 #pragma arm section\r
239 \r
240 \r
241 void LowLevelInit(void);\r
242 /**------------------------------------------------------------------------------\r
243  * This is the code that gets called on processor reset. To initialize the\r
244  * device.\r
245  *------------------------------------------------------------------------------*/\r
246 int __low_level_init(void)\r
247 {\r
248 //        uint32_t *pSrc = __section_begin(".intvec");\r
249         LowLevelInit();\r
250 //        SCB->VTOR = ((uint32_t) pSrc & SCB_VTOR_TBLOFF_Msk);\r
251         \r
252         SCB_EnableICache();        \r
253         SCB_EnableDCache();\r
254         \r
255         \r
256         \r
257         return 1; /* if return 0, the data sections will not be initialized */\r
258 }\r
259 \r
260 /** \brief  TCM memory enable\r
261 \r
262     The function enables TCM memories\r
263  */\r
264 \r
265 /* Correct errors in early version core_cm7.h */\r
266 #undef SCB_ITCMCR_RETEN_Msk\r
267 #undef SCB_ITCMCR_RMW_Msk\r
268 #undef SCB_ITCMCR_EN_Msk\r
269 #define SCB_ITCMCR_RETEN_Msk               (0x1FFUL << SCB_ITCMCR_RETEN_Pos)                /*!< SCB ITCMCR: RETEN Mask */\r
270 #define SCB_ITCMCR_RMW_Msk                 (0x1FFUL << SCB_ITCMCR_RMW_Pos)                  /*!< SCB ITCMCR: RMW Mask */\r
271 #define SCB_ITCMCR_EN_Msk                  (0x1FFUL << SCB_ITCMCR_EN_Pos)                   /*!< SCB ITCMCR: EN Mask */\r
272 \r
273 \r
274 __STATIC_INLINE void TCM_Enable(void) \r
275 {\r
276 \r
277   __DSB();\r
278   __ISB();\r
279   SCB->ITCMCR = ( SCB_ITCMCR_EN_Msk | SCB_ITCMCR_RMW_Msk | SCB_ITCMCR_RETEN_Msk);\r
280   SCB->DTCMCR = ( SCB_DTCMCR_EN_Msk | SCB_DTCMCR_RMW_Msk | SCB_DTCMCR_RETEN_Msk);\r
281   __DSB();\r
282   __ISB();\r
283 }\r
284 \r
285 /**------------------------------------------------------------------------------\r
286  * This is the code that gets called on processor reset. To initialize the\r
287  * device.\r
288  *------------------------------------------------------------------------------*/\r
289 void Reset_Handler(void)\r
290 {\r
291     uint32_t *pSrc = (uint32_t*)&Image$$Vector_region$$Base ;\r
292 \r
293     /* Low level Initialize */\r
294     LowLevelInit() ;\r
295                 SCB->VTOR = ((uint32_t) pSrc & SCB_VTOR_TBLOFF_Msk);\r
296 \r
297     SCB_EnableICache();        \r
298     SCB_EnableDCache(); \r
299 \r
300     /* Branch to main function */\r
301     __main() ;\r
302 \r
303         /* Will not execute, but removes warning about TCM_Enable() not being called. */\r
304         ( void ) TCM_Enable;\r
305 \r
306     /* Infinite loop */\r
307     while ( 1 ) ;\r
308 }\r
309 \r
310 /**\r
311  * \brief Default interrupt handler for unused IRQs.\r
312  */\r
313 void Dummy_Handler(void)\r
314 {\r
315         while (1) {\r
316         }\r
317 }\r
318 \r
319 void NMI_Handler(void)\r
320 {\r
321         while (1) {\r
322         }\r
323 }\r