]> git.sur5r.net Git - freertos/blob - FreeRTOS/Demo/CORTEX_ATSAM3X_Atmel_Studio/src/asf/sam/utils/cmsis/sam3x/source/templates/gcc/startup_sam3x.c
Add SAM3X-EK demo.
[freertos] / FreeRTOS / Demo / CORTEX_ATSAM3X_Atmel_Studio / src / asf / sam / utils / cmsis / sam3x / source / templates / gcc / startup_sam3x.c
1 /**\r
2  * \file\r
3  *\r
4  * \brief Startup file for SAM3X.\r
5  *\r
6  * Copyright (c) 2011-2012 Atmel Corporation. All rights reserved.\r
7  *\r
8  * \asf_license_start\r
9  *\r
10  * \page License\r
11  *\r
12  * Redistribution and use in source and binary forms, with or without\r
13  * modification, are permitted provided that the following conditions are met:\r
14  *\r
15  * 1. Redistributions of source code must retain the above copyright notice,\r
16  *    this list of conditions and the following disclaimer.\r
17  *\r
18  * 2. Redistributions in binary form must reproduce the above copyright notice,\r
19  *    this list of conditions and the following disclaimer in the documentation\r
20  *    and/or other materials provided with the distribution.\r
21  *\r
22  * 3. The name of Atmel may not be used to endorse or promote products derived\r
23  *    from this software without specific prior written permission.\r
24  *\r
25  * 4. This software may only be redistributed and used in connection with an\r
26  *    Atmel microcontroller product.\r
27  *\r
28  * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED\r
29  * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\r
30  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE\r
31  * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR\r
32  * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\r
33  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS\r
34  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)\r
35  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,\r
36  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN\r
37  * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\r
38  * POSSIBILITY OF SUCH DAMAGE.\r
39  *\r
40  * \asf_license_stop\r
41  *\r
42  */\r
43 \r
44 #include "exceptions.h"\r
45 #include "sam3xa.h"\r
46 #include "system_sam3x.h"\r
47 \r
48 /* Initialize segments */\r
49 extern uint32_t _sfixed;\r
50 extern uint32_t _efixed;\r
51 extern uint32_t _etext;\r
52 extern uint32_t _srelocate;\r
53 extern uint32_t _erelocate;\r
54 extern uint32_t _szero;\r
55 extern uint32_t _ezero;\r
56 extern uint32_t _sstack;\r
57 extern uint32_t _estack;\r
58 \r
59 /** \cond DOXYGEN_SHOULD_SKIP_THIS */\r
60 int main(void);\r
61 /** \endcond */\r
62 \r
63 void __libc_init_array(void);\r
64 \r
65 /* Exception Table */\r
66 __attribute__ ((section(".vectors")))\r
67 IntFunc exception_table[] = {\r
68 \r
69         /* Configure Initial Stack Pointer, using linker-generated symbols */\r
70         (IntFunc) (&_estack),\r
71         (void*) Reset_Handler,\r
72 \r
73         (void*) NMI_Handler,\r
74         (void*) HardFault_Handler,\r
75         (void*) MemManage_Handler,\r
76         (void*) BusFault_Handler,\r
77         (void*) UsageFault_Handler,\r
78         (void*) (0UL),           /* Reserved */\r
79         (void*) (0UL),           /* Reserved */\r
80         (void*) (0UL),           /* Reserved */\r
81         (void*) (0UL),           /* Reserved */\r
82         (void*) SVC_Handler,\r
83         (void*) DebugMon_Handler,\r
84         (void*) (0UL),           /* Reserved */\r
85         (void*) PendSV_Handler,\r
86         (void*) SysTick_Handler,\r
87 \r
88         /* Configurable interrupts */\r
89         (void*) SUPC_Handler,    /*  0  Supply Controller */\r
90         (void*) RSTC_Handler,    /*  1  Reset Controller */\r
91         (void*) RTC_Handler,     /*  2  Real Time Clock */\r
92         (void*) RTT_Handler,     /*  3  Real Time Timer */\r
93         (void*) WDT_Handler,     /*  4  Watchdog Timer */\r
94         (void*) PMC_Handler,     /*  5  PMC */\r
95         (void*) EFC0_Handler,    /*  6  EFC 0 */\r
96         (void*) EFC1_Handler,    /*  7  EFC 1 */\r
97         (void*) UART_Handler,    /*  8  UART */\r
98 #ifdef _SAM3XA_SMC_INSTANCE_\r
99         (void*) SMC_Handler,     /*  9  SMC */\r
100 #else\r
101         (void*) (0UL),           /*  9 Reserved */\r
102 #endif /* _SAM3XA_SMC_INSTANCE_ */\r
103 #ifdef _SAM3XA_SDRAMC_INSTANCE_\r
104         (void*) SDRAMC_Handler,  /* 10  SDRAMC */\r
105 #else\r
106         (void*) (0UL),           /* 10 Reserved */\r
107 #endif /* _SAM3XA_SDRAMC_INSTANCE_ */\r
108         (void*) PIOA_Handler,    /* 11 Parallel IO Controller A */\r
109         (void*) PIOB_Handler,    /* 12 Parallel IO Controller B */\r
110 #ifdef _SAM3XA_PIOC_INSTANCE_\r
111         (void*) PIOC_Handler,    /* 13 Parallel IO Controller C */\r
112 #else\r
113         (void*) (0UL),           /* 13 Reserved */\r
114 #endif /* _SAM3XA_PIOC_INSTANCE_ */\r
115 #ifdef _SAM3XA_PIOD_INSTANCE_\r
116         (void*) PIOD_Handler,    /* 14 Parallel IO Controller D */\r
117 #else\r
118         (void*) (0UL),           /* 14 Reserved */\r
119 #endif /* _SAM3XA_PIOD_INSTANCE_ */\r
120 #ifdef _SAM3XA_PIOE_INSTANCE_\r
121         (void*) PIOE_Handler,    /* 15 Parallel IO Controller E */\r
122 #else\r
123         (void*) (0UL),           /* 15 Reserved */\r
124 #endif /* _SAM3XA_PIOE_INSTANCE_ */\r
125 #ifdef _SAM3XA_PIOF_INSTANCE_\r
126         (void*) PIOF_Handler,    /* 16 Parallel IO Controller F */\r
127 #else\r
128         (void*) (0UL),           /* 16 Reserved */\r
129 #endif /* _SAM3XA_PIOF_INSTANCE_ */\r
130         (void*) USART0_Handler,  /* 17 USART 0 */\r
131         (void*) USART1_Handler,  /* 18 USART 1 */\r
132         (void*) USART2_Handler,  /* 19 USART 2 */\r
133 #ifdef _SAM3XA_USART3_INSTANCE_\r
134         (void*) USART3_Handler,  /* 20 USART 3 */\r
135 #else\r
136         (void*) (0UL),           /* 20 Reserved */\r
137 #endif /* _SAM3XA_USART3_INSTANCE_ */\r
138         (void*) HSMCI_Handler,   /* 21 MCI */\r
139         (void*) TWI0_Handler,    /* 22 TWI 0 */\r
140         (void*) TWI1_Handler,    /* 23 TWI 1 */\r
141         (void*) SPI0_Handler,    /* 24 SPI 0 */\r
142 #ifdef _SAM3XA_SPI1_INSTANCE_\r
143         (void*) SPI1_Handler,    /* 25 SPI 1 */\r
144 #else\r
145         (void*) (0UL),           /* 25 Reserved */\r
146 #endif /* _SAM3XA_SPI1_INSTANCE_ */\r
147         (void*) SSC_Handler,     /* 26 SSC */\r
148         (void*) TC0_Handler,     /* 27 Timer Counter 0 */\r
149         (void*) TC1_Handler,     /* 28 Timer Counter 1 */\r
150         (void*) TC2_Handler,     /* 29 Timer Counter 2 */\r
151         (void*) TC3_Handler,     /* 30 Timer Counter 3 */\r
152         (void*) TC4_Handler,     /* 31 Timer Counter 4 */\r
153         (void*) TC5_Handler,     /* 32 Timer Counter 5 */\r
154 #ifdef _SAM3XA_TC2_INSTANCE_\r
155         (void*) TC6_Handler,     /* 33 Timer Counter 6 */\r
156         (void*) TC7_Handler,     /* 34 Timer Counter 7 */\r
157         (void*) TC8_Handler,     /* 35 Timer Counter 8 */\r
158 #else\r
159         (void*) (0UL),           /* 33 Reserved */\r
160         (void*) (0UL),           /* 34 Reserved */\r
161         (void*) (0UL),           /* 35 Reserved */\r
162 #endif /* _SAM3XA_TC2_INSTANCE_ */\r
163         (void*) PWM_Handler,     /* 36 PWM */\r
164         (void*) ADC_Handler,     /* 37 ADC controller */\r
165         (void*) DACC_Handler,    /* 38 DAC controller */\r
166         (void*) DMAC_Handler,    /* 39 DMA Controller */\r
167         (void*) UOTGHS_Handler,  /* 40 USB OTG High Speed */\r
168         (void*) TRNG_Handler,    /* 41 True Random Number Generator */\r
169 #ifdef _SAM3XA_EMAC_INSTANCE_\r
170         (void*) EMAC_Handler,    /* 42 Ethernet MAC */\r
171 #else\r
172         (void*) (0UL),           /* 42 Reserved */\r
173 #endif /* _SAM3XA_EMAC_INSTANCE_ */\r
174         (void*) CAN0_Handler,    /* 43 CAN Controller 0 */\r
175         (void*) CAN1_Handler     /* 44 CAN Controller 1 */\r
176 };\r
177 \r
178 /* TEMPORARY PATCH FOR SCB */\r
179 #define SCB_VTOR_TBLBASE_Pos               29                            /*!< SCB VTOR: TBLBASE Position */\r
180 #define SCB_VTOR_TBLBASE_Msk               (1UL << SCB_VTOR_TBLBASE_Pos) /*!< SCB VTOR: TBLBASE Mask */\r
181 \r
182 /**\r
183  * \brief This is the code that gets called on processor reset.\r
184  * To initialize the device, and call the main() routine.\r
185  */\r
186 void Reset_Handler(void)\r
187 {\r
188         uint32_t *pSrc, *pDest;\r
189 \r
190         /* Initialize the relocate segment */\r
191         pSrc = &_etext;\r
192         pDest = &_srelocate;\r
193 \r
194         if (pSrc != pDest) {\r
195                 for (; pDest < &_erelocate;) {\r
196                         *pDest++ = *pSrc++;\r
197                 }\r
198         }\r
199 \r
200         /* Clear the zero segment */\r
201         for (pDest = &_szero; pDest < &_ezero;) {\r
202                 *pDest++ = 0;\r
203         }\r
204 \r
205         /* Set the vector table base address */\r
206         pSrc = (uint32_t *) & _sfixed;\r
207         SCB->VTOR = ((uint32_t) pSrc & SCB_VTOR_TBLOFF_Msk);\r
208 \r
209         if (((uint32_t) pSrc >= IRAM0_ADDR) && ((uint32_t) pSrc < NFC_RAM_ADDR)) {\r
210                 SCB->VTOR |= 1 << SCB_VTOR_TBLBASE_Pos;\r
211         }\r
212 \r
213         /* Initialize the C library */\r
214         __libc_init_array();\r
215 \r
216         /* Branch to main function */\r
217         main();\r
218 \r
219         /* Infinite loop */\r
220         while (1);\r
221 }\r