Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependents: Nucleo_Hello_Encoder BLE_iBeaconScan AM1805_DEMO DISCO-F429ZI_ExportTemplate1 ... more
targets/cmsis/TARGET_NXP/TARGET_LPC82X/TARGET_LPC824/TOOLCHAIN_GCC_CR/startup_LPC824_CR.cpp@147:30b64687e01f, 2016-09-16 (annotated)
- Committer:
- <>
- Date:
- Fri Sep 16 16:24:25 2016 +0100
- Revision:
- 147:30b64687e01f
- Parent:
- 144:ef7eb2e8f9f7
This updates the lib to the mbed lib v126
Who changed what in which revision?
| User | Revision | Line number | New contents of line |
|---|---|---|---|
| <> | 144:ef7eb2e8f9f7 | 1 | //***************************************************************************** |
| <> | 144:ef7eb2e8f9f7 | 2 | // LPC82x Microcontroller Startup code for use with LPCXpresso IDE |
| <> | 144:ef7eb2e8f9f7 | 3 | // |
| <> | 144:ef7eb2e8f9f7 | 4 | // Version : 140901 |
| <> | 144:ef7eb2e8f9f7 | 5 | //***************************************************************************** |
| <> | 144:ef7eb2e8f9f7 | 6 | // |
| <> | 144:ef7eb2e8f9f7 | 7 | // Copyright(C) NXP Semiconductors, 2014 |
| <> | 144:ef7eb2e8f9f7 | 8 | // All rights reserved. |
| <> | 144:ef7eb2e8f9f7 | 9 | // |
| <> | 144:ef7eb2e8f9f7 | 10 | // Software that is described herein is for illustrative purposes only |
| <> | 144:ef7eb2e8f9f7 | 11 | // which provides customers with programming information regarding the |
| <> | 144:ef7eb2e8f9f7 | 12 | // LPC products. This software is supplied "AS IS" without any warranties of |
| <> | 144:ef7eb2e8f9f7 | 13 | // any kind, and NXP Semiconductors and its licensor disclaim any and |
| <> | 144:ef7eb2e8f9f7 | 14 | // all warranties, express or implied, including all implied warranties of |
| <> | 144:ef7eb2e8f9f7 | 15 | // merchantability, fitness for a particular purpose and non-infringement of |
| <> | 144:ef7eb2e8f9f7 | 16 | // intellectual property rights. NXP Semiconductors assumes no responsibility |
| <> | 144:ef7eb2e8f9f7 | 17 | // or liability for the use of the software, conveys no license or rights under any |
| <> | 144:ef7eb2e8f9f7 | 18 | // patent, copyright, mask work right, or any other intellectual property rights in |
| <> | 144:ef7eb2e8f9f7 | 19 | // or to any products. NXP Semiconductors reserves the right to make changes |
| <> | 144:ef7eb2e8f9f7 | 20 | // in the software without notification. NXP Semiconductors also makes no |
| <> | 144:ef7eb2e8f9f7 | 21 | // representation or warranty that such application will be suitable for the |
| <> | 144:ef7eb2e8f9f7 | 22 | // specified use without further testing or modification. |
| <> | 144:ef7eb2e8f9f7 | 23 | // |
| <> | 144:ef7eb2e8f9f7 | 24 | // Permission to use, copy, modify, and distribute this software and its |
| <> | 144:ef7eb2e8f9f7 | 25 | // documentation is hereby granted, under NXP Semiconductors' and its |
| <> | 144:ef7eb2e8f9f7 | 26 | // licensor's relevant copyrights in the software, without fee, provided that it |
| <> | 144:ef7eb2e8f9f7 | 27 | // is used in conjunction with NXP Semiconductors microcontrollers. This |
| <> | 144:ef7eb2e8f9f7 | 28 | // copyright, permission, and disclaimer notice must appear in all copies of |
| <> | 144:ef7eb2e8f9f7 | 29 | // this code. |
| <> | 144:ef7eb2e8f9f7 | 30 | //***************************************************************************** |
| <> | 144:ef7eb2e8f9f7 | 31 | |
| <> | 144:ef7eb2e8f9f7 | 32 | #if defined (__cplusplus) |
| <> | 144:ef7eb2e8f9f7 | 33 | #ifdef __REDLIB__ |
| <> | 144:ef7eb2e8f9f7 | 34 | #error Redlib does not support C++ |
| <> | 144:ef7eb2e8f9f7 | 35 | #else |
| <> | 144:ef7eb2e8f9f7 | 36 | //***************************************************************************** |
| <> | 144:ef7eb2e8f9f7 | 37 | // |
| <> | 144:ef7eb2e8f9f7 | 38 | // The entry point for the C++ library startup |
| <> | 144:ef7eb2e8f9f7 | 39 | // |
| <> | 144:ef7eb2e8f9f7 | 40 | //***************************************************************************** |
| <> | 144:ef7eb2e8f9f7 | 41 | extern "C" { |
| <> | 144:ef7eb2e8f9f7 | 42 | extern void __libc_init_array(void); |
| <> | 144:ef7eb2e8f9f7 | 43 | } |
| <> | 144:ef7eb2e8f9f7 | 44 | #endif |
| <> | 144:ef7eb2e8f9f7 | 45 | #endif |
| <> | 144:ef7eb2e8f9f7 | 46 | |
| <> | 144:ef7eb2e8f9f7 | 47 | #define WEAK __attribute__ ((weak)) |
| <> | 144:ef7eb2e8f9f7 | 48 | #define ALIAS(f) __attribute__ ((weak, alias (#f))) |
| <> | 144:ef7eb2e8f9f7 | 49 | |
| <> | 144:ef7eb2e8f9f7 | 50 | //***************************************************************************** |
| <> | 144:ef7eb2e8f9f7 | 51 | #if defined (__cplusplus) |
| <> | 144:ef7eb2e8f9f7 | 52 | extern "C" { |
| <> | 144:ef7eb2e8f9f7 | 53 | #endif |
| <> | 144:ef7eb2e8f9f7 | 54 | |
| <> | 144:ef7eb2e8f9f7 | 55 | //***************************************************************************** |
| <> | 144:ef7eb2e8f9f7 | 56 | #if defined (__USE_CMSIS) || defined (__USE_LPCOPEN) |
| <> | 144:ef7eb2e8f9f7 | 57 | // Declaration of external SystemInit function |
| <> | 144:ef7eb2e8f9f7 | 58 | extern void SystemInit(void); |
| <> | 144:ef7eb2e8f9f7 | 59 | #endif |
| <> | 144:ef7eb2e8f9f7 | 60 | |
| <> | 144:ef7eb2e8f9f7 | 61 | // Patch the AEABI integer divide functions to use MCU's romdivide library |
| <> | 144:ef7eb2e8f9f7 | 62 | #ifdef __USE_ROMDIVIDE |
| <> | 144:ef7eb2e8f9f7 | 63 | // Location in memory that holds the address of the ROM Driver table |
| <> | 144:ef7eb2e8f9f7 | 64 | #define PTR_ROM_DRIVER_TABLE ((unsigned int *)(0x1FFF1FF8)) |
| <> | 144:ef7eb2e8f9f7 | 65 | // Variables to store addresses of idiv and udiv functions within MCU ROM |
| <> | 144:ef7eb2e8f9f7 | 66 | unsigned int *pDivRom_idiv; |
| <> | 144:ef7eb2e8f9f7 | 67 | unsigned int *pDivRom_uidiv; |
| <> | 144:ef7eb2e8f9f7 | 68 | #endif |
| <> | 144:ef7eb2e8f9f7 | 69 | |
| <> | 144:ef7eb2e8f9f7 | 70 | //***************************************************************************** |
| <> | 144:ef7eb2e8f9f7 | 71 | // |
| <> | 144:ef7eb2e8f9f7 | 72 | // Forward declaration of the default handlers. These are aliased. |
| <> | 144:ef7eb2e8f9f7 | 73 | // When the application defines a handler (with the same name), this will |
| <> | 144:ef7eb2e8f9f7 | 74 | // automatically take precedence over these weak definitions |
| <> | 144:ef7eb2e8f9f7 | 75 | // |
| <> | 144:ef7eb2e8f9f7 | 76 | //***************************************************************************** |
| <> | 144:ef7eb2e8f9f7 | 77 | void ResetISR(void); |
| <> | 144:ef7eb2e8f9f7 | 78 | WEAK void NMI_Handler(void); |
| <> | 144:ef7eb2e8f9f7 | 79 | WEAK void HardFault_Handler(void); |
| <> | 144:ef7eb2e8f9f7 | 80 | WEAK void SVC_Handler(void); |
| <> | 144:ef7eb2e8f9f7 | 81 | WEAK void PendSV_Handler(void); |
| <> | 144:ef7eb2e8f9f7 | 82 | WEAK void SysTick_Handler(void); |
| <> | 144:ef7eb2e8f9f7 | 83 | WEAK void IntDefaultHandler(void); |
| <> | 144:ef7eb2e8f9f7 | 84 | |
| <> | 144:ef7eb2e8f9f7 | 85 | //***************************************************************************** |
| <> | 144:ef7eb2e8f9f7 | 86 | // |
| <> | 144:ef7eb2e8f9f7 | 87 | // Forward declaration of the specific IRQ handlers. These are aliased |
| <> | 144:ef7eb2e8f9f7 | 88 | // to the IntDefaultHandler, which is a 'forever' loop. When the application |
| <> | 144:ef7eb2e8f9f7 | 89 | // defines a handler (with the same name), this will automatically take |
| <> | 144:ef7eb2e8f9f7 | 90 | // precedence over these weak definitions |
| <> | 144:ef7eb2e8f9f7 | 91 | // |
| <> | 144:ef7eb2e8f9f7 | 92 | //***************************************************************************** |
| <> | 144:ef7eb2e8f9f7 | 93 | void SPI0_IRQHandler(void) ALIAS(IntDefaultHandler); |
| <> | 144:ef7eb2e8f9f7 | 94 | void SPI1_IRQHandler(void) ALIAS(IntDefaultHandler); |
| <> | 144:ef7eb2e8f9f7 | 95 | void UART0_IRQHandler(void) ALIAS(IntDefaultHandler); |
| <> | 144:ef7eb2e8f9f7 | 96 | void UART1_IRQHandler(void) ALIAS(IntDefaultHandler); |
| <> | 144:ef7eb2e8f9f7 | 97 | void UART2_IRQHandler(void) ALIAS(IntDefaultHandler); |
| <> | 144:ef7eb2e8f9f7 | 98 | void I2C1_IRQHandler(void) ALIAS(IntDefaultHandler); |
| <> | 144:ef7eb2e8f9f7 | 99 | void I2C0_IRQHandler(void) ALIAS(IntDefaultHandler); |
| <> | 144:ef7eb2e8f9f7 | 100 | void SCT_IRQHandler(void) ALIAS(IntDefaultHandler); |
| <> | 144:ef7eb2e8f9f7 | 101 | void MRT_IRQHandler(void) ALIAS(IntDefaultHandler); |
| <> | 144:ef7eb2e8f9f7 | 102 | void CMP_IRQHandler(void) ALIAS(IntDefaultHandler); |
| <> | 144:ef7eb2e8f9f7 | 103 | void WDT_IRQHandler(void) ALIAS(IntDefaultHandler); |
| <> | 144:ef7eb2e8f9f7 | 104 | void BOD_IRQHandler(void) ALIAS(IntDefaultHandler); |
| <> | 144:ef7eb2e8f9f7 | 105 | void FLASH_IRQHandler(void) ALIAS(IntDefaultHandler); |
| <> | 144:ef7eb2e8f9f7 | 106 | void WKT_IRQHandler(void) ALIAS(IntDefaultHandler); |
| <> | 144:ef7eb2e8f9f7 | 107 | void ADC_SEQA_IRQHandler(void) ALIAS(IntDefaultHandler); |
| <> | 144:ef7eb2e8f9f7 | 108 | void ADC_SEQB_IRQHandler(void) ALIAS(IntDefaultHandler); |
| <> | 144:ef7eb2e8f9f7 | 109 | void ADC_THCMP_IRQHandler(void) ALIAS(IntDefaultHandler); |
| <> | 144:ef7eb2e8f9f7 | 110 | void ADC_OVR_IRQHandler(void) ALIAS(IntDefaultHandler); |
| <> | 144:ef7eb2e8f9f7 | 111 | void DMA_IRQHandler(void) ALIAS(IntDefaultHandler); |
| <> | 144:ef7eb2e8f9f7 | 112 | void I2C2_IRQHandler(void) ALIAS(IntDefaultHandler); |
| <> | 144:ef7eb2e8f9f7 | 113 | void I2C3_IRQHandler(void) ALIAS(IntDefaultHandler); |
| <> | 144:ef7eb2e8f9f7 | 114 | void PIN_INT0_IRQHandler(void) ALIAS(IntDefaultHandler); |
| <> | 144:ef7eb2e8f9f7 | 115 | void PIN_INT1_IRQHandler(void) ALIAS(IntDefaultHandler); |
| <> | 144:ef7eb2e8f9f7 | 116 | void PIN_INT2_IRQHandler(void) ALIAS(IntDefaultHandler); |
| <> | 144:ef7eb2e8f9f7 | 117 | void PIN_INT3_IRQHandler(void) ALIAS(IntDefaultHandler); |
| <> | 144:ef7eb2e8f9f7 | 118 | void PIN_INT4_IRQHandler(void) ALIAS(IntDefaultHandler); |
| <> | 144:ef7eb2e8f9f7 | 119 | void PIN_INT5_IRQHandler(void) ALIAS(IntDefaultHandler); |
| <> | 144:ef7eb2e8f9f7 | 120 | void PIN_INT6_IRQHandler(void) ALIAS(IntDefaultHandler); |
| <> | 144:ef7eb2e8f9f7 | 121 | void PIN_INT7_IRQHandler(void) ALIAS(IntDefaultHandler); |
| <> | 144:ef7eb2e8f9f7 | 122 | //***************************************************************************** |
| <> | 144:ef7eb2e8f9f7 | 123 | // |
| <> | 144:ef7eb2e8f9f7 | 124 | // The entry point for the application. |
| <> | 144:ef7eb2e8f9f7 | 125 | // __main() is the entry point for Redlib based applications |
| <> | 144:ef7eb2e8f9f7 | 126 | // main() is the entry point for Newlib based applications |
| <> | 144:ef7eb2e8f9f7 | 127 | // |
| <> | 144:ef7eb2e8f9f7 | 128 | //***************************************************************************** |
| <> | 144:ef7eb2e8f9f7 | 129 | #if defined (__REDLIB__) |
| <> | 144:ef7eb2e8f9f7 | 130 | extern void __main(void); |
| <> | 144:ef7eb2e8f9f7 | 131 | #else |
| <> | 144:ef7eb2e8f9f7 | 132 | extern int main(void); |
| <> | 144:ef7eb2e8f9f7 | 133 | #endif |
| <> | 144:ef7eb2e8f9f7 | 134 | //***************************************************************************** |
| <> | 144:ef7eb2e8f9f7 | 135 | // |
| <> | 144:ef7eb2e8f9f7 | 136 | // External declaration for the pointer to the stack top from the Linker Script |
| <> | 144:ef7eb2e8f9f7 | 137 | // |
| <> | 144:ef7eb2e8f9f7 | 138 | //***************************************************************************** |
| <> | 144:ef7eb2e8f9f7 | 139 | extern void _vStackTop(void); |
| <> | 144:ef7eb2e8f9f7 | 140 | |
| <> | 144:ef7eb2e8f9f7 | 141 | //***************************************************************************** |
| <> | 144:ef7eb2e8f9f7 | 142 | #if defined (__cplusplus) |
| <> | 144:ef7eb2e8f9f7 | 143 | } // extern "C" |
| <> | 144:ef7eb2e8f9f7 | 144 | #endif |
| <> | 144:ef7eb2e8f9f7 | 145 | //***************************************************************************** |
| <> | 144:ef7eb2e8f9f7 | 146 | // |
| <> | 144:ef7eb2e8f9f7 | 147 | // The vector table. |
| <> | 144:ef7eb2e8f9f7 | 148 | // This relies on the linker script to place at correct location in memory. |
| <> | 144:ef7eb2e8f9f7 | 149 | // |
| <> | 144:ef7eb2e8f9f7 | 150 | //***************************************************************************** |
| <> | 144:ef7eb2e8f9f7 | 151 | extern void (* const g_pfnVectors[])(void); |
| <> | 144:ef7eb2e8f9f7 | 152 | __attribute__ ((section(".isr_vector"))) |
| <> | 144:ef7eb2e8f9f7 | 153 | void (* const g_pfnVectors[])(void) = { |
| <> | 144:ef7eb2e8f9f7 | 154 | // Core Level - CM0plus |
| <> | 144:ef7eb2e8f9f7 | 155 | &_vStackTop, // The initial stack pointer |
| <> | 144:ef7eb2e8f9f7 | 156 | ResetISR, // The reset handler |
| <> | 144:ef7eb2e8f9f7 | 157 | NMI_Handler, // The NMI handler |
| <> | 144:ef7eb2e8f9f7 | 158 | HardFault_Handler, // The hard fault handler |
| <> | 144:ef7eb2e8f9f7 | 159 | 0, // Reserved |
| <> | 144:ef7eb2e8f9f7 | 160 | 0, // Reserved |
| <> | 144:ef7eb2e8f9f7 | 161 | 0, // Reserved |
| <> | 144:ef7eb2e8f9f7 | 162 | 0, // Reserved |
| <> | 144:ef7eb2e8f9f7 | 163 | 0, // Reserved |
| <> | 144:ef7eb2e8f9f7 | 164 | 0, // Reserved |
| <> | 144:ef7eb2e8f9f7 | 165 | 0, // Reserved |
| <> | 144:ef7eb2e8f9f7 | 166 | SVC_Handler, // SVCall handler |
| <> | 144:ef7eb2e8f9f7 | 167 | 0, // Reserved |
| <> | 144:ef7eb2e8f9f7 | 168 | 0, // Reserved |
| <> | 144:ef7eb2e8f9f7 | 169 | PendSV_Handler, // The PendSV handler |
| <> | 144:ef7eb2e8f9f7 | 170 | SysTick_Handler, // The SysTick handler |
| <> | 144:ef7eb2e8f9f7 | 171 | |
| <> | 144:ef7eb2e8f9f7 | 172 | // Chip Level - LPC82x |
| <> | 144:ef7eb2e8f9f7 | 173 | SPI0_IRQHandler, // SPI0 controller |
| <> | 144:ef7eb2e8f9f7 | 174 | SPI1_IRQHandler, // SPI1 controller |
| <> | 144:ef7eb2e8f9f7 | 175 | 0, // Reserved |
| <> | 144:ef7eb2e8f9f7 | 176 | UART0_IRQHandler, // UART0 |
| <> | 144:ef7eb2e8f9f7 | 177 | UART1_IRQHandler, // UART1 |
| <> | 144:ef7eb2e8f9f7 | 178 | UART2_IRQHandler, // UART2 |
| <> | 144:ef7eb2e8f9f7 | 179 | 0, // Reserved |
| <> | 144:ef7eb2e8f9f7 | 180 | I2C1_IRQHandler, // I2C1 controller |
| <> | 144:ef7eb2e8f9f7 | 181 | I2C0_IRQHandler, // I2C0 controller |
| <> | 144:ef7eb2e8f9f7 | 182 | SCT_IRQHandler, // Smart Counter Timer |
| <> | 144:ef7eb2e8f9f7 | 183 | MRT_IRQHandler, // Multi-Rate Timer |
| <> | 144:ef7eb2e8f9f7 | 184 | CMP_IRQHandler, // Comparator |
| <> | 144:ef7eb2e8f9f7 | 185 | WDT_IRQHandler, // Watchdog |
| <> | 144:ef7eb2e8f9f7 | 186 | BOD_IRQHandler, // Brown Out Detect |
| <> | 144:ef7eb2e8f9f7 | 187 | FLASH_IRQHandler, // Flash Interrupt |
| <> | 144:ef7eb2e8f9f7 | 188 | WKT_IRQHandler, // Wakeup timer |
| <> | 144:ef7eb2e8f9f7 | 189 | ADC_SEQA_IRQHandler, // ADC sequence A completion |
| <> | 144:ef7eb2e8f9f7 | 190 | ADC_SEQB_IRQHandler, // ADC sequence B completion |
| <> | 144:ef7eb2e8f9f7 | 191 | ADC_THCMP_IRQHandler, // ADC threshold compare |
| <> | 144:ef7eb2e8f9f7 | 192 | ADC_OVR_IRQHandler, // ADC overrun |
| <> | 144:ef7eb2e8f9f7 | 193 | DMA_IRQHandler, // DMA |
| <> | 144:ef7eb2e8f9f7 | 194 | I2C2_IRQHandler, // I2C2 controller |
| <> | 144:ef7eb2e8f9f7 | 195 | I2C3_IRQHandler, // I2C3 controller |
| <> | 144:ef7eb2e8f9f7 | 196 | 0, // Reserved |
| <> | 144:ef7eb2e8f9f7 | 197 | PIN_INT0_IRQHandler, // PIO INT0 |
| <> | 144:ef7eb2e8f9f7 | 198 | PIN_INT1_IRQHandler, // PIO INT1 |
| <> | 144:ef7eb2e8f9f7 | 199 | PIN_INT2_IRQHandler, // PIO INT2 |
| <> | 144:ef7eb2e8f9f7 | 200 | PIN_INT3_IRQHandler, // PIO INT3 |
| <> | 144:ef7eb2e8f9f7 | 201 | PIN_INT4_IRQHandler, // PIO INT4 |
| <> | 144:ef7eb2e8f9f7 | 202 | PIN_INT5_IRQHandler, // PIO INT5 |
| <> | 144:ef7eb2e8f9f7 | 203 | PIN_INT6_IRQHandler, // PIO INT6 |
| <> | 144:ef7eb2e8f9f7 | 204 | PIN_INT7_IRQHandler, // PIO INT7 |
| <> | 144:ef7eb2e8f9f7 | 205 | }; /* End of g_pfnVectors */ |
| <> | 144:ef7eb2e8f9f7 | 206 | |
| <> | 144:ef7eb2e8f9f7 | 207 | //***************************************************************************** |
| <> | 144:ef7eb2e8f9f7 | 208 | // Functions to carry out the initialization of RW and BSS data sections. These |
| <> | 144:ef7eb2e8f9f7 | 209 | // are written as separate functions rather than being inlined within the |
| <> | 144:ef7eb2e8f9f7 | 210 | // ResetISR() function in order to cope with MCUs with multiple banks of |
| <> | 144:ef7eb2e8f9f7 | 211 | // memory. |
| <> | 144:ef7eb2e8f9f7 | 212 | //***************************************************************************** |
| <> | 144:ef7eb2e8f9f7 | 213 | __attribute__ ((section(".after_vectors"))) |
| <> | 144:ef7eb2e8f9f7 | 214 | void data_init(unsigned int romstart, unsigned int start, unsigned int len) { |
| <> | 144:ef7eb2e8f9f7 | 215 | unsigned int *pulDest = (unsigned int*) start; |
| <> | 144:ef7eb2e8f9f7 | 216 | unsigned int *pulSrc = (unsigned int*) romstart; |
| <> | 144:ef7eb2e8f9f7 | 217 | unsigned int loop; |
| <> | 144:ef7eb2e8f9f7 | 218 | for (loop = 0; loop < len; loop = loop + 4) |
| <> | 144:ef7eb2e8f9f7 | 219 | *pulDest++ = *pulSrc++; |
| <> | 144:ef7eb2e8f9f7 | 220 | } |
| <> | 144:ef7eb2e8f9f7 | 221 | |
| <> | 144:ef7eb2e8f9f7 | 222 | __attribute__ ((section(".after_vectors"))) |
| <> | 144:ef7eb2e8f9f7 | 223 | void bss_init(unsigned int start, unsigned int len) { |
| <> | 144:ef7eb2e8f9f7 | 224 | unsigned int *pulDest = (unsigned int*) start; |
| <> | 144:ef7eb2e8f9f7 | 225 | unsigned int loop; |
| <> | 144:ef7eb2e8f9f7 | 226 | for (loop = 0; loop < len; loop = loop + 4) |
| <> | 144:ef7eb2e8f9f7 | 227 | *pulDest++ = 0; |
| <> | 144:ef7eb2e8f9f7 | 228 | } |
| <> | 144:ef7eb2e8f9f7 | 229 | |
| <> | 144:ef7eb2e8f9f7 | 230 | //***************************************************************************** |
| <> | 144:ef7eb2e8f9f7 | 231 | // The following symbols are constructs generated by the linker, indicating |
| <> | 144:ef7eb2e8f9f7 | 232 | // the location of various points in the "Global Section Table". This table is |
| <> | 144:ef7eb2e8f9f7 | 233 | // created by the linker via the Code Red managed linker script mechanism. It |
| <> | 144:ef7eb2e8f9f7 | 234 | // contains the load address, execution address and length of each RW data |
| <> | 144:ef7eb2e8f9f7 | 235 | // section and the execution and length of each BSS (zero initialized) section. |
| <> | 144:ef7eb2e8f9f7 | 236 | //***************************************************************************** |
| <> | 144:ef7eb2e8f9f7 | 237 | extern unsigned int __data_section_table; |
| <> | 144:ef7eb2e8f9f7 | 238 | extern unsigned int __data_section_table_end; |
| <> | 144:ef7eb2e8f9f7 | 239 | extern unsigned int __bss_section_table; |
| <> | 144:ef7eb2e8f9f7 | 240 | extern unsigned int __bss_section_table_end; |
| <> | 144:ef7eb2e8f9f7 | 241 | |
| <> | 144:ef7eb2e8f9f7 | 242 | |
| <> | 144:ef7eb2e8f9f7 | 243 | //***************************************************************************** |
| <> | 144:ef7eb2e8f9f7 | 244 | // Reset entry point for your code. |
| <> | 144:ef7eb2e8f9f7 | 245 | // Sets up a simple runtime environment and initializes the C/C++ |
| <> | 144:ef7eb2e8f9f7 | 246 | // library. |
| <> | 144:ef7eb2e8f9f7 | 247 | //***************************************************************************** |
| <> | 144:ef7eb2e8f9f7 | 248 | __attribute__ ((section(".after_vectors"))) |
| <> | 144:ef7eb2e8f9f7 | 249 | void |
| <> | 144:ef7eb2e8f9f7 | 250 | ResetISR(void) { |
| <> | 144:ef7eb2e8f9f7 | 251 | |
| <> | 144:ef7eb2e8f9f7 | 252 | // |
| <> | 144:ef7eb2e8f9f7 | 253 | // Copy the data sections from flash to SRAM. |
| <> | 144:ef7eb2e8f9f7 | 254 | // |
| <> | 144:ef7eb2e8f9f7 | 255 | unsigned int LoadAddr, ExeAddr, SectionLen; |
| <> | 144:ef7eb2e8f9f7 | 256 | unsigned int *SectionTableAddr; |
| <> | 144:ef7eb2e8f9f7 | 257 | |
| <> | 144:ef7eb2e8f9f7 | 258 | // Load base address of Global Section Table |
| <> | 144:ef7eb2e8f9f7 | 259 | SectionTableAddr = &__data_section_table; |
| <> | 144:ef7eb2e8f9f7 | 260 | |
| <> | 144:ef7eb2e8f9f7 | 261 | // Copy the data sections from flash to SRAM. |
| <> | 144:ef7eb2e8f9f7 | 262 | while (SectionTableAddr < &__data_section_table_end) { |
| <> | 144:ef7eb2e8f9f7 | 263 | LoadAddr = *SectionTableAddr++; |
| <> | 144:ef7eb2e8f9f7 | 264 | ExeAddr = *SectionTableAddr++; |
| <> | 144:ef7eb2e8f9f7 | 265 | SectionLen = *SectionTableAddr++; |
| <> | 144:ef7eb2e8f9f7 | 266 | data_init(LoadAddr, ExeAddr, SectionLen); |
| <> | 144:ef7eb2e8f9f7 | 267 | } |
| <> | 144:ef7eb2e8f9f7 | 268 | // At this point, SectionTableAddr = &__bss_section_table; |
| <> | 144:ef7eb2e8f9f7 | 269 | // Zero fill the bss segment |
| <> | 144:ef7eb2e8f9f7 | 270 | while (SectionTableAddr < &__bss_section_table_end) { |
| <> | 144:ef7eb2e8f9f7 | 271 | ExeAddr = *SectionTableAddr++; |
| <> | 144:ef7eb2e8f9f7 | 272 | SectionLen = *SectionTableAddr++; |
| <> | 144:ef7eb2e8f9f7 | 273 | bss_init(ExeAddr, SectionLen); |
| <> | 144:ef7eb2e8f9f7 | 274 | } |
| <> | 144:ef7eb2e8f9f7 | 275 | |
| <> | 144:ef7eb2e8f9f7 | 276 | // Patch the AEABI integer divide functions to use MCU's romdivide library |
| <> | 144:ef7eb2e8f9f7 | 277 | #ifdef __USE_ROMDIVIDE |
| <> | 144:ef7eb2e8f9f7 | 278 | // Get address of Integer division routines function table in ROM |
| <> | 144:ef7eb2e8f9f7 | 279 | unsigned int *div_ptr = (unsigned int *)((unsigned int *)*(PTR_ROM_DRIVER_TABLE))[4]; |
| <> | 144:ef7eb2e8f9f7 | 280 | // Get addresses of integer divide routines in ROM |
| <> | 144:ef7eb2e8f9f7 | 281 | // These address are then used by the code in aeabi_romdiv_patch.s |
| <> | 144:ef7eb2e8f9f7 | 282 | pDivRom_idiv = (unsigned int *)div_ptr[0]; |
| <> | 144:ef7eb2e8f9f7 | 283 | pDivRom_uidiv = (unsigned int *)div_ptr[1]; |
| <> | 144:ef7eb2e8f9f7 | 284 | #endif |
| <> | 144:ef7eb2e8f9f7 | 285 | |
| <> | 144:ef7eb2e8f9f7 | 286 | #if defined (__USE_CMSIS) || defined (__USE_LPCOPEN) |
| <> | 144:ef7eb2e8f9f7 | 287 | SystemInit(); |
| <> | 144:ef7eb2e8f9f7 | 288 | #endif |
| <> | 144:ef7eb2e8f9f7 | 289 | |
| <> | 144:ef7eb2e8f9f7 | 290 | #if defined (__cplusplus) |
| <> | 144:ef7eb2e8f9f7 | 291 | // |
| <> | 144:ef7eb2e8f9f7 | 292 | // Call C++ library initialisation |
| <> | 144:ef7eb2e8f9f7 | 293 | // |
| <> | 144:ef7eb2e8f9f7 | 294 | __libc_init_array(); |
| <> | 144:ef7eb2e8f9f7 | 295 | #endif |
| <> | 144:ef7eb2e8f9f7 | 296 | |
| <> | 144:ef7eb2e8f9f7 | 297 | #if defined (__REDLIB__) |
| <> | 144:ef7eb2e8f9f7 | 298 | // Call the Redlib library, which in turn calls main() |
| <> | 144:ef7eb2e8f9f7 | 299 | __main() ; |
| <> | 144:ef7eb2e8f9f7 | 300 | #else |
| <> | 144:ef7eb2e8f9f7 | 301 | main(); |
| <> | 144:ef7eb2e8f9f7 | 302 | #endif |
| <> | 144:ef7eb2e8f9f7 | 303 | |
| <> | 144:ef7eb2e8f9f7 | 304 | // |
| <> | 144:ef7eb2e8f9f7 | 305 | // main() shouldn't return, but if it does, we'll just enter an infinite loop |
| <> | 144:ef7eb2e8f9f7 | 306 | // |
| <> | 144:ef7eb2e8f9f7 | 307 | while (1) { |
| <> | 144:ef7eb2e8f9f7 | 308 | ; |
| <> | 144:ef7eb2e8f9f7 | 309 | } |
| <> | 144:ef7eb2e8f9f7 | 310 | } |
| <> | 144:ef7eb2e8f9f7 | 311 | |
| <> | 144:ef7eb2e8f9f7 | 312 | //***************************************************************************** |
| <> | 144:ef7eb2e8f9f7 | 313 | // Default exception handlers. Override the ones here by defining your own |
| <> | 144:ef7eb2e8f9f7 | 314 | // handler routines in your application code. |
| <> | 144:ef7eb2e8f9f7 | 315 | //***************************************************************************** |
| <> | 144:ef7eb2e8f9f7 | 316 | __attribute__ ((section(".after_vectors"))) |
| <> | 144:ef7eb2e8f9f7 | 317 | void NMI_Handler(void) |
| <> | 144:ef7eb2e8f9f7 | 318 | { while(1) {} |
| <> | 144:ef7eb2e8f9f7 | 319 | } |
| <> | 144:ef7eb2e8f9f7 | 320 | |
| <> | 144:ef7eb2e8f9f7 | 321 | __attribute__ ((section(".after_vectors"))) |
| <> | 144:ef7eb2e8f9f7 | 322 | void HardFault_Handler(void) |
| <> | 144:ef7eb2e8f9f7 | 323 | { while(1) {} |
| <> | 144:ef7eb2e8f9f7 | 324 | } |
| <> | 144:ef7eb2e8f9f7 | 325 | |
| <> | 144:ef7eb2e8f9f7 | 326 | __attribute__ ((section(".after_vectors"))) |
| <> | 144:ef7eb2e8f9f7 | 327 | void SVC_Handler(void) |
| <> | 144:ef7eb2e8f9f7 | 328 | { while(1) {} |
| <> | 144:ef7eb2e8f9f7 | 329 | } |
| <> | 144:ef7eb2e8f9f7 | 330 | |
| <> | 144:ef7eb2e8f9f7 | 331 | __attribute__ ((section(".after_vectors"))) |
| <> | 144:ef7eb2e8f9f7 | 332 | void PendSV_Handler(void) |
| <> | 144:ef7eb2e8f9f7 | 333 | { while(1) {} |
| <> | 144:ef7eb2e8f9f7 | 334 | } |
| <> | 144:ef7eb2e8f9f7 | 335 | |
| <> | 144:ef7eb2e8f9f7 | 336 | __attribute__ ((section(".after_vectors"))) |
| <> | 144:ef7eb2e8f9f7 | 337 | void SysTick_Handler(void) |
| <> | 144:ef7eb2e8f9f7 | 338 | { while(1) {} |
| <> | 144:ef7eb2e8f9f7 | 339 | } |
| <> | 144:ef7eb2e8f9f7 | 340 | |
| <> | 144:ef7eb2e8f9f7 | 341 | //***************************************************************************** |
| <> | 144:ef7eb2e8f9f7 | 342 | // |
| <> | 144:ef7eb2e8f9f7 | 343 | // Processor ends up here if an unexpected interrupt occurs or a specific |
| <> | 144:ef7eb2e8f9f7 | 344 | // handler is not present in the application code. |
| <> | 144:ef7eb2e8f9f7 | 345 | // |
| <> | 144:ef7eb2e8f9f7 | 346 | //***************************************************************************** |
| <> | 144:ef7eb2e8f9f7 | 347 | __attribute__ ((section(".after_vectors"))) |
| <> | 144:ef7eb2e8f9f7 | 348 | void IntDefaultHandler(void) |
| <> | 144:ef7eb2e8f9f7 | 349 | { while(1) {} |
| <> | 144:ef7eb2e8f9f7 | 350 | } |
| <> | 144:ef7eb2e8f9f7 | 351 |


