SAMV71 Xplained Ultra Software Package 1.4

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 #include "samv71.h"
00031 
00032 typedef void (*intfunc) (void);
00033 typedef union { intfunc __fun; void * __ptr; } intvec_elem;
00034 
00035 extern int Image$$ARM_LIB_STACK$$ZI$$Limit;
00036 extern int Image$$Vector_region$$Base;
00037 extern int Image$$Vector_region$$Limit;
00038 
00039 extern void __main( void );
00040 __INLINE void Reset_Handler( void );
00041 
00042 int __low_level_init(void);
00043 /* Default empty handler */
00044 void Dummy_Handler(void);
00045 
00046 #pragma weak NMI_Handler=Dummy_Handler
00047 #pragma weak HardFault_Handler=Dummy_Handler
00048 #pragma weak MemManage_Handler=Dummy_Handler
00049 #pragma weak BusFault_Handler=Dummy_Handler
00050 #pragma weak UsageFault_Handler=Dummy_Handler
00051 #pragma weak SVC_Handler=Dummy_Handler
00052 #pragma weak DebugMon_Handler=Dummy_Handler
00053 #pragma weak PendSV_Handler=Dummy_Handler
00054 #pragma weak SysTick_Handler=Dummy_Handler
00055 
00056 /* Peripherals handlers */
00057 #pragma weak SUPC_Handler=Dummy_Handler
00058 #pragma weak RSTC_Handler=Dummy_Handler
00059 #pragma weak RTC_Handler=Dummy_Handler
00060 #pragma weak RTT_Handler=Dummy_Handler
00061 #pragma weak WDT_Handler=Dummy_Handler
00062 #pragma weak PMC_Handler=Dummy_Handler
00063 #pragma weak EFC_Handler=Dummy_Handler
00064 #pragma weak UART0_Handler=Dummy_Handler
00065 #pragma weak UART1_Handler=Dummy_Handler
00066 #pragma weak PIOA_Handler=Dummy_Handler
00067 #pragma weak PIOB_Handler=Dummy_Handler
00068 #ifdef _SAMV71_PIOC_INSTANCE_
00069 #pragma weak PIOC_Handler=Dummy_Handler
00070 #endif /* _SAM_PIOC_INSTANCE_ */
00071 #pragma weak USART0_Handler=Dummy_Handler
00072 #pragma weak USART1_Handler=Dummy_Handler
00073 #pragma weak USART2_Handler=Dummy_Handler
00074 #pragma weak PIOD_Handler=Dummy_Handler
00075 #ifdef _SAMV71_PIOE_INSTANCE_
00076 #pragma weak PIOE_Handler=Dummy_Handler
00077 #endif /* _SAM_PIOE_INSTANCE_ */
00078 #ifdef _SAMV71_HSMCI_INSTANCE_
00079 #pragma weak HSMCI_Handler=Dummy_Handler
00080 #endif /* _SAM_HSMCI_INSTANCE_ */
00081 #pragma weak TWIHS0_Handler=Dummy_Handler
00082 #pragma weak TWIHS1_Handler=Dummy_Handler
00083 #pragma weak SPI0_Handler=Dummy_Handler
00084 #pragma weak SSC_Handler=Dummy_Handler
00085 #pragma weak TC0_Handler=Dummy_Handler
00086 #pragma weak TC1_Handler=Dummy_Handler
00087 #pragma weak TC2_Handler=Dummy_Handler
00088 #ifdef _SAMV71_TC1_INSTANCE_
00089 #pragma weak TC3_Handler=Dummy_Handler
00090 #endif /* _SAM_TC1_INSTANCE_ */
00091 #ifdef _SAMV71_TC1_INSTANCE_
00092 #pragma weak TC4_Handler=Dummy_Handler
00093 #endif /* _SAM_TC1_INSTANCE_ */
00094 #ifdef _SAMV71_TC1_INSTANCE_
00095 #pragma weak TC5_Handler=Dummy_Handler
00096 #endif /* _SAM_TC1_INSTANCE_ */
00097 #pragma weak AFEC0_Handler=Dummy_Handler
00098 #ifdef _SAMV71_DACC_INSTANCE_
00099 #pragma weak DACC_Handler=Dummy_Handler
00100 #endif /* _SAM_DACC_INSTANCE_ */
00101 #pragma weak PWM0_Handler=Dummy_Handler
00102 #pragma weak ICM_Handler=Dummy_Handler
00103 #pragma weak ACC_Handler=Dummy_Handler
00104 #pragma weak USBHS_Handler=Dummy_Handler
00105 #pragma weak MCAN0_Handler=Dummy_Handler
00106 #pragma weak MCAN0_Line1_Handler=Dummy_Handler
00107 #pragma weak MCAN1_Handler=Dummy_Handler
00108 #pragma weak MCAN1_Line1_Handler=Dummy_Handler
00109 #pragma weak GMAC_Handler=Dummy_Handler
00110 #pragma weak GMACQ1_Handler=Dummy_Handler
00111 #pragma weak GMACQ2_Handler=Dummy_Handler
00112 #pragma weak AFEC1_Handler=Dummy_Handler
00113 #ifdef _SAMV71_TWIHS2_INSTANCE_
00114 #pragma weak TWIHS2_Handler=Dummy_Handler
00115 #endif /* _SAM_TWI2_INSTANCE_ */
00116 #pragma weak SPI1_Handler=Dummy_Handler
00117 #pragma weak QSPI_Handler=Dummy_Handler
00118 #pragma weak UART2_Handler=Dummy_Handler
00119 #pragma weak UART3_Handler=Dummy_Handler
00120 #pragma weak UART4_Handler=Dummy_Handler
00121 #ifdef _SAMV71_TC2_INSTANCE_
00122 #pragma weak TC6_Handler=Dummy_Handler
00123 #endif /* _SAM_TC2_INSTANCE_ */
00124 #ifdef _SAMV71_TC2_INSTANCE_
00125 #pragma weak TC7_Handler=Dummy_Handler
00126 #endif /* _SAM_TC2_INSTANCE_ */
00127 #ifdef _SAMV71_TC2_INSTANCE_
00128 #pragma weak TC8_Handler=Dummy_Handler
00129 #endif /* _SAM_TC2_INSTANCE_ */
00130 #pragma weak TC9_Handler=Dummy_Handler
00131 #pragma weak TC10_Handler=Dummy_Handler
00132 #pragma weak TC11_Handler=Dummy_Handler
00133 #pragma weak MLB_Handler=Dummy_Handler
00134 #pragma weak AES_Handler=Dummy_Handler
00135 #pragma weak TRNG_Handler=Dummy_Handler
00136 #pragma weak XDMAC_Handler=Dummy_Handler
00137 #pragma weak ISI_Handler=Dummy_Handler
00138 #pragma weak PWM1_Handler=Dummy_Handler
00139 #pragma weak FPU_Handler=Dummy_Handler
00140 #ifdef _SAMV71_SDRAMC_INSTANCE_
00141 #pragma weak SDRAMC_Handler=Dummy_Handler
00142 #endif /* _SAM_SDRAMC_INSTANCE_ */
00143 #pragma weak RSWDT_Handler=Dummy_Handler
00144 #pragma weak CCF_Handler=Dummy_Handler
00145 #pragma weak CCW_Handler=Dummy_Handler
00146 
00147 
00148 /* The name "__vector_table" has special meaning for C-SPY: */
00149 /* it is where the SP start value is found, and the NVIC vector */
00150 /* table register (VTOR) is initialized to this address if != 0 */
00151 #pragma arm section rodata = "vectors"
00152 
00153 const intvec_elem __vector_table[] =
00154 {
00155     (intfunc)&Image$$ARM_LIB_STACK$$ZI$$Limit,
00156     Reset_Handler,
00157     NMI_Handler,
00158     HardFault_Handler,
00159     MemManage_Handler,
00160     BusFault_Handler,
00161     UsageFault_Handler,
00162     (0UL), (0UL), (0UL), (0UL),          /* Reserved */
00163     SVC_Handler,
00164     DebugMon_Handler,
00165     (0UL),          /* Reserved */
00166     PendSV_Handler,
00167     SysTick_Handler,
00168 
00169     SUPC_Handler,   /* 0  Supply Controller */
00170     RSTC_Handler,   /* 1  Reset Controller */
00171     RTC_Handler,    /* 2  Real Time Clock */
00172     RTT_Handler,    /* 3  Real Time Timer */
00173     WDT_Handler,    /* 4  Watchdog Timer 0 */
00174     PMC_Handler,    /* 5  Power Management Controller */
00175     EFC_Handler,    /* 6  Enhanced Embedded Flash Controller */
00176     UART0_Handler,  /* 7  UART 0 */
00177     UART1_Handler,  /* 8  UART 1 */
00178     (0UL),          /* 9  Reserved */
00179     PIOA_Handler,   /* 10 Parallel I/O Controller A */
00180     PIOB_Handler,   /* 11 Parallel I/O Controller B */
00181     PIOC_Handler,   /* 12 Parallel I/O Controller C */
00182     USART0_Handler, /* 13 USART 0 */
00183     USART1_Handler, /* 14 USART 1 */
00184     USART2_Handler, /* 15 USART 2 */
00185     PIOD_Handler,   /* 16 Parallel I/O Controller D */
00186     PIOE_Handler,   /* 17 Parallel I/O Controller E */    
00187     HSMCI_Handler,  /* 18 Multimedia Card Interface */
00188     TWIHS0_Handler, /* 19 Two Wire Interface 0 HS */
00189     TWIHS1_Handler, /* 20 Two Wire Interface 1 HS */
00190     SPI0_Handler,   /* 21 Serial Peripheral Interface 0 */
00191     SSC_Handler,    /* 22 Synchronous Serial Controller */
00192     TC0_Handler,    /* 23 Timer/Counter 0 */
00193     TC1_Handler,    /* 24 Timer/Counter 1 */
00194     TC2_Handler,    /* 25 Timer/Counter 2 */
00195     TC3_Handler,    /* 26 Timer/Counter 3 */
00196     TC4_Handler,    /* 27 Timer/Counter 4 */
00197     TC5_Handler,    /* 28 Timer/Counter 5 */
00198     AFEC0_Handler,  /* 29 Analog Front End 0 */
00199     DACC_Handler,   /* 30 Digital To Analog Converter */
00200     PWM0_Handler,   /* 31 Pulse Width Modulation 0 */
00201     ICM_Handler,    /* 32 Integrity Check Monitor */
00202     ACC_Handler,    /* 33 Analog Comparator */
00203     USBHS_Handler,  /* 34 USB Host / Device Controller */
00204     MCAN0_Handler,   /* 35 CAN Controller 0 */
00205     MCAN0_Line1_Handler, /* 36 CAN Controller 0 - Line 1 */
00206     MCAN1_Handler,  /* 37 CAN Controller 1 */
00207     MCAN1_Line1_Handler,  /* 38 CAN Controller 1 - Line 1 */
00208     GMAC_Handler,   /* 39 Ethernet MAC */
00209     AFEC1_Handler,  /* 40 Analog Front End 1 */
00210     TWIHS2_Handler, /* 41 Two Wire Interface 2 HS */
00211     SPI1_Handler,   /* 42 Serial Peripheral Interface 1 */
00212     QSPI_Handler,   /* 43 Quad I/O Serial Peripheral Interface */
00213     UART2_Handler,  /* 44 UART 2 */
00214     UART3_Handler,  /* 45 UART 3 */
00215     UART4_Handler,  /* 46 UART 4 */
00216     TC6_Handler,    /* 47 Timer/Counter 6 */
00217     TC7_Handler,    /* 48 Timer/Counter 7 */
00218     TC8_Handler,    /* 49 Timer/Counter 8 */
00219     TC9_Handler,    /* 50 Timer/Counter 9 */
00220     TC10_Handler,   /* 51 Timer/Counter 10 */
00221     TC11_Handler,   /* 52 Timer/Counter 11 */
00222     MLB_Handler,    /* 53 MediaLB */
00223     (0UL),          /* 54 Reserved */
00224     (0UL),          /* 55 Reserved */
00225     AES_Handler,    /* 56 AES */
00226     TRNG_Handler,   /* 57 True Random Generator */
00227     XDMAC_Handler,  /* 58 DMA */
00228     ISI_Handler,    /* 59 Camera Interface */
00229     PWM1_Handler,   /* 60 Pulse Width Modulation 1 */
00230     (0UL),          /* 61 Reserved */
00231     SDRAMC_Handler, /* 62 SDRAM Controller */
00232     RSWDT_Handler,  /* 63 Watchdog Timer 1 */
00233 };
00234 #pragma arm section
00235 
00236 
00237 void LowLevelInit(void);
00238 
00239 #ifdef ENABLE_TCM 
00240 /** \brief  TCM memory enable
00241 
00242     The function enables TCM memories
00243  */
00244 __STATIC_INLINE void TCM_Enable(void) 
00245 {
00246 
00247     __DSB();
00248     __ISB();
00249     SCB->ITCMCR = (SCB_ITCMCR_EN_Msk  | SCB_ITCMCR_RMW_Msk | SCB_ITCMCR_RETEN_Msk);
00250     SCB->DTCMCR = ( SCB_DTCMCR_EN_Msk | SCB_DTCMCR_RMW_Msk | SCB_DTCMCR_RETEN_Msk);
00251     __DSB();
00252     __ISB();
00253 }
00254 #endif
00255 
00256 /** \brief  TCM memory Disable
00257 
00258     The function enables TCM memories
00259  */
00260 __STATIC_INLINE void TCM_Disable(void) 
00261 {
00262 
00263     __DSB();
00264     __ISB();
00265     SCB->ITCMCR &= ~(uint32_t)SCB_ITCMCR_EN_Msk;
00266     SCB->DTCMCR &= ~(uint32_t)SCB_ITCMCR_EN_Msk;
00267     __DSB();
00268     __ISB();
00269 }
00270 
00271 __STATIC_INLINE uint32_t GetGPNVMStatus(uint8_t bit) 
00272 {
00273     EFC->EEFC_FCR = (EEFC_FCR_FKEY_PASSWD | EEFC_FCR_FCMD_GGPB );
00274     return EFC->EEFC_FRR;
00275 }
00276 
00277 /**------------------------------------------------------------------------------
00278  * This is the code that gets called on processor reset. To initialize the
00279  * device.
00280  *-----------------------------------------------------------------------------*/
00281 void Reset_Handler(void)
00282 {
00283     uint32_t *pSrc = (uint32_t*)&Image$$Vector_region$$Base;
00284 
00285     #ifdef ENABLE_TCM 
00286     #ifndef FFT_DEMO
00287     // 32 Kb
00288     EFC->EEFC_FCR = (EEFC_FCR_FKEY_PASSWD | EEFC_FCR_FCMD_CGPB | EEFC_FCR_FARG(8));
00289     #else
00290     // 128 Kb
00291     EFC->EEFC_FCR = (EEFC_FCR_FKEY_PASSWD | EEFC_FCR_FCMD_SGPB | EEFC_FCR_FARG(8));
00292     #endif
00293     EFC->EEFC_FCR = (EEFC_FCR_FKEY_PASSWD | EEFC_FCR_FCMD_SGPB | EEFC_FCR_FARG(7));
00294  
00295     TCM_Enable();
00296     #else
00297     EFC->EEFC_FCR = (EEFC_FCR_FKEY_PASSWD | EEFC_FCR_FCMD_CGPB | EEFC_FCR_FARG(8));
00298     EFC->EEFC_FCR = (EEFC_FCR_FKEY_PASSWD | EEFC_FCR_FCMD_CGPB | EEFC_FCR_FARG(7));
00299     
00300     TCM_Disable();
00301     #endif
00302 
00303     /* Low level Initialize */
00304     LowLevelInit();
00305     SCB->VTOR = ((uint32_t) pSrc & SCB_VTOR_TBLOFF_Msk);
00306 
00307     /* Branch to main function */
00308     __main();
00309 
00310     /* Infinite loop */
00311     while ( 1 );
00312 }
00313 
00314 /**
00315  * \brief Default interrupt handler for unused IRQs.
00316  */
00317 void Dummy_Handler(void)
00318 {
00319         while (1) {
00320         }
00321 }
00322 
 All Data Structures Files Functions Variables Typedefs Enumerations Enumerator Defines