1# Startup File startup_\<Device\>.c {#startup_c_pg} 2 3The startup file defines device exceptions and interrupts, and provides their initial (weak) handler functions. The file has a naming convention `startup_<Device>.c` where `<Device>` corresponds to the device name. 4 5Specifically, following functionalities are provided in the startup file: 6 7 - The reset handler `Reset_Handler` which is executed upon CPU reset and typically calls the `SystemInit()` function. After the system init the control is transferred to the C/C++ run-time library which performs initialization and calls the `main` function in the user code. 8 - The setup values for the Main Stack Pointer (MSP). 9 - Exception vectors of the Cortex-M Processor with weak functions that implement default routines. 10 - Interrupt vectors that are device specific with weak functions that implement default routines. 11 12To adapt the file to a specific device only the interrupt vector table needs to be extended with the device-specific interrupt handlers. The naming convention for the interrupt handler names is `<interrupt_name>_IRQHandler`. This table needs to be consistent with \ref IRQn_Type that defines all the IRQ numbers for each interrupt. 13 14Additional application-specific adaptations may be required in the startup code and therefore so the startup file shall be located in the application project. \ref cmsis_files_dfps explains how this can be achieved when device support is provided in [CMSIS pack format](https://open-cmsis-pack.github.io/Open-CMSIS-Pack-Spec/main/html/index.html). 15 16**Example:** 17 18The following example shows the extension of the interrupt vector table for the LPC1100 device family. 19 20```c 21/*---------------------------------------------------------------------------- 22 Exception / Interrupt Handler 23 *----------------------------------------------------------------------------*/ 24/* Exceptions */ 25void WAKEUP0_IRQHandler (void) __attribute__ ((weak, alias("Default_Handler"))); 26void WAKEUP1_IRQHandler (void) __attribute__ ((weak, alias("Default_Handler"))); 27void WAKEUP2_IRQHandler (void) __attribute__ ((weak, alias("Default_Handler"))); 28// : 29// : 30void EINT1_IRQHandler (void) __attribute__ ((weak, alias("Default_Handler"))); 31void EINT2_IRQHandler (void) __attribute__ ((weak, alias("Default_Handler"))); 32// : 33// : 34 35/*---------------------------------------------------------------------------- 36 Exception / Interrupt Vector table 37 *----------------------------------------------------------------------------*/ 38extern const pFunc __VECTOR_TABLE[240]; 39 const pFunc __VECTOR_TABLE[240] __VECTOR_TABLE_ATTRIBUTE = { 40 (pFunc)(&__INITIAL_SP), /* Initial Stack Pointer */ 41 Reset_Handler, /* Reset Handler */ 42 NMI_Handler, /* -14 NMI Handler */ 43 HardFault_Handler, /* -13 Hard Fault Handler */ 44 MemManage_Handler, /* -12 MPU Fault Handler */ 45 BusFault_Handler, /* -11 Bus Fault Handler */ 46 UsageFault_Handler, /* -10 Usage Fault Handler */ 47 0, /* Reserved */ 48 0, /* Reserved */ 49 0, /* Reserved */ 50 0, /* Reserved */ 51 SVC_Handler, /* -5 SVC Handler */ 52 DebugMon_Handler, /* -4 Debug Monitor Handler */ 53 0, /* Reserved */ 54 PendSV_Handler, /* -2 PendSV Handler */ 55 SysTick_Handler, /* -1 SysTick Handler */ 56 57 /* Interrupts */ 58 WAKEUP0_IRQHandler, /* 0 Wakeup PIO0.0 */ 59 WAKEUP1_IRQHandler, /* 1 Wakeup PIO0.1 */ 60 WAKEUP2_IRQHandler, /* 2 Wakeup PIO0.2 */ 61 // : 62 // : 63 EINT1_IRQHandler, /* 30 PIO INT1 */ 64 EINT2_IRQHandler, /* 31 PIO INT2 */ 65 // : 66 // : 67}; 68``` 69 70## startup_Device.c Template File {#startup_c_sec} 71 72CMSIS-Core \ref cmsis_template_files include a `startup_Device.c` file that can be used as a starting point for chip vendors to implement own device-specific startup file. 73 74The C startup file relys on certain compiler specific preprocessor defines specified in CMSIS compiler headers: 75 76 - \ref __INITIAL_SP 77 - \ref __STACK_LIMIT 78 - \ref __PROGRAM_START 79 - \ref __VECTOR_TABLE 80 - \ref __VECTOR_TABLE_ATTRIBUTE 81 - \ref __STACK_SEAL (for Armv8-M/v8.1-M) 82 - \ref __TZ_set_STACKSEAL_S (for Armv8-M/v8.1-M) 83 84The stack sealing and the initialization for the Stack Limit register is done in function ` Reset_Handler(void)`: 85 86```c 87/*---------------------------------------------------------------------------- 88 Reset Handler called on controller reset 89 *----------------------------------------------------------------------------*/ 90__NO_RETURN void Reset_Handler(void) 91{ 92 __set_PSP((uint32_t)(&__INITIAL_SP)); 93 94 __set_MSPLIM((uint32_t)(&__STACK_LIMIT)); 95 __set_PSPLIM((uint32_t)(&__STACK_LIMIT)); 96 97#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) 98 __TZ_set_STACKSEAL_S((uint32_t *)(&__STACK_SEAL)); 99#endif 100 101 SystemInit(); /* CMSIS System Initialization */ 102 __PROGRAM_START(); /* Enter PreMain (C library entry point) */ 103} 104``` 105 106> **Note** 107> - Stack Sealing also requires the application project to use a scatter file (or a linker script) as explained in \ref RTOS_TrustZone_stacksealing section. 108