SAMV71 Xplained Ultra Software Package 1.3

startup_sam.c

00001 /* ----------------------------------------------------------------------------
00002  *         SAM Software Package License
00003  * ----------------------------------------------------------------------------
00004  * Copyright (c) 2011, Atmel Corporation
00005  *
00006  * All rights reserved.
00007  *
00008  * Redistribution and use in source and binary forms, with or without
00009  * modification, are permitted provided that the following conditions are met:
00010  *
00011  * - Redistributions of source code must retain the above copyright notice,
00012  * this list of conditions and the disclaimer below.
00013  *
00014  * Atmel's name may not be used to endorse or promote products derived from
00015  * this software without specific prior written permission.
00016  *
00017  * DISCLAIMER: THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR
00018  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
00019  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE
00020  * DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR ANY DIRECT, INDIRECT,
00021  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
00022  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
00023  * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
00024  * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
00025  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
00026  * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
00027  * ----------------------------------------------------------------------------
00028  */
00029 
00030 
00031 #include "samv71.h"
00032 
00033 /* Initialize segments */
00034 extern uint32_t _sfixed;
00035 extern uint32_t _efixed;
00036 extern uint32_t _etext;
00037 extern uint32_t _srelocate;
00038 extern uint32_t _erelocate;
00039 extern uint32_t _szero;
00040 extern uint32_t _ezero;
00041 extern uint32_t _sstack;
00042 extern uint32_t _estack;
00043 
00044 /** \cond DOXYGEN_SHOULD_SKIP_THIS */
00045 int main(void);
00046 /** \endcond */
00047 
00048 void __libc_init_array(void);
00049 void LowLevelInit(void);
00050 
00051 
00052 /* Default empty handler */
00053 void Dummy_Handler(void);
00054 
00055 #pragma weak NMI_Handler=Dummy_Handler
00056 #pragma weak HardFault_Handler=Dummy_Handler
00057 #pragma weak MemManage_Handler=Dummy_Handler
00058 #pragma weak BusFault_Handler=Dummy_Handler
00059 #pragma weak UsageFault_Handler=Dummy_Handler
00060 #pragma weak SVC_Handler=Dummy_Handler
00061 #pragma weak DebugMon_Handler=Dummy_Handler
00062 #pragma weak PendSV_Handler=Dummy_Handler
00063 #pragma weak SysTick_Handler=Dummy_Handler
00064 
00065 /* Peripherals handlers */
00066 #pragma weak SUPC_Handler=Dummy_Handler
00067 #pragma weak RSTC_Handler=Dummy_Handler
00068 #pragma weak RTC_Handler=Dummy_Handler
00069 #pragma weak RTT_Handler=Dummy_Handler
00070 #pragma weak WDT_Handler=Dummy_Handler
00071 #pragma weak PMC_Handler=Dummy_Handler
00072 #pragma weak EFC_Handler=Dummy_Handler
00073 #pragma weak UART0_Handler=Dummy_Handler
00074 #pragma weak UART1_Handler=Dummy_Handler
00075 #pragma weak PIOA_Handler=Dummy_Handler
00076 #pragma weak PIOB_Handler=Dummy_Handler
00077 #ifdef _SAMV71_PIOC_INSTANCE_
00078 #pragma weak PIOC_Handler=Dummy_Handler
00079 #endif /* _SAM_PIOC_INSTANCE_ */
00080 #pragma weak USART0_Handler=Dummy_Handler
00081 #pragma weak USART1_Handler=Dummy_Handler
00082 #pragma weak USART2_Handler=Dummy_Handler
00083 #pragma weak PIOD_Handler=Dummy_Handler
00084 #ifdef _SAMV71_PIOE_INSTANCE_
00085 #pragma weak PIOE_Handler=Dummy_Handler
00086 #endif /* _SAM_PIOE_INSTANCE_ */
00087 #ifdef _SAMV71_HSMCI_INSTANCE_
00088 #pragma weak HSMCI_Handler=Dummy_Handler
00089 #endif /* _SAM_HSMCI_INSTANCE_ */
00090 #pragma weak TWIHS0_Handler=Dummy_Handler
00091 #pragma weak TWIHS1_Handler=Dummy_Handler
00092 #pragma weak SPI0_Handler=Dummy_Handler
00093 #pragma weak SSC_Handler=Dummy_Handler
00094 #pragma weak TC0_Handler=Dummy_Handler
00095 #pragma weak TC1_Handler=Dummy_Handler
00096 #pragma weak TC2_Handler=Dummy_Handler
00097 #ifdef _SAMV71_TC1_INSTANCE_
00098 #pragma weak TC3_Handler=Dummy_Handler
00099 #endif /* _SAM_TC1_INSTANCE_ */
00100 #ifdef _SAMV71_TC1_INSTANCE_
00101 #pragma weak TC4_Handler=Dummy_Handler
00102 #endif /* _SAM_TC1_INSTANCE_ */
00103 #ifdef _SAMV71_TC1_INSTANCE_
00104 #pragma weak TC5_Handler=Dummy_Handler
00105 #endif /* _SAM_TC1_INSTANCE_ */
00106 #pragma weak AFEC0_Handler=Dummy_Handler
00107 #ifdef _SAMV71_DACC_INSTANCE_
00108 #pragma weak DACC_Handler=Dummy_Handler
00109 #endif /* _SAM_DACC_INSTANCE_ */
00110 #pragma weak PWM0_Handler=Dummy_Handler
00111 #pragma weak ICM_Handler=Dummy_Handler
00112 #pragma weak ACC_Handler=Dummy_Handler
00113 #pragma weak USBHS_Handler=Dummy_Handler
00114 #pragma weak MCAN0_Handler=Dummy_Handler
00115 #pragma weak MCAN0_Line1_Handler=Dummy_Handler
00116 #pragma weak MCAN1_Handler=Dummy_Handler
00117 #pragma weak MCAN1_Line1_Handler=Dummy_Handler
00118 #pragma weak GMAC_Handler=Dummy_Handler
00119 #pragma weak GMACQ1_Handler=Dummy_Handler
00120 #pragma weak GMACQ2_Handler=Dummy_Handler
00121 #pragma weak AFEC1_Handler=Dummy_Handler
00122 #ifdef _SAMV71_TWIHS2_INSTANCE_
00123 #pragma weak TWIHS2_Handler=Dummy_Handler
00124 #endif /* _SAM_TWI2_INSTANCE_ */
00125 #pragma weak SPI1_Handler=Dummy_Handler
00126 #pragma weak QSPI_Handler=Dummy_Handler
00127 #pragma weak UART2_Handler=Dummy_Handler
00128 #pragma weak UART3_Handler=Dummy_Handler
00129 #pragma weak UART4_Handler=Dummy_Handler
00130 #ifdef _SAMV71_TC2_INSTANCE_
00131 #pragma weak TC6_Handler=Dummy_Handler
00132 #endif /* _SAM_TC2_INSTANCE_ */
00133 #ifdef _SAMV71_TC2_INSTANCE_
00134 #pragma weak TC7_Handler=Dummy_Handler
00135 #endif /* _SAM_TC2_INSTANCE_ */
00136 #ifdef _SAMV71_TC2_INSTANCE_
00137 #pragma weak TC8_Handler=Dummy_Handler
00138 #endif /* _SAM_TC2_INSTANCE_ */
00139 #pragma weak TC9_Handler=Dummy_Handler
00140 #pragma weak TC10_Handler=Dummy_Handler
00141 #pragma weak TC11_Handler=Dummy_Handler
00142 #pragma weak MLB_Handler=Dummy_Handler
00143 #pragma weak AES_Handler=Dummy_Handler
00144 #pragma weak TRNG_Handler=Dummy_Handler
00145 #pragma weak XDMAC_Handler=Dummy_Handler
00146 #pragma weak ISI_Handler=Dummy_Handler
00147 #pragma weak PWM1_Handler=Dummy_Handler
00148 #pragma weak FPU_Handler=Dummy_Handler
00149 #ifdef _SAMV71_SDRAMC_INSTANCE_
00150 #pragma weak SDRAMC_Handler=Dummy_Handler
00151 #endif /* _SAM_SDRAMC_INSTANCE_ */
00152 #pragma weak RSWDT_Handler=Dummy_Handler
00153 #pragma weak CCF_Handler=Dummy_Handler
00154 #pragma weak CCW_Handler=Dummy_Handler
00155 
00156 
00157 /* Exception Table */
00158 __attribute__ ((section(".vectors")))
00159 const DeviceVectors exception_table = {
00160 
00161         /* Configure Initial Stack Pointer, using linker-generated symbols */
00162         .pvStack = (void*) (&_estack),
00163 
00164         .pfnReset_Handler      = (void*) Reset_Handler,
00165         .pfnNMI_Handler        = (void*) NMI_Handler,
00166         .pfnHardFault_Handler  = (void*) HardFault_Handler,
00167         .pfnMemManage_Handler  = (void*) MemManage_Handler,
00168         .pfnBusFault_Handler   = (void*) BusFault_Handler,
00169         .pfnUsageFault_Handler = (void*) UsageFault_Handler,
00170         .pfnReserved1_Handler  = (void*) (0UL),          /* Reserved */
00171         .pfnReserved2_Handler  = (void*) (0UL),          /* Reserved */
00172         .pfnReserved3_Handler  = (void*) (0UL),          /* Reserved */
00173         .pfnReserved4_Handler  = (void*) (0UL),          /* Reserved */
00174         .pfnSVC_Handler        = (void*) SVC_Handler,
00175         .pfnDebugMon_Handler   = (void*) DebugMon_Handler,
00176         .pfnReserved5_Handler  = (void*) (0UL),          /* Reserved */
00177         .pfnPendSV_Handler     = (void*) PendSV_Handler,
00178         .pfnSysTick_Handler    = (void*) SysTick_Handler,
00179 
00180         /* Configurable interrupts */
00181         .pfnSUPC_Handler   = (void*) SUPC_Handler,   /* 0  Supply Controller */
00182         .pfnRSTC_Handler   = (void*) RSTC_Handler,   /* 1  Reset Controller */
00183         .pfnRTC_Handler    = (void*) RTC_Handler,    /* 2  Real Time Clock */
00184         .pfnRTT_Handler    = (void*) RTT_Handler,    /* 3  Real Time Timer */
00185         .pfnWDT_Handler    = (void*) WDT_Handler,    /* 4  Watchdog Timer 0 */
00186         .pfnPMC_Handler    = (void*) PMC_Handler,    /* 5  Power Management Controller */
00187         .pfnEFC_Handler    = (void*) EFC_Handler,    /* 6  Enhanced Embedded Flash Controller */
00188         .pfnUART0_Handler  = (void*) UART0_Handler,  /* 7  UART 0 */
00189         .pfnUART1_Handler  = (void*) UART1_Handler,  /* 8  UART 1 */
00190         .pvReserved9       = (void*) (0UL),          /* 9  Reserved */
00191         .pfnPIOA_Handler   = (void*) PIOA_Handler,   /* 10 Parallel I/O Controller A */
00192         .pfnPIOB_Handler   = (void*) PIOB_Handler,   /* 11 Parallel I/O Controller B */
00193 #ifdef _SAMV71_PIOC_INSTANCE_
00194         .pfnPIOC_Handler   = (void*) PIOC_Handler,   /* 12 Parallel I/O Controller C */
00195 #else
00196         .pvReserved12      = (void*) (0UL),          /* 12 Reserved */
00197 #endif /* _SAMV71_PIOC_INSTANCE_ */
00198         .pfnUSART0_Handler = (void*) USART0_Handler, /* 13 USART 0 */
00199         .pfnUSART1_Handler = (void*) USART1_Handler, /* 14 USART 1 */
00200         .pfnUSART2_Handler = (void*) USART2_Handler, /* 15 USART 2 */
00201         .pfnPIOD_Handler   = (void*) PIOD_Handler,   /* 16 Parallel I/O Controller D */
00202 #ifdef _SAMV71_PIOE_INSTANCE_
00203         .pfnPIOE_Handler   = (void*) PIOE_Handler,   /* 17 Parallel I/O Controller E */
00204 #else
00205         .pvReserved17      = (void*) (0UL),          /* 17 Reserved */
00206 #endif /* _SAMV71_PIOE_INSTANCE_ */
00207 #ifdef _SAMV71_HSMCI_INSTANCE_
00208         .pfnHSMCI_Handler  = (void*) HSMCI_Handler,  /* 18 Multimedia Card Interface */
00209 #else
00210         .pvReserved18      = (void*) (0UL),          /* 18 Reserved */
00211 #endif /* _SAMV71_HSMCI_INSTANCE_ */
00212         .pfnTWIHS0_Handler = (void*) TWIHS0_Handler, /* 19 Two Wire Interface 0 HS */
00213         .pfnTWIHS1_Handler = (void*) TWIHS1_Handler, /* 20 Two Wire Interface 1 HS */
00214         .pfnSPI0_Handler   = (void*) SPI0_Handler,   /* 21 Serial Peripheral Interface 0 */
00215         .pfnSSC_Handler    = (void*) SSC_Handler,    /* 22 Synchronous Serial Controller */
00216         .pfnTC0_Handler    = (void*) TC0_Handler,    /* 23 Timer/Counter 0 */
00217         .pfnTC1_Handler    = (void*) TC1_Handler,    /* 24 Timer/Counter 1 */
00218         .pfnTC2_Handler    = (void*) TC2_Handler,    /* 25 Timer/Counter 2 */
00219 #ifdef _SAMV71_TC1_INSTANCE_
00220         .pfnTC3_Handler    = (void*) TC3_Handler,    /* 26 Timer/Counter 3 */
00221 #else
00222         .pvReserved26      = (void*) (0UL),          /* 26 Reserved */
00223 #endif /* _SAMV71_TC1_INSTANCE_ */
00224 #ifdef _SAMV71_TC1_INSTANCE_
00225         .pfnTC4_Handler    = (void*) TC4_Handler,    /* 27 Timer/Counter 4 */
00226 #else
00227         .pvReserved27      = (void*) (0UL),          /* 27 Reserved */
00228 #endif /* _SAMV71_TC1_INSTANCE_ */
00229 #ifdef _SAMV71_TC1_INSTANCE_
00230         .pfnTC5_Handler    = (void*) TC5_Handler,    /* 28 Timer/Counter 5 */
00231 #else
00232         .pvReserved28      = (void*) (0UL),          /* 28 Reserved */
00233 #endif /* _SAMV71_TC1_INSTANCE_ */
00234         .pfnAFEC0_Handler  = (void*) AFEC0_Handler,  /* 29 Analog Front End 0 */
00235 #ifdef _SAMV71_DACC_INSTANCE_
00236         .pfnDACC_Handler   = (void*) DACC_Handler,   /* 30 Digital To Analog Converter */
00237 #else
00238         .pvReserved30      = (void*) (0UL),          /* 30 Reserved */
00239 #endif /* _SAMV71_DACC_INSTANCE_ */
00240         .pfnPWM0_Handler   = (void*) PWM0_Handler,   /* 31 Pulse Width Modulation 0 */
00241         .pfnICM_Handler    = (void*) ICM_Handler,    /* 32 Integrity Check Monitor */
00242         .pfnACC_Handler    = (void*) ACC_Handler,    /* 33 Analog Comparator */
00243         .pfnUSBHS_Handler  = (void*) USBHS_Handler,  /* 34 USB Host / Device Controller */
00244         .pfnMCAN0_Handler  = (void*) MCAN0_Handler,  /* 35 CAN Controller 0 */
00245         .pfnMCAN0_Line1_Handler = (void*) MCAN0_Line1_Handler, /* 36 CAN Controller 0 - Line 1  */
00246         .pfnMCAN1_Handler  = (void*) MCAN1_Handler,  /* 37 CAN Controller 1 */
00247         .pfnMCAN1_Line1_Handler = (void*) MCAN1_Line1_Handler, /* 38 CAN Controller 1 - Line 1  */
00248         .pfnGMAC_Handler   = (void*) GMAC_Handler,   /* 39 Ethernet MAC */
00249         .pfnAFEC1_Handler  = (void*) AFEC1_Handler,  /* 40 Analog Front End 1 */
00250 #ifdef _SAMV71_TWIHS2_INSTANCE_
00251         .pfnTWIHS2_Handler = (void*) TWIHS2_Handler, /* 41 Two Wire Interface 2 HS */
00252 #else
00253         .pvReserved41      = (void*) (0UL),          /* 41 Reserved */
00254 #endif /* _SAMV71_TWI2_INSTANCE_ */
00255         .pfnSPI1_Handler   = (void*) SPI1_Handler,   /* 42 Serial Peripheral Interface 1 */
00256         .pfnQSPI_Handler   = (void*) QSPI_Handler,   /* 43 Quad I/O Serial Peripheral Interface */
00257         .pfnUART2_Handler  = (void*) UART2_Handler,  /* 44 UART 2 */
00258         .pfnUART3_Handler  = (void*) UART3_Handler,  /* 45 UART 3 */
00259         .pfnUART4_Handler  = (void*) UART4_Handler,  /* 46 UART 4 */
00260 #ifdef _SAMV71_TC2_INSTANCE_
00261         .pfnTC6_Handler    = (void*) TC6_Handler,    /* 47 Timer/Counter 6 */
00262 #else
00263         .pvReserved47      = (void*) (0UL),          /* 47 Reserved */
00264 #endif /* _SAMV71_TC2_INSTANCE_ */
00265 #ifdef _SAMV71_TC2_INSTANCE_
00266         .pfnTC7_Handler    = (void*) TC7_Handler,    /* 48 Timer/Counter 7 */
00267 #else
00268         .pvReserved48      = (void*) (0UL),          /* 48 Reserved */
00269 #endif /* _SAMV71_TC2_INSTANCE_ */
00270 #ifdef _SAMV71_TC2_INSTANCE_
00271         .pfnTC8_Handler    = (void*) TC8_Handler,    /* 49 Timer/Counter 8 */
00272 #else
00273         .pvReserved49      = (void*) (0UL),          /* 49 Reserved */
00274 #endif /* _SAMV71_TC2_INSTANCE_ */
00275         .pfnTC9_Handler    = (void*) TC9_Handler,    /* 50 Timer/Counter 9 */
00276         .pfnTC10_Handler   = (void*) TC10_Handler,   /* 51 Timer/Counter 10 */
00277         .pfnTC11_Handler   = (void*) TC11_Handler,   /* 52 Timer/Counter 11 */
00278         .pfnMLB_Handler    = (void*) MLB_Handler,    /* 53 MediaLB */
00279         .pvReserved54      = (void*) (0UL),          /* 54 Reserved */
00280         .pvReserved55      = (void*) (0UL),          /* 55 Reserved */
00281         .pfnAES_Handler    = (void*) AES_Handler,    /* 56 AES */
00282         .pfnTRNG_Handler   = (void*) TRNG_Handler,   /* 57 True Random Generator */
00283         .pfnXDMAC_Handler  = (void*) XDMAC_Handler,  /* 58 DMA */
00284         .pfnISI_Handler    = (void*) ISI_Handler,    /* 59 Camera Interface */
00285         .pfnPWM1_Handler   = (void*) PWM1_Handler,   /* 60 Pulse Width Modulation 1 */
00286         .pvReserved61      = (void*) (0UL),          /* 61 Reserved */
00287 #ifdef _SAMV71_SDRAMC_INSTANCE_
00288         .pfnSDRAMC_Handler = (void*) SDRAMC_Handler, /* 62 SDRAM Controller */
00289 #else
00290         .pvReserved62      = (void*) (0UL),          /* 62 Reserved */
00291 #endif /* _SAMV71_SDRAMC_INSTANCE_ */
00292         .pfnRSWDT_Handler   = (void*) RSWDT_Handler    /* 63 Watchdog Timer 1 */
00293 };
00294 
00295 
00296 #ifdef ENABLE_TCM 
00297 /** \brief  TCM memory enable
00298 
00299     The function enables TCM memories
00300  */
00301 __STATIC_INLINE void TCM_Enable(void) 
00302 {
00303 
00304     __DSB();
00305     __ISB();
00306     SCB->ITCMCR = (SCB_ITCMCR_EN_Msk  | SCB_ITCMCR_RMW_Msk 
00307                     | SCB_ITCMCR_RETEN_Msk);
00308     SCB->DTCMCR = ( SCB_DTCMCR_EN_Msk | SCB_DTCMCR_RMW_Msk 
00309                     | SCB_DTCMCR_RETEN_Msk);
00310     __DSB();
00311     __ISB();
00312 }
00313 #endif
00314 
00315 /** \brief  TCM memory Disable
00316 
00317     The function enables TCM memories
00318  */
00319 __STATIC_INLINE void TCM_Disable(void) 
00320 {
00321 
00322     __DSB();
00323     __ISB();
00324     SCB->ITCMCR &= ~(uint32_t)SCB_ITCMCR_EN_Msk;
00325     SCB->DTCMCR &= ~(uint32_t)SCB_ITCMCR_EN_Msk;
00326     __DSB();
00327     __ISB();
00328 }
00329 
00330 /**
00331  * \brief This is the code that gets called on processor reset.
00332  * To initialize the device, and call the main() routine.
00333  */
00334 void Reset_Handler(void)
00335 {
00336         uint32_t *pSrc, *pDest;
00337 
00338         /* Initialize the relocate segment */
00339         pSrc = &_etext;
00340         pDest = &_srelocate;
00341 
00342         if (pSrc != pDest) {
00343                 for (; pDest < &_erelocate;) {
00344                         *pDest++ = *pSrc++;
00345                 }
00346         }
00347 
00348         /* Clear the zero segment */
00349         for (pDest = &_szero; pDest < &_ezero;) {
00350                 *pDest++ = 0;
00351         }
00352 
00353         /* Set the vector table base address */
00354         pSrc = (uint32_t *) & _sfixed;
00355         SCB->VTOR = ((uint32_t) pSrc & SCB_VTOR_TBLOFF_Msk);
00356 
00357     #ifdef ENABLE_TCM 
00358     #ifndef FFT_DEMO
00359     // 32 Kb
00360         EFC->EEFC_FCR = (EEFC_FCR_FKEY_PASSWD | EEFC_FCR_FCMD_CGPB 
00361                         | EEFC_FCR_FARG(8));
00362     #else
00363     // 128 Kb
00364         EFC->EEFC_FCR = (EEFC_FCR_FKEY_PASSWD | EEFC_FCR_FCMD_SGPB 
00365                         | EEFC_FCR_FARG(8));
00366     #endif
00367         EFC->EEFC_FCR = (EEFC_FCR_FKEY_PASSWD | EEFC_FCR_FCMD_SGPB
00368                         | EEFC_FCR_FARG(7));
00369  
00370         TCM_Enable();
00371     #else
00372         EFC->EEFC_FCR = (EEFC_FCR_FKEY_PASSWD | EEFC_FCR_FCMD_CGPB 
00373                         | EEFC_FCR_FARG(8));
00374         EFC->EEFC_FCR = (EEFC_FCR_FKEY_PASSWD | EEFC_FCR_FCMD_CGPB 
00375                         | EEFC_FCR_FARG(7));
00376     
00377         TCM_Disable();
00378     #endif
00379 
00380         LowLevelInit();
00381         /* Initialize the C library */
00382         __libc_init_array();
00383 
00384         /* Branch to main function */
00385         main();
00386 
00387         /* Infinite loop */
00388         while (1);
00389 }
00390 
00391 /**
00392  * \brief Default interrupt handler for unused IRQs.
00393  */
00394 void Dummy_Handler(void)
00395 {
00396         while (1) {
00397         }
00398 }
00399 
00400 
 All Data Structures Files Functions Variables Typedefs Enumerations Enumerator Defines