1 //*****************************************************************************
\r
2 // LPC54018 startup code for use with MCUXpresso IDE
\r
5 //*****************************************************************************
\r
7 // Copyright 2016-2019 NXP
\r
8 // All rights reserved.
\r
10 // SPDX-License-Identifier: BSD-3-Clause
\r
11 //*****************************************************************************
\r
14 #pragma GCC push_options
\r
15 #pragma GCC optimize ("Og")
\r
18 #if defined (__cplusplus)
\r
20 #error Redlib does not support C++
\r
22 //*****************************************************************************
\r
24 // The entry point for the C++ library startup
\r
26 //*****************************************************************************
\r
28 extern void __libc_init_array(void);
\r
33 #define WEAK __attribute__ ((weak))
\r
34 #define WEAK_AV __attribute__ ((weak, section(".after_vectors")))
\r
35 #define ALIAS(f) __attribute__ ((weak, alias (#f)))
\r
37 //*****************************************************************************
\r
38 #if defined (__cplusplus)
\r
42 //*****************************************************************************
\r
43 // Variable to store CRP value in. Will be placed automatically
\r
44 // by the linker when "Enable Code Read Protect" selected.
\r
45 // See crp.h header for more information
\r
46 //*****************************************************************************
\r
47 #include <NXP/crp.h>
\r
48 __CRP const unsigned int CRP_WORD = CRP_NO_CRP ;
\r
50 //*****************************************************************************
\r
51 // Declaration of external SystemInit function
\r
52 //*****************************************************************************
\r
53 #if defined (__USE_CMSIS)
\r
54 extern void SystemInit(void);
\r
55 #endif // (__USE_CMSIS)
\r
57 //*****************************************************************************
\r
58 // Forward declaration of the core exception handlers.
\r
59 // When the application defines a handler (with the same name), this will
\r
60 // automatically take precedence over these weak definitions.
\r
61 // If your application is a C++ one, then any interrupt handlers defined
\r
62 // in C++ files within in your main application will need to have C linkage
\r
63 // rather than C++ linkage. To do this, make sure that you are using extern "C"
\r
64 // { .... } around the interrupt handler within your main application code.
\r
65 //*****************************************************************************
\r
66 void ResetISR(void);
\r
67 WEAK void NMI_Handler(void);
\r
68 WEAK void HardFault_Handler(void);
\r
69 WEAK void MemManage_Handler(void);
\r
70 WEAK void BusFault_Handler(void);
\r
71 WEAK void UsageFault_Handler(void);
\r
72 WEAK void SVC_Handler(void);
\r
73 WEAK void DebugMon_Handler(void);
\r
74 WEAK void PendSV_Handler(void);
\r
75 WEAK void SysTick_Handler(void);
\r
76 WEAK void IntDefaultHandler(void);
\r
78 //*****************************************************************************
\r
79 // Forward declaration of the application IRQ handlers. When the application
\r
80 // defines a handler (with the same name), this will automatically take
\r
81 // precedence over weak definitions below
\r
82 //*****************************************************************************
\r
83 WEAK void WDT_BOD_IRQHandler(void);
\r
84 WEAK void DMA0_IRQHandler(void);
\r
85 WEAK void GINT0_IRQHandler(void);
\r
86 WEAK void GINT1_IRQHandler(void);
\r
87 WEAK void PIN_INT0_IRQHandler(void);
\r
88 WEAK void PIN_INT1_IRQHandler(void);
\r
89 WEAK void PIN_INT2_IRQHandler(void);
\r
90 WEAK void PIN_INT3_IRQHandler(void);
\r
91 WEAK void UTICK0_IRQHandler(void);
\r
92 WEAK void MRT0_IRQHandler(void);
\r
93 WEAK void CTIMER0_IRQHandler(void);
\r
94 WEAK void CTIMER1_IRQHandler(void);
\r
95 WEAK void SCT0_IRQHandler(void);
\r
96 WEAK void CTIMER3_IRQHandler(void);
\r
97 WEAK void FLEXCOMM0_IRQHandler(void);
\r
98 WEAK void FLEXCOMM1_IRQHandler(void);
\r
99 WEAK void FLEXCOMM2_IRQHandler(void);
\r
100 WEAK void FLEXCOMM3_IRQHandler(void);
\r
101 WEAK void FLEXCOMM4_IRQHandler(void);
\r
102 WEAK void FLEXCOMM5_IRQHandler(void);
\r
103 WEAK void FLEXCOMM6_IRQHandler(void);
\r
104 WEAK void FLEXCOMM7_IRQHandler(void);
\r
105 WEAK void ADC0_SEQA_IRQHandler(void);
\r
106 WEAK void ADC0_SEQB_IRQHandler(void);
\r
107 WEAK void ADC0_THCMP_IRQHandler(void);
\r
108 WEAK void DMIC0_IRQHandler(void);
\r
109 WEAK void HWVAD0_IRQHandler(void);
\r
110 WEAK void USB0_NEEDCLK_IRQHandler(void);
\r
111 WEAK void USB0_IRQHandler(void);
\r
112 WEAK void RTC_IRQHandler(void);
\r
113 WEAK void FLEXCOMM10_IRQHandler(void);
\r
114 WEAK void Reserved47_IRQHandler(void);
\r
115 WEAK void PIN_INT4_IRQHandler(void);
\r
116 WEAK void PIN_INT5_IRQHandler(void);
\r
117 WEAK void PIN_INT6_IRQHandler(void);
\r
118 WEAK void PIN_INT7_IRQHandler(void);
\r
119 WEAK void CTIMER2_IRQHandler(void);
\r
120 WEAK void CTIMER4_IRQHandler(void);
\r
121 WEAK void RIT_IRQHandler(void);
\r
122 WEAK void SPIFI0_IRQHandler(void);
\r
123 WEAK void FLEXCOMM8_IRQHandler(void);
\r
124 WEAK void FLEXCOMM9_IRQHandler(void);
\r
125 WEAK void SDIO_IRQHandler(void);
\r
126 WEAK void CAN0_IRQ0_IRQHandler(void);
\r
127 WEAK void CAN0_IRQ1_IRQHandler(void);
\r
128 WEAK void CAN1_IRQ0_IRQHandler(void);
\r
129 WEAK void CAN1_IRQ1_IRQHandler(void);
\r
130 WEAK void USB1_IRQHandler(void);
\r
131 WEAK void USB1_NEEDCLK_IRQHandler(void);
\r
132 WEAK void ETHERNET_IRQHandler(void);
\r
133 WEAK void ETHERNET_PMT_IRQHandler(void);
\r
134 WEAK void ETHERNET_MACLP_IRQHandler(void);
\r
135 WEAK void Reserved68_IRQHandler(void);
\r
136 WEAK void LCD_IRQHandler(void);
\r
137 WEAK void SHA_IRQHandler(void);
\r
138 WEAK void SMARTCARD0_IRQHandler(void);
\r
139 WEAK void SMARTCARD1_IRQHandler(void);
\r
141 //*****************************************************************************
\r
142 // Forward declaration of the driver IRQ handlers. These are aliased
\r
143 // to the IntDefaultHandler, which is a 'forever' loop. When the driver
\r
144 // defines a handler (with the same name), this will automatically take
\r
145 // precedence over these weak definitions
\r
146 //*****************************************************************************
\r
147 void WDT_BOD_DriverIRQHandler(void) ALIAS(IntDefaultHandler);
\r
148 void DMA0_DriverIRQHandler(void) ALIAS(IntDefaultHandler);
\r
149 void GINT0_DriverIRQHandler(void) ALIAS(IntDefaultHandler);
\r
150 void GINT1_DriverIRQHandler(void) ALIAS(IntDefaultHandler);
\r
151 void PIN_INT0_DriverIRQHandler(void) ALIAS(IntDefaultHandler);
\r
152 void PIN_INT1_DriverIRQHandler(void) ALIAS(IntDefaultHandler);
\r
153 void PIN_INT2_DriverIRQHandler(void) ALIAS(IntDefaultHandler);
\r
154 void PIN_INT3_DriverIRQHandler(void) ALIAS(IntDefaultHandler);
\r
155 void UTICK0_DriverIRQHandler(void) ALIAS(IntDefaultHandler);
\r
156 void MRT0_DriverIRQHandler(void) ALIAS(IntDefaultHandler);
\r
157 void CTIMER0_DriverIRQHandler(void) ALIAS(IntDefaultHandler);
\r
158 void CTIMER1_DriverIRQHandler(void) ALIAS(IntDefaultHandler);
\r
159 void SCT0_DriverIRQHandler(void) ALIAS(IntDefaultHandler);
\r
160 void CTIMER3_DriverIRQHandler(void) ALIAS(IntDefaultHandler);
\r
161 void FLEXCOMM0_DriverIRQHandler(void) ALIAS(IntDefaultHandler);
\r
162 void FLEXCOMM1_DriverIRQHandler(void) ALIAS(IntDefaultHandler);
\r
163 void FLEXCOMM2_DriverIRQHandler(void) ALIAS(IntDefaultHandler);
\r
164 void FLEXCOMM3_DriverIRQHandler(void) ALIAS(IntDefaultHandler);
\r
165 void FLEXCOMM4_DriverIRQHandler(void) ALIAS(IntDefaultHandler);
\r
166 void FLEXCOMM5_DriverIRQHandler(void) ALIAS(IntDefaultHandler);
\r
167 void FLEXCOMM6_DriverIRQHandler(void) ALIAS(IntDefaultHandler);
\r
168 void FLEXCOMM7_DriverIRQHandler(void) ALIAS(IntDefaultHandler);
\r
169 void ADC0_SEQA_DriverIRQHandler(void) ALIAS(IntDefaultHandler);
\r
170 void ADC0_SEQB_DriverIRQHandler(void) ALIAS(IntDefaultHandler);
\r
171 void ADC0_THCMP_DriverIRQHandler(void) ALIAS(IntDefaultHandler);
\r
172 void DMIC0_DriverIRQHandler(void) ALIAS(IntDefaultHandler);
\r
173 void HWVAD0_DriverIRQHandler(void) ALIAS(IntDefaultHandler);
\r
174 void USB0_NEEDCLK_DriverIRQHandler(void) ALIAS(IntDefaultHandler);
\r
175 void USB0_DriverIRQHandler(void) ALIAS(IntDefaultHandler);
\r
176 void RTC_DriverIRQHandler(void) ALIAS(IntDefaultHandler);
\r
177 void FLEXCOMM10_DriverIRQHandler(void) ALIAS(IntDefaultHandler);
\r
178 void Reserved47_DriverIRQHandler(void) ALIAS(IntDefaultHandler);
\r
179 void PIN_INT4_DriverIRQHandler(void) ALIAS(IntDefaultHandler);
\r
180 void PIN_INT5_DriverIRQHandler(void) ALIAS(IntDefaultHandler);
\r
181 void PIN_INT6_DriverIRQHandler(void) ALIAS(IntDefaultHandler);
\r
182 void PIN_INT7_DriverIRQHandler(void) ALIAS(IntDefaultHandler);
\r
183 void CTIMER2_DriverIRQHandler(void) ALIAS(IntDefaultHandler);
\r
184 void CTIMER4_DriverIRQHandler(void) ALIAS(IntDefaultHandler);
\r
185 void RIT_DriverIRQHandler(void) ALIAS(IntDefaultHandler);
\r
186 void SPIFI0_DriverIRQHandler(void) ALIAS(IntDefaultHandler);
\r
187 void FLEXCOMM8_DriverIRQHandler(void) ALIAS(IntDefaultHandler);
\r
188 void FLEXCOMM9_DriverIRQHandler(void) ALIAS(IntDefaultHandler);
\r
189 void SDIO_DriverIRQHandler(void) ALIAS(IntDefaultHandler);
\r
190 void CAN0_IRQ0_DriverIRQHandler(void) ALIAS(IntDefaultHandler);
\r
191 void CAN0_IRQ1_DriverIRQHandler(void) ALIAS(IntDefaultHandler);
\r
192 void CAN1_IRQ0_DriverIRQHandler(void) ALIAS(IntDefaultHandler);
\r
193 void CAN1_IRQ1_DriverIRQHandler(void) ALIAS(IntDefaultHandler);
\r
194 void USB1_DriverIRQHandler(void) ALIAS(IntDefaultHandler);
\r
195 void USB1_NEEDCLK_DriverIRQHandler(void) ALIAS(IntDefaultHandler);
\r
196 void ETHERNET_DriverIRQHandler(void) ALIAS(IntDefaultHandler);
\r
197 void ETHERNET_PMT_DriverIRQHandler(void) ALIAS(IntDefaultHandler);
\r
198 void ETHERNET_MACLP_DriverIRQHandler(void) ALIAS(IntDefaultHandler);
\r
199 void Reserved68_DriverIRQHandler(void) ALIAS(IntDefaultHandler);
\r
200 void LCD_DriverIRQHandler(void) ALIAS(IntDefaultHandler);
\r
201 void SHA_DriverIRQHandler(void) ALIAS(IntDefaultHandler);
\r
202 void SMARTCARD0_DriverIRQHandler(void) ALIAS(IntDefaultHandler);
\r
203 void SMARTCARD1_DriverIRQHandler(void) ALIAS(IntDefaultHandler);
\r
205 //*****************************************************************************
\r
206 // The entry point for the application.
\r
207 // __main() is the entry point for Redlib based applications
\r
208 // main() is the entry point for Newlib based applications
\r
209 //*****************************************************************************
\r
210 #if defined (__REDLIB__)
\r
211 extern void __main(void);
\r
213 extern int main(void);
\r
215 //*****************************************************************************
\r
216 // External declaration for the pointer to the stack top from the Linker Script
\r
217 //*****************************************************************************
\r
218 extern void _vStackTop(void);
\r
219 extern void _image_size(void);
\r
220 //*****************************************************************************
\r
221 // External declaration for LPC MCU vector table checksum from Linker Script
\r
222 //*****************************************************************************
\r
223 WEAK extern void __valid_user_code_checksum();
\r
225 //*****************************************************************************
\r
226 // External declaration for image type and load address from Linker Script
\r
227 //*****************************************************************************
\r
228 WEAK extern void __imghdr_loadaddress();
\r
229 WEAK extern void __imghdr_imagetype();
\r
231 //*****************************************************************************
\r
232 #if defined (__cplusplus)
\r
235 #ifndef IMG_BAUDRATE
\r
236 #define IMG_BAUDRATE 0
\r
238 //*****************************************************************************
\r
239 // The vector table.
\r
240 // This relies on the linker script to place at correct location in memory.
\r
241 //*****************************************************************************
\r
242 extern void (* const g_pfnVectors[])(void);
\r
243 extern void * __Vectors __attribute__ ((alias ("g_pfnVectors")));
\r
245 __attribute__ ((used, section(".isr_vector")))
\r
246 void (* const g_pfnVectors[])(void) = {
\r
247 // Core Level - CM4
\r
248 &_vStackTop, // The initial stack pointer
\r
249 ResetISR, // The reset handler
\r
250 NMI_Handler, // The NMI handler
\r
251 HardFault_Handler, // The hard fault handler
\r
252 MemManage_Handler, // The MPU fault handler
\r
253 BusFault_Handler, // The bus fault handler
\r
254 UsageFault_Handler, // The usage fault handler
\r
255 __valid_user_code_checksum, // LPC MCU checksum
\r
257 (void (*)(void))0xEDDC94BD, // Reserved
\r
258 (void (*)(void))0x160, // Reserved
\r
259 SVC_Handler, // SVCall handler
\r
260 DebugMon_Handler, // Debug monitor handler
\r
262 PendSV_Handler, // The PendSV handler
\r
263 SysTick_Handler, // The SysTick handler
\r
265 // Chip Level - LPC54018
\r
266 WDT_BOD_IRQHandler, // 16: Windowed watchdog timer, Brownout detect
\r
267 DMA0_IRQHandler, // 17: DMA controller
\r
268 GINT0_IRQHandler, // 18: GPIO group 0
\r
269 GINT1_IRQHandler, // 19: GPIO group 1
\r
270 PIN_INT0_IRQHandler, // 20: Pin interrupt 0 or pattern match engine slice 0
\r
271 PIN_INT1_IRQHandler, // 21: Pin interrupt 1or pattern match engine slice 1
\r
272 PIN_INT2_IRQHandler, // 22: Pin interrupt 2 or pattern match engine slice 2
\r
273 PIN_INT3_IRQHandler, // 23: Pin interrupt 3 or pattern match engine slice 3
\r
274 UTICK0_IRQHandler, // 24: Micro-tick Timer
\r
275 MRT0_IRQHandler, // 25: Multi-rate timer
\r
276 CTIMER0_IRQHandler, // 26: Standard counter/timer CTIMER0
\r
277 CTIMER1_IRQHandler, // 27: Standard counter/timer CTIMER1
\r
278 SCT0_IRQHandler, // 28: SCTimer/PWM
\r
279 CTIMER3_IRQHandler, // 29: Standard counter/timer CTIMER3
\r
280 FLEXCOMM0_IRQHandler, // 30: Flexcomm Interface 0 (USART, SPI, I2C, FLEXCOMM)
\r
281 FLEXCOMM1_IRQHandler, // 31: Flexcomm Interface 1 (USART, SPI, I2C, FLEXCOMM)
\r
282 FLEXCOMM2_IRQHandler, // 32: Flexcomm Interface 2 (USART, SPI, I2C, FLEXCOMM)
\r
283 FLEXCOMM3_IRQHandler, // 33: Flexcomm Interface 3 (USART, SPI, I2C, FLEXCOMM)
\r
284 FLEXCOMM4_IRQHandler, // 34: Flexcomm Interface 4 (USART, SPI, I2C, FLEXCOMM)
\r
285 FLEXCOMM5_IRQHandler, // 35: Flexcomm Interface 5 (USART, SPI, I2C,, FLEXCOMM)
\r
286 FLEXCOMM6_IRQHandler, // 36: Flexcomm Interface 6 (USART, SPI, I2C, I2S,, FLEXCOMM)
\r
287 FLEXCOMM7_IRQHandler, // 37: Flexcomm Interface 7 (USART, SPI, I2C, I2S,, FLEXCOMM)
\r
288 ADC0_SEQA_IRQHandler, // 38: ADC0 sequence A completion.
\r
289 ADC0_SEQB_IRQHandler, // 39: ADC0 sequence B completion.
\r
290 ADC0_THCMP_IRQHandler, // 40: ADC0 threshold compare and error.
\r
291 DMIC0_IRQHandler, // 41: Digital microphone and DMIC subsystem
\r
292 HWVAD0_IRQHandler, // 42: Hardware Voice Activity Detector
\r
293 USB0_NEEDCLK_IRQHandler, // 43: USB Activity Wake-up Interrupt
\r
294 USB0_IRQHandler, // 44: USB device
\r
295 RTC_IRQHandler, // 45: RTC alarm and wake-up interrupts
\r
296 FLEXCOMM10_IRQHandler, // 46: Flexcomm Interface 10 (SPI, FLEXCOMM)
\r
297 Reserved47_IRQHandler, // 47: Reserved interrupt
\r
298 PIN_INT4_IRQHandler, // 48: Pin interrupt 4 or pattern match engine slice 4 int
\r
299 PIN_INT5_IRQHandler, // 49: Pin interrupt 5 or pattern match engine slice 5 int
\r
300 PIN_INT6_IRQHandler, // 50: Pin interrupt 6 or pattern match engine slice 6 int
\r
301 PIN_INT7_IRQHandler, // 51: Pin interrupt 7 or pattern match engine slice 7 int
\r
302 CTIMER2_IRQHandler, // 52: Standard counter/timer CTIMER2
\r
303 CTIMER4_IRQHandler, // 53: Standard counter/timer CTIMER4
\r
304 RIT_IRQHandler, // 54: Repetitive Interrupt Timer
\r
305 SPIFI0_IRQHandler, // 55: SPI flash interface
\r
306 FLEXCOMM8_IRQHandler, // 56: Flexcomm Interface 8 (USART, SPI, I2C, FLEXCOMM)
\r
307 FLEXCOMM9_IRQHandler, // 57: Flexcomm Interface 9 (USART, SPI, I2C, FLEXCOMM)
\r
308 SDIO_IRQHandler, // 58: SD/MMC
\r
309 CAN0_IRQ0_IRQHandler, // 59: CAN0 interrupt0
\r
310 CAN0_IRQ1_IRQHandler, // 60: CAN0 interrupt1
\r
311 CAN1_IRQ0_IRQHandler, // 61: CAN1 interrupt0
\r
312 CAN1_IRQ1_IRQHandler, // 62: CAN1 interrupt1
\r
313 USB1_IRQHandler, // 63: USB1 interrupt
\r
314 USB1_NEEDCLK_IRQHandler, // 64: USB1 activity
\r
315 ETHERNET_IRQHandler, // 65: Ethernet
\r
316 ETHERNET_PMT_IRQHandler, // 66: Ethernet power management interrupt
\r
317 ETHERNET_MACLP_IRQHandler, // 67: Ethernet MAC interrupt
\r
318 Reserved68_IRQHandler, // 68: Reserved interrupt
\r
319 LCD_IRQHandler, // 69: LCD interrupt
\r
320 SHA_IRQHandler, // 70: SHA interrupt
\r
321 SMARTCARD0_IRQHandler, // 71: Smart card 0 interrupt
\r
322 SMARTCARD1_IRQHandler, // 72: Smart card 1 interrupt
\r
339 (void (*)(void))0xFEEDA5A5, // Header Marker
\r
341 #if defined (ADD_CRC)
\r
342 (__imghdr_imagetype - 1), // (0x04) Image Type
\r
343 __imghdr_loadaddress, // (0x08) Load_address
\r
345 __imghdr_imagetype, // (0x04) Image Type
\r
346 __imghdr_loadaddress, // (0x08) Load_address
\r
348 (void (*)(void))(((unsigned)_image_size) - 4), // (0x0C) load_length, exclude 4 bytes CRC field.
\r
349 0, // (0x10) CRC value (only applicable to NON Non-secure images).
\r
350 0, // (0x14) Version (only applicable to DUAL_ENH image type.
\r
351 0, // (0x18) EMC static memory configuration settings, required for EMC boot
\r
352 (void (*)(void))IMG_BAUDRATE, // (0x1C) image baudrate
\r
353 0, // (0x20) reserved
\r
354 (void (*)(void))0xEDDC94BD, // (0x24) Image_marker
\r
356 0, // (0x2C) reserved
\r
358 /* SPIFI Descriptor - W25Q128JVFM */
\r
359 (void (*)(void))0x00000000, // 0xFFFFFFFF to default 1-bit SPI mode ï¼›DevStrAdr
\r
360 (void (*)(void))0x001870EF, // mfgId + extCount
\r
361 (void (*)(void))0x00000000, // extid 0-3
\r
362 (void (*)(void))0x00000000, // extid 4-7
\r
363 (void (*)(void))0x0001001D, // caps
\r
364 (void (*)(void))0x00000100, // Blks + RESV1
\r
365 (void (*)(void))0x00010000, // blkSize
\r
366 (void (*)(void))0x00000000, // subBlks + subBlkSize
\r
367 (void (*)(void))0x00000100, // pageSize + RESV2
\r
368 (void (*)(void))0x00003F00, // maxReadSize
\r
369 (void (*)(void))0x68506850, // maxClkRate,maxReadRate,maxHSReadRate,maxProgramRate
\r
370 (void (*)(void))0x04030050, // maxHSProgramRate,initDeInitFxId,clearStatusFxId,getStatusFxId,
\r
371 (void (*)(void))0x14110D09, // setStatusFxId,setOptionsFxId,getReadCmdFxId,getWriteCmdFxId
\r
375 /* SPI Descriptor - MXL12835F */
\r
376 (void (*)(void))0x00000000, // 0xFFFFFFFF to default 1-bit SPI mode ;DevStrAdr
\r
377 (void (*)(void))0x001820C2, // mfgId + extCount
\r
378 (void (*)(void))0x00000000, // extid 0-3
\r
379 (void (*)(void))0x00000000, // extid 4-7
\r
380 (void (*)(void))0x0001001D, // caps
\r
381 (void (*)(void))0x00000100, // Blks + RESV1
\r
382 (void (*)(void))0x00010000, // blkSize
\r
383 (void (*)(void))0x00000000, // subBlks + subBlkSize
\r
384 (void (*)(void))0x00000100, // pageSize + RESV2
\r
385 (void (*)(void))0x00003F00, // maxReadSize
\r
386 (void (*)(void))0x68506850, // maxClkRate,maxReadRate,maxHSReadRate,maxProgramRate
\r
387 (void (*)(void))0x06030050, // maxHSProgramRate,initDeInitFxId,clearStatusFxId,getStatusFxId
\r
388 (void (*)(void))0x14110F0B, // setStatusFxId,setOptionsFxId,getReadCmdFxId,getWriteCmdFxId
\r
391 }; /* End of g_pfnVectors */
\r
393 //*****************************************************************************
\r
394 // Functions to carry out the initialization of RW and BSS data sections. These
\r
395 // are written as separate functions rather than being inlined within the
\r
396 // ResetISR() function in order to cope with MCUs with multiple banks of
\r
398 //*****************************************************************************
\r
399 __attribute__ ((section(".after_vectors.init_data")))
\r
400 void data_init(unsigned int romstart, unsigned int start, unsigned int len) {
\r
401 unsigned int *pulDest = (unsigned int*) start;
\r
402 unsigned int *pulSrc = (unsigned int*) romstart;
\r
404 for (loop = 0; loop < len; loop = loop + 4)
\r
405 *pulDest++ = *pulSrc++;
\r
408 __attribute__ ((section(".after_vectors.init_bss")))
\r
409 void bss_init(unsigned int start, unsigned int len) {
\r
410 unsigned int *pulDest = (unsigned int*) start;
\r
412 for (loop = 0; loop < len; loop = loop + 4)
\r
416 //*****************************************************************************
\r
417 // The following symbols are constructs generated by the linker, indicating
\r
418 // the location of various points in the "Global Section Table". This table is
\r
419 // created by the linker via the Code Red managed linker script mechanism. It
\r
420 // contains the load address, execution address and length of each RW data
\r
421 // section and the execution and length of each BSS (zero initialized) section.
\r
422 //*****************************************************************************
\r
423 extern unsigned int __data_section_table;
\r
424 extern unsigned int __data_section_table_end;
\r
425 extern unsigned int __bss_section_table;
\r
426 extern unsigned int __bss_section_table_end;
\r
428 //*****************************************************************************
\r
429 // Reset entry point for your code.
\r
430 // Sets up a simple runtime environment and initializes the C/C++
\r
432 //*****************************************************************************
\r
433 __attribute__ ((section(".after_vectors.reset")))
\r
434 void ResetISR(void) {
\r
436 // Disable interrupts
\r
437 __asm volatile ("cpsid i");
\r
440 // Enable SRAM clock used by Stack
\r
441 __asm volatile ("LDR R0, =0x40000220\n\t"
\r
445 #if defined (__USE_CMSIS)
\r
446 // If __USE_CMSIS defined, then call CMSIS SystemInit code
\r
449 #endif // (__USE_CMSIS)
\r
452 // Copy the data sections from flash to SRAM.
\r
454 unsigned int LoadAddr, ExeAddr, SectionLen;
\r
455 unsigned int *SectionTableAddr;
\r
457 // Load base address of Global Section Table
\r
458 SectionTableAddr = &__data_section_table;
\r
460 // Copy the data sections from flash to SRAM.
\r
461 while (SectionTableAddr < &__data_section_table_end) {
\r
462 LoadAddr = *SectionTableAddr++;
\r
463 ExeAddr = *SectionTableAddr++;
\r
464 SectionLen = *SectionTableAddr++;
\r
465 data_init(LoadAddr, ExeAddr, SectionLen);
\r
468 // At this point, SectionTableAddr = &__bss_section_table;
\r
469 // Zero fill the bss segment
\r
470 while (SectionTableAddr < &__bss_section_table_end) {
\r
471 ExeAddr = *SectionTableAddr++;
\r
472 SectionLen = *SectionTableAddr++;
\r
473 bss_init(ExeAddr, SectionLen);
\r
476 #if !defined (__USE_CMSIS)
\r
477 // Assume that if __USE_CMSIS defined, then CMSIS SystemInit code
\r
478 // will enable the FPU
\r
479 #if defined (__VFP_FP__) && !defined (__SOFTFP__)
\r
481 // Code to enable the Cortex-M4 FPU only included
\r
482 // if appropriate build options have been selected.
\r
483 // Code taken from Section 7.1, Cortex-M4 TRM (DDI0439C)
\r
485 // Read CPACR (located at address 0xE000ED88)
\r
486 // Set bits 20-23 to enable CP10 and CP11 coprocessors
\r
487 // Write back the modified value to the CPACR
\r
488 asm volatile ("LDR.W R0, =0xE000ED88\n\t"
\r
490 "ORR R1, R1, #(0xF << 20)\n\t"
\r
492 #endif // (__VFP_FP__) && !(__SOFTFP__)
\r
493 #endif // (__USE_CMSIS)
\r
496 #if !defined (__USE_CMSIS)
\r
497 // Assume that if __USE_CMSIS defined, then CMSIS SystemInit code
\r
498 // will setup the VTOR register
\r
500 // Check to see if we are running the code from a non-zero
\r
501 // address (eg RAM, external flash), in which case we need
\r
502 // to modify the VTOR register to tell the CPU that the
\r
503 // vector table is located at a non-0x0 address.
\r
504 unsigned int * pSCB_VTOR = (unsigned int *) 0xE000ED08;
\r
505 if ((unsigned int *)g_pfnVectors!=(unsigned int *) 0x00000000) {
\r
506 *pSCB_VTOR = (unsigned int)g_pfnVectors;
\r
508 #endif // (__USE_CMSIS)
\r
509 #if defined (__cplusplus)
\r
511 // Call C++ library initialisation
\r
513 __libc_init_array();
\r
516 // Reenable interrupts
\r
517 __asm volatile ("cpsie i");
\r
519 #if defined (__REDLIB__)
\r
520 // Call the Redlib library, which in turn calls main()
\r
527 // main() shouldn't return, but if it does, we'll just enter an infinite loop
\r
534 //*****************************************************************************
\r
535 // Default core exception handlers. Override the ones here by defining your own
\r
536 // handler routines in your application code.
\r
537 //*****************************************************************************
\r
538 WEAK_AV void NMI_Handler(void)
\r
542 WEAK_AV void HardFault_Handler(void)
\r
546 WEAK_AV void MemManage_Handler(void)
\r
550 WEAK_AV void BusFault_Handler(void)
\r
554 WEAK_AV void UsageFault_Handler(void)
\r
558 WEAK_AV void SVC_Handler(void)
\r
562 WEAK_AV void DebugMon_Handler(void)
\r
566 WEAK_AV void PendSV_Handler(void)
\r
570 WEAK_AV void SysTick_Handler(void)
\r
574 //*****************************************************************************
\r
575 // Processor ends up here if an unexpected interrupt occurs or a specific
\r
576 // handler is not present in the application code.
\r
577 //*****************************************************************************
\r
578 WEAK_AV void IntDefaultHandler(void)
\r
582 //*****************************************************************************
\r
583 // Default application exception handlers. Override the ones here by defining
\r
584 // your own handler routines in your application code. These routines call
\r
585 // driver exception handlers or IntDefaultHandler() if no driver exception
\r
586 // handler is included.
\r
587 //*****************************************************************************
\r
588 WEAK void WDT_BOD_IRQHandler(void)
\r
589 { WDT_BOD_DriverIRQHandler();
\r
592 WEAK void DMA0_IRQHandler(void)
\r
593 { DMA0_DriverIRQHandler();
\r
596 WEAK void GINT0_IRQHandler(void)
\r
597 { GINT0_DriverIRQHandler();
\r
600 WEAK void GINT1_IRQHandler(void)
\r
601 { GINT1_DriverIRQHandler();
\r
604 WEAK void PIN_INT0_IRQHandler(void)
\r
605 { PIN_INT0_DriverIRQHandler();
\r
608 WEAK void PIN_INT1_IRQHandler(void)
\r
609 { PIN_INT1_DriverIRQHandler();
\r
612 WEAK void PIN_INT2_IRQHandler(void)
\r
613 { PIN_INT2_DriverIRQHandler();
\r
616 WEAK void PIN_INT3_IRQHandler(void)
\r
617 { PIN_INT3_DriverIRQHandler();
\r
620 WEAK void UTICK0_IRQHandler(void)
\r
621 { UTICK0_DriverIRQHandler();
\r
624 WEAK void MRT0_IRQHandler(void)
\r
625 { MRT0_DriverIRQHandler();
\r
628 WEAK void CTIMER0_IRQHandler(void)
\r
629 { CTIMER0_DriverIRQHandler();
\r
632 WEAK void CTIMER1_IRQHandler(void)
\r
633 { CTIMER1_DriverIRQHandler();
\r
636 WEAK void SCT0_IRQHandler(void)
\r
637 { SCT0_DriverIRQHandler();
\r
640 WEAK void CTIMER3_IRQHandler(void)
\r
641 { CTIMER3_DriverIRQHandler();
\r
644 WEAK void FLEXCOMM0_IRQHandler(void)
\r
645 { FLEXCOMM0_DriverIRQHandler();
\r
648 WEAK void FLEXCOMM1_IRQHandler(void)
\r
649 { FLEXCOMM1_DriverIRQHandler();
\r
652 WEAK void FLEXCOMM2_IRQHandler(void)
\r
653 { FLEXCOMM2_DriverIRQHandler();
\r
656 WEAK void FLEXCOMM3_IRQHandler(void)
\r
657 { FLEXCOMM3_DriverIRQHandler();
\r
660 WEAK void FLEXCOMM4_IRQHandler(void)
\r
661 { FLEXCOMM4_DriverIRQHandler();
\r
664 WEAK void FLEXCOMM5_IRQHandler(void)
\r
665 { FLEXCOMM5_DriverIRQHandler();
\r
668 WEAK void FLEXCOMM6_IRQHandler(void)
\r
669 { FLEXCOMM6_DriverIRQHandler();
\r
672 WEAK void FLEXCOMM7_IRQHandler(void)
\r
673 { FLEXCOMM7_DriverIRQHandler();
\r
676 WEAK void ADC0_SEQA_IRQHandler(void)
\r
677 { ADC0_SEQA_DriverIRQHandler();
\r
680 WEAK void ADC0_SEQB_IRQHandler(void)
\r
681 { ADC0_SEQB_DriverIRQHandler();
\r
684 WEAK void ADC0_THCMP_IRQHandler(void)
\r
685 { ADC0_THCMP_DriverIRQHandler();
\r
688 WEAK void DMIC0_IRQHandler(void)
\r
689 { DMIC0_DriverIRQHandler();
\r
692 WEAK void HWVAD0_IRQHandler(void)
\r
693 { HWVAD0_DriverIRQHandler();
\r
696 WEAK void USB0_NEEDCLK_IRQHandler(void)
\r
697 { USB0_NEEDCLK_DriverIRQHandler();
\r
700 WEAK void USB0_IRQHandler(void)
\r
701 { USB0_DriverIRQHandler();
\r
704 WEAK void RTC_IRQHandler(void)
\r
705 { RTC_DriverIRQHandler();
\r
708 WEAK void FLEXCOMM10_IRQHandler(void)
\r
709 { FLEXCOMM10_DriverIRQHandler();
\r
712 WEAK void Reserved47_IRQHandler(void)
\r
713 { Reserved47_DriverIRQHandler();
\r
716 WEAK void PIN_INT4_IRQHandler(void)
\r
717 { PIN_INT4_DriverIRQHandler();
\r
720 WEAK void PIN_INT5_IRQHandler(void)
\r
721 { PIN_INT5_DriverIRQHandler();
\r
724 WEAK void PIN_INT6_IRQHandler(void)
\r
725 { PIN_INT6_DriverIRQHandler();
\r
728 WEAK void PIN_INT7_IRQHandler(void)
\r
729 { PIN_INT7_DriverIRQHandler();
\r
732 WEAK void CTIMER2_IRQHandler(void)
\r
733 { CTIMER2_DriverIRQHandler();
\r
736 WEAK void CTIMER4_IRQHandler(void)
\r
737 { CTIMER4_DriverIRQHandler();
\r
740 WEAK void RIT_IRQHandler(void)
\r
741 { RIT_DriverIRQHandler();
\r
744 WEAK void SPIFI0_IRQHandler(void)
\r
745 { SPIFI0_DriverIRQHandler();
\r
748 WEAK void FLEXCOMM8_IRQHandler(void)
\r
749 { FLEXCOMM8_DriverIRQHandler();
\r
752 WEAK void FLEXCOMM9_IRQHandler(void)
\r
753 { FLEXCOMM9_DriverIRQHandler();
\r
756 WEAK void SDIO_IRQHandler(void)
\r
757 { SDIO_DriverIRQHandler();
\r
760 WEAK void CAN0_IRQ0_IRQHandler(void)
\r
761 { CAN0_IRQ0_DriverIRQHandler();
\r
764 WEAK void CAN0_IRQ1_IRQHandler(void)
\r
765 { CAN0_IRQ1_DriverIRQHandler();
\r
768 WEAK void CAN1_IRQ0_IRQHandler(void)
\r
769 { CAN1_IRQ0_DriverIRQHandler();
\r
772 WEAK void CAN1_IRQ1_IRQHandler(void)
\r
773 { CAN1_IRQ1_DriverIRQHandler();
\r
776 WEAK void USB1_IRQHandler(void)
\r
777 { USB1_DriverIRQHandler();
\r
780 WEAK void USB1_NEEDCLK_IRQHandler(void)
\r
781 { USB1_NEEDCLK_DriverIRQHandler();
\r
784 WEAK void ETHERNET_IRQHandler(void)
\r
785 { ETHERNET_DriverIRQHandler();
\r
788 WEAK void ETHERNET_PMT_IRQHandler(void)
\r
789 { ETHERNET_PMT_DriverIRQHandler();
\r
792 WEAK void ETHERNET_MACLP_IRQHandler(void)
\r
793 { ETHERNET_MACLP_DriverIRQHandler();
\r
796 WEAK void Reserved68_IRQHandler(void)
\r
797 { Reserved68_DriverIRQHandler();
\r
800 WEAK void LCD_IRQHandler(void)
\r
801 { LCD_DriverIRQHandler();
\r
804 WEAK void SHA_IRQHandler(void)
\r
805 { SHA_DriverIRQHandler();
\r
808 WEAK void SMARTCARD0_IRQHandler(void)
\r
809 { SMARTCARD0_DriverIRQHandler();
\r
812 WEAK void SMARTCARD1_IRQHandler(void)
\r
813 { SMARTCARD1_DriverIRQHandler();
\r
816 //*****************************************************************************
\r
818 #if defined (DEBUG)
\r
819 #pragma GCC pop_options
\r