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