Test application for UV, IR, Light and Temperature sensors
[lpc82x] / core / bootstrap.c
1 /****************************************************************************
2  *   core/bootstrap.c
3  *
4  * This file holds the bootstrap code, the vector table, and nothing more.
5  * The bootstrap code is the code of the reset handler, which is called by
6  *   the bootloader (executed from internal ROM after power on or reset).
7  * The reset handler code perform copy of data section, clears bss, and
8  *   calls the main function.
9  *
10  *
11  * Copyright 2016 Nathael Pajani <nathael.pajani@ed3l.fr>
12  *
13  * Example code from frozeneskimo.com :
14  *   http://dev.frozeneskimo.com/notes/getting_started_with_cortex_m3_cmsis_and_gnu_tools
15  *
16  * This program is free software: you can redistribute it and/or modify
17  * it under the terms of the GNU General Public License as published by
18  * the Free Software Foundation, either version 2 of the License, or
19  * (at your option) any later version.
20  *
21  * This program is distributed in the hope that it will be useful,
22  * but WITHOUT ANY WARRANTY; without even the implied warranty of
23  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
24  * GNU General Public License for more details.
25  *
26  * You should have received a copy of the GNU General Public License
27  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
28  *
29  *****************************************************************************/
32 extern unsigned int _end_stack;
33 extern unsigned int _end_text;
34 extern unsigned int _start_data;
35 extern unsigned int _end_data;
36 extern unsigned int _start_bss;
37 extern unsigned int _end_bss;
39 extern int main(void);
41 /* Cortex M0 core interrupt handlers */
42 void Reset_Handler(void);
43 void NMI_Handler(void) __attribute__ ((weak, alias ("Dummy_Handler")));
44 void HardFault_Handler(void) __attribute__ ((weak, alias ("Dummy_Handler")));
45 void SVC_Handler(void) __attribute__ ((weak, alias ("Dummy_Handler")));
46 void PendSV_Handler(void) __attribute__ ((weak, alias ("Dummy_Handler")));
47 void SysTick_Handler(void) __attribute__ ((weak, alias ("Dummy_Handler")));
48 /* LPC82x specific interrupt handlers */
49 void WAKEUP_Handler(void) __attribute__ ((weak, alias ("Dummy_Handler")));
50 void I2C_0_Handler(void) __attribute__ ((weak, alias ("Dummy_Handler")));
51 void I2C_1_Handler(void) __attribute__ ((weak, alias ("Dummy_Handler")));
52 void I2C_2_Handler(void) __attribute__ ((weak, alias ("Dummy_Handler")));
53 void I2C_3_Handler(void) __attribute__ ((weak, alias ("Dummy_Handler")));
54 void SSP_0_Handler(void) __attribute__ ((weak, alias ("Dummy_Handler")));
55 void SSP_1_Handler(void) __attribute__ ((weak, alias ("Dummy_Handler")));
56 void UART_0_Handler(void) __attribute__ ((weak, alias ("Dummy_Handler")));
57 void UART_1_Handler(void) __attribute__ ((weak, alias ("Dummy_Handler")));
58 void UART_2_Handler(void) __attribute__ ((weak, alias ("Dummy_Handler")));
59 void Comparator_Handler(void) __attribute__ ((weak, alias ("Dummy_Handler")));
60 void ADC_SEQA_Handler(void) __attribute__ ((weak, alias ("Dummy_Handler")));
61 void ADC_SEQB_Handler(void) __attribute__ ((weak, alias ("Dummy_Handler")));
62 void ADC_THCMP_Handler(void) __attribute__ ((weak, alias ("Dummy_Handler")));
63 void ADC_OVR_Handler(void) __attribute__ ((weak, alias ("Dummy_Handler")));
64 void WDT_Handler(void) __attribute__ ((weak, alias ("Dummy_Handler")));
65 void BOD_Handler(void) __attribute__ ((weak, alias ("Dummy_Handler")));
66 void FLASH_Handler(void) __attribute__ ((weak, alias ("Dummy_Handler")));
67 void PININT_0_Handler(void) __attribute__ ((weak, alias ("Dummy_Handler")));
68 void PININT_1_Handler(void) __attribute__ ((weak, alias ("Dummy_Handler")));
69 void PININT_2_Handler(void) __attribute__ ((weak, alias ("Dummy_Handler")));
70 void PININT_3_Handler(void) __attribute__ ((weak, alias ("Dummy_Handler")));
71 void PININT_4_Handler(void) __attribute__ ((weak, alias ("Dummy_Handler")));
72 void PININT_5_Handler(void) __attribute__ ((weak, alias ("Dummy_Handler")));
73 void PININT_6_Handler(void) __attribute__ ((weak, alias ("Dummy_Handler")));
74 void PININT_7_Handler(void) __attribute__ ((weak, alias ("Dummy_Handler")));
75 void DMA_Handler(void) __attribute__ ((weak, alias ("Dummy_Handler")));
76 void RTC_Handler(void) __attribute__ ((weak, alias ("Dummy_Handler")));
77 void SCT_Handler(void) __attribute__ ((weak, alias ("Dummy_Handler")));
78 void MRT_Handler(void) __attribute__ ((weak, alias ("Dummy_Handler")));
79 void WKT_Handler(void) __attribute__ ((weak, alias ("Dummy_Handler")));
82 void Dummy_Handler(void);
85 /***************************************************************************** */
86 /*                      Vector table                                           */
87 /***************************************************************************** */
88 void *vector_table[] __attribute__ ((section(".vectors"))) = {
89         &_end_stack, /* Initial SP value */ /* 0 */
90         Reset_Handler,
91         NMI_Handler,
92         HardFault_Handler,
93         0,
94         0, /* 5 */
95         0,
96         /* Entry 7 (8th entry) must contain the 2’s complement of the check-sum
97            of table entries 0 through 6. This causes the checksum of the first 8
98            table entries to be 0 */
99         (void *)0xDEADBEEF, /* Actually, this is done using an external tool. */
100         0,
101         0,
102         0, /* 10 */
103         SVC_Handler,
104         0,
105         0,
106         PendSV_Handler,
107         SysTick_Handler, /* 15 */
108         /* LPC82x specific interrupt vectors, see chapter 4 of LPC82x User manual (UM10800) */
109         SSP_0_Handler, /* 16 */ /* IRQ0 */
110         SSP_1_Handler,
111         0,
112         UART_0_Handler,
113         UART_1_Handler, /* 20 */
114         UART_2_Handler, /* 21 */ /* IRQ5 */
115         0,
116         I2C_1_Handler,
117         I2C_0_Handler,
118         SCT_Handler, /* 25 */
119         MRT_Handler, /* 26 */ /* IRQ10 */
120         Comparator_Handler,
121         WDT_Handler,
122         BOD_Handler,
123         FLASH_Handler, /* 30 */ 
124         WKT_Handler, /* IRQ15 */
125         ADC_SEQA_Handler,
126         ADC_SEQB_Handler,
127         ADC_THCMP_Handler,
128         ADC_OVR_Handler, /* 35 */
129         DMA_Handler, /* IRQ20 */
130         I2C_2_Handler,
131         I2C_3_Handler,
132         0,
133         PININT_0_Handler,  /* 40 */
134         PININT_1_Handler,  /* IRQ25 */
135         PININT_2_Handler,
136         PININT_3_Handler,
137         PININT_4_Handler,
138         PININT_5_Handler,  /* 45 */
139         PININT_6_Handler,  /* IRQ30 */
140         PININT_7_Handler,
141 };
144 extern void rom_helpers_init(void);
145 /*
146  * This is the entry point of the programm
147  * It does the set up of the memory and then starts the main.
148  */
149 void Reset_Handler(void)
151         unsigned int *src, *dst;
153         /* Copy data section from flash to RAM */
154         src = &_end_text;
155         dst = &_start_data;
156         while (dst < &_end_data)
157                 *dst++ = *src++;
159         /* Clear the bss section */
160         dst = &_start_bss;
161         while (dst < &_end_bss)
162                 *dst++ = 0;
164         /* Initialize rom based division helpers */
165         rom_helpers_init();
166         /* Start main programm */
167         main();
170 void Dummy_Handler(void) {
171         while (1);