mbed library sources. Supersedes mbed-src.
Fork of mbed by
targets/cmsis/TARGET_NXP/TARGET_LPC408X/TOOLCHAIN_GCC_CR/startup_lpc407x_8x.cpp@0:9b334a45a8ff, 2015-10-01 (annotated)
- Committer:
- bogdanm
- Date:
- Thu Oct 01 15:25:22 2015 +0300
- Revision:
- 0:9b334a45a8ff
- Child:
- 144:ef7eb2e8f9f7
Initial commit on mbed-dev
Replaces mbed-src (now inactive)
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
bogdanm | 0:9b334a45a8ff | 1 | //***************************************************************************** |
bogdanm | 0:9b334a45a8ff | 2 | // +--+ |
bogdanm | 0:9b334a45a8ff | 3 | // | ++----+ |
bogdanm | 0:9b334a45a8ff | 4 | // +-++ | |
bogdanm | 0:9b334a45a8ff | 5 | // | | |
bogdanm | 0:9b334a45a8ff | 6 | // +-+--+ | |
bogdanm | 0:9b334a45a8ff | 7 | // | +--+--+ |
bogdanm | 0:9b334a45a8ff | 8 | // +----+ Copyright (c) 2012 Code Red Technologies Ltd. |
bogdanm | 0:9b334a45a8ff | 9 | // |
bogdanm | 0:9b334a45a8ff | 10 | // LPC407x_8x Microcontroller Startup code for use with Red Suite |
bogdanm | 0:9b334a45a8ff | 11 | // |
bogdanm | 0:9b334a45a8ff | 12 | // Version : 120624 |
bogdanm | 0:9b334a45a8ff | 13 | // |
bogdanm | 0:9b334a45a8ff | 14 | // Software License Agreement |
bogdanm | 0:9b334a45a8ff | 15 | // |
bogdanm | 0:9b334a45a8ff | 16 | // The software is owned by Code Red Technologies and/or its suppliers, and is |
bogdanm | 0:9b334a45a8ff | 17 | // protected under applicable copyright laws. All rights are reserved. Any |
bogdanm | 0:9b334a45a8ff | 18 | // use in violation of the foregoing restrictions may subject the user to criminal |
bogdanm | 0:9b334a45a8ff | 19 | // sanctions under applicable laws, as well as to civil liability for the breach |
bogdanm | 0:9b334a45a8ff | 20 | // of the terms and conditions of this license. |
bogdanm | 0:9b334a45a8ff | 21 | // |
bogdanm | 0:9b334a45a8ff | 22 | // THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED |
bogdanm | 0:9b334a45a8ff | 23 | // OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF |
bogdanm | 0:9b334a45a8ff | 24 | // MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. |
bogdanm | 0:9b334a45a8ff | 25 | // USE OF THIS SOFTWARE FOR COMMERCIAL DEVELOPMENT AND/OR EDUCATION IS SUBJECT |
bogdanm | 0:9b334a45a8ff | 26 | // TO A CURRENT END USER LICENSE AGREEMENT (COMMERCIAL OR EDUCATIONAL) WITH |
bogdanm | 0:9b334a45a8ff | 27 | // CODE RED TECHNOLOGIES LTD. |
bogdanm | 0:9b334a45a8ff | 28 | // |
bogdanm | 0:9b334a45a8ff | 29 | //***************************************************************************** |
bogdanm | 0:9b334a45a8ff | 30 | #if defined (__cplusplus) |
bogdanm | 0:9b334a45a8ff | 31 | #ifdef __REDLIB__ |
bogdanm | 0:9b334a45a8ff | 32 | #error Redlib does not support C++ |
bogdanm | 0:9b334a45a8ff | 33 | #else |
bogdanm | 0:9b334a45a8ff | 34 | //***************************************************************************** |
bogdanm | 0:9b334a45a8ff | 35 | // |
bogdanm | 0:9b334a45a8ff | 36 | // The entry point for the C++ library startup |
bogdanm | 0:9b334a45a8ff | 37 | // |
bogdanm | 0:9b334a45a8ff | 38 | //***************************************************************************** |
bogdanm | 0:9b334a45a8ff | 39 | extern "C" { |
bogdanm | 0:9b334a45a8ff | 40 | extern void __libc_init_array(void); |
bogdanm | 0:9b334a45a8ff | 41 | } |
bogdanm | 0:9b334a45a8ff | 42 | #endif |
bogdanm | 0:9b334a45a8ff | 43 | #endif |
bogdanm | 0:9b334a45a8ff | 44 | |
bogdanm | 0:9b334a45a8ff | 45 | #define WEAK __attribute__ ((weak)) |
bogdanm | 0:9b334a45a8ff | 46 | #define ALIAS(f) __attribute__ ((weak, alias (#f))) |
bogdanm | 0:9b334a45a8ff | 47 | |
bogdanm | 0:9b334a45a8ff | 48 | //#if defined (__USE_CMSIS) |
bogdanm | 0:9b334a45a8ff | 49 | #include "LPC407x_8x_177x_8x.h" |
bogdanm | 0:9b334a45a8ff | 50 | //#endif |
bogdanm | 0:9b334a45a8ff | 51 | |
bogdanm | 0:9b334a45a8ff | 52 | //***************************************************************************** |
bogdanm | 0:9b334a45a8ff | 53 | #if defined (__cplusplus) |
bogdanm | 0:9b334a45a8ff | 54 | extern "C" { |
bogdanm | 0:9b334a45a8ff | 55 | #endif |
bogdanm | 0:9b334a45a8ff | 56 | |
bogdanm | 0:9b334a45a8ff | 57 | //***************************************************************************** |
bogdanm | 0:9b334a45a8ff | 58 | // |
bogdanm | 0:9b334a45a8ff | 59 | // Forward declaration of the default handlers. These are aliased. |
bogdanm | 0:9b334a45a8ff | 60 | // When the application defines a handler (with the same name), this will |
bogdanm | 0:9b334a45a8ff | 61 | // automatically take precedence over these weak definitions |
bogdanm | 0:9b334a45a8ff | 62 | // |
bogdanm | 0:9b334a45a8ff | 63 | //***************************************************************************** |
bogdanm | 0:9b334a45a8ff | 64 | void ResetISR(void); |
bogdanm | 0:9b334a45a8ff | 65 | WEAK void NMI_Handler(void); |
bogdanm | 0:9b334a45a8ff | 66 | WEAK void HardFault_Handler(void); |
bogdanm | 0:9b334a45a8ff | 67 | WEAK void MemManage_Handler(void); |
bogdanm | 0:9b334a45a8ff | 68 | WEAK void BusFault_Handler(void); |
bogdanm | 0:9b334a45a8ff | 69 | WEAK void UsageFault_Handler(void); |
bogdanm | 0:9b334a45a8ff | 70 | WEAK void SVC_Handler(void); |
bogdanm | 0:9b334a45a8ff | 71 | WEAK void DebugMon_Handler(void); |
bogdanm | 0:9b334a45a8ff | 72 | WEAK void PendSV_Handler(void); |
bogdanm | 0:9b334a45a8ff | 73 | WEAK void SysTick_Handler(void); |
bogdanm | 0:9b334a45a8ff | 74 | WEAK void IntDefaultHandler(void); |
bogdanm | 0:9b334a45a8ff | 75 | |
bogdanm | 0:9b334a45a8ff | 76 | //***************************************************************************** |
bogdanm | 0:9b334a45a8ff | 77 | // |
bogdanm | 0:9b334a45a8ff | 78 | // Forward declaration of the specific IRQ handlers. These are aliased |
bogdanm | 0:9b334a45a8ff | 79 | // to the IntDefaultHandler, which is a 'forever' loop. When the application |
bogdanm | 0:9b334a45a8ff | 80 | // defines a handler (with the same name), this will automatically take |
bogdanm | 0:9b334a45a8ff | 81 | // precedence over these weak definitions |
bogdanm | 0:9b334a45a8ff | 82 | // |
bogdanm | 0:9b334a45a8ff | 83 | //***************************************************************************** |
bogdanm | 0:9b334a45a8ff | 84 | void WDT_IRQHandler(void) ALIAS(IntDefaultHandler); |
bogdanm | 0:9b334a45a8ff | 85 | void TIMER0_IRQHandler(void) ALIAS(IntDefaultHandler); |
bogdanm | 0:9b334a45a8ff | 86 | void TIMER1_IRQHandler(void) ALIAS(IntDefaultHandler); |
bogdanm | 0:9b334a45a8ff | 87 | void TIMER2_IRQHandler(void) ALIAS(IntDefaultHandler); |
bogdanm | 0:9b334a45a8ff | 88 | void TIMER3_IRQHandler(void) ALIAS(IntDefaultHandler); |
bogdanm | 0:9b334a45a8ff | 89 | void UART0_IRQHandler(void) ALIAS(IntDefaultHandler); |
bogdanm | 0:9b334a45a8ff | 90 | void UART1_IRQHandler(void) ALIAS(IntDefaultHandler); |
bogdanm | 0:9b334a45a8ff | 91 | void UART2_IRQHandler(void) ALIAS(IntDefaultHandler); |
bogdanm | 0:9b334a45a8ff | 92 | void UART3_IRQHandler(void) ALIAS(IntDefaultHandler); |
bogdanm | 0:9b334a45a8ff | 93 | void PWM1_IRQHandler(void) ALIAS(IntDefaultHandler); |
bogdanm | 0:9b334a45a8ff | 94 | void I2C0_IRQHandler(void) ALIAS(IntDefaultHandler); |
bogdanm | 0:9b334a45a8ff | 95 | void I2C1_IRQHandler(void) ALIAS(IntDefaultHandler); |
bogdanm | 0:9b334a45a8ff | 96 | void I2C2_IRQHandler(void) ALIAS(IntDefaultHandler); |
bogdanm | 0:9b334a45a8ff | 97 | void SPI_IRQHandler(void) ALIAS(IntDefaultHandler); |
bogdanm | 0:9b334a45a8ff | 98 | void SSP0_IRQHandler(void) ALIAS(IntDefaultHandler); |
bogdanm | 0:9b334a45a8ff | 99 | void SSP1_IRQHandler(void) ALIAS(IntDefaultHandler); |
bogdanm | 0:9b334a45a8ff | 100 | void PLL0_IRQHandler(void) ALIAS(IntDefaultHandler); |
bogdanm | 0:9b334a45a8ff | 101 | void RTC_IRQHandler(void) ALIAS(IntDefaultHandler); |
bogdanm | 0:9b334a45a8ff | 102 | void EINT0_IRQHandler(void) ALIAS(IntDefaultHandler); |
bogdanm | 0:9b334a45a8ff | 103 | void EINT1_IRQHandler(void) ALIAS(IntDefaultHandler); |
bogdanm | 0:9b334a45a8ff | 104 | void EINT2_IRQHandler(void) ALIAS(IntDefaultHandler); |
bogdanm | 0:9b334a45a8ff | 105 | void EINT3_IRQHandler(void) ALIAS(IntDefaultHandler); |
bogdanm | 0:9b334a45a8ff | 106 | void ADC_IRQHandler(void) ALIAS(IntDefaultHandler); |
bogdanm | 0:9b334a45a8ff | 107 | void BOD_IRQHandler(void) ALIAS(IntDefaultHandler); |
bogdanm | 0:9b334a45a8ff | 108 | void USB_IRQHandler(void) ALIAS(IntDefaultHandler); |
bogdanm | 0:9b334a45a8ff | 109 | void CAN_IRQHandler(void) ALIAS(IntDefaultHandler); |
bogdanm | 0:9b334a45a8ff | 110 | void DMA_IRQHandler(void) ALIAS(IntDefaultHandler); |
bogdanm | 0:9b334a45a8ff | 111 | void I2S_IRQHandler(void) ALIAS(IntDefaultHandler); |
bogdanm | 0:9b334a45a8ff | 112 | void ENET_IRQHandler(void) ALIAS(IntDefaultHandler); |
bogdanm | 0:9b334a45a8ff | 113 | void RIT_IRQHandler(void) ALIAS(IntDefaultHandler); |
bogdanm | 0:9b334a45a8ff | 114 | void MCPWM_IRQHandler(void) ALIAS(IntDefaultHandler); |
bogdanm | 0:9b334a45a8ff | 115 | void QEI_IRQHandler(void) ALIAS(IntDefaultHandler); |
bogdanm | 0:9b334a45a8ff | 116 | void PLL1_IRQHandler(void) ALIAS(IntDefaultHandler); |
bogdanm | 0:9b334a45a8ff | 117 | void USBActivity_IRQHandler(void) ALIAS(IntDefaultHandler); |
bogdanm | 0:9b334a45a8ff | 118 | void CANActivity_IRQHandler(void) ALIAS(IntDefaultHandler); |
bogdanm | 0:9b334a45a8ff | 119 | void MCI_IRQHandler(void) ALIAS(IntDefaultHandler); |
bogdanm | 0:9b334a45a8ff | 120 | void UART4_IRQHandler(void) ALIAS(IntDefaultHandler); |
bogdanm | 0:9b334a45a8ff | 121 | void SSP2_IRQHandler(void) ALIAS(IntDefaultHandler); |
bogdanm | 0:9b334a45a8ff | 122 | void LCD_IRQHandler(void) ALIAS(IntDefaultHandler); |
bogdanm | 0:9b334a45a8ff | 123 | void GPIO_IRQHandler(void) ALIAS(IntDefaultHandler); |
bogdanm | 0:9b334a45a8ff | 124 | void PWM0_IRQHandler(void) ALIAS(IntDefaultHandler); |
bogdanm | 0:9b334a45a8ff | 125 | void EEPROM_IRQHandler(void) ALIAS(IntDefaultHandler); |
bogdanm | 0:9b334a45a8ff | 126 | |
bogdanm | 0:9b334a45a8ff | 127 | //***************************************************************************** |
bogdanm | 0:9b334a45a8ff | 128 | // |
bogdanm | 0:9b334a45a8ff | 129 | // The entry point for the application. |
bogdanm | 0:9b334a45a8ff | 130 | // __main() is the entry point for Redlib based applications |
bogdanm | 0:9b334a45a8ff | 131 | // main() is the entry point for Newlib based applications |
bogdanm | 0:9b334a45a8ff | 132 | // |
bogdanm | 0:9b334a45a8ff | 133 | //***************************************************************************** |
bogdanm | 0:9b334a45a8ff | 134 | #if defined (__REDLIB__) |
bogdanm | 0:9b334a45a8ff | 135 | extern void __main(void); |
bogdanm | 0:9b334a45a8ff | 136 | #endif |
bogdanm | 0:9b334a45a8ff | 137 | extern int main(void); |
bogdanm | 0:9b334a45a8ff | 138 | //***************************************************************************** |
bogdanm | 0:9b334a45a8ff | 139 | // |
bogdanm | 0:9b334a45a8ff | 140 | // External declaration for the pointer to the stack top from the Linker Script |
bogdanm | 0:9b334a45a8ff | 141 | // |
bogdanm | 0:9b334a45a8ff | 142 | //***************************************************************************** |
bogdanm | 0:9b334a45a8ff | 143 | extern void _vStackTop(void); |
bogdanm | 0:9b334a45a8ff | 144 | |
bogdanm | 0:9b334a45a8ff | 145 | //***************************************************************************** |
bogdanm | 0:9b334a45a8ff | 146 | #if defined (__cplusplus) |
bogdanm | 0:9b334a45a8ff | 147 | } // extern "C" |
bogdanm | 0:9b334a45a8ff | 148 | #endif |
bogdanm | 0:9b334a45a8ff | 149 | //***************************************************************************** |
bogdanm | 0:9b334a45a8ff | 150 | // |
bogdanm | 0:9b334a45a8ff | 151 | // The vector table. |
bogdanm | 0:9b334a45a8ff | 152 | // This relies on the linker script to place at correct location in memory. |
bogdanm | 0:9b334a45a8ff | 153 | // |
bogdanm | 0:9b334a45a8ff | 154 | //***************************************************************************** |
bogdanm | 0:9b334a45a8ff | 155 | extern void (* const g_pfnVectors[])(void); |
bogdanm | 0:9b334a45a8ff | 156 | __attribute__ ((section(".isr_vector"))) |
bogdanm | 0:9b334a45a8ff | 157 | void (* const g_pfnVectors[])(void) = { |
bogdanm | 0:9b334a45a8ff | 158 | // Core Level - CM3 |
bogdanm | 0:9b334a45a8ff | 159 | &_vStackTop, // The initial stack pointer |
bogdanm | 0:9b334a45a8ff | 160 | ResetISR, // The reset handler |
bogdanm | 0:9b334a45a8ff | 161 | NMI_Handler, // The NMI handler |
bogdanm | 0:9b334a45a8ff | 162 | HardFault_Handler, // The hard fault handler |
bogdanm | 0:9b334a45a8ff | 163 | MemManage_Handler, // The MPU fault handler |
bogdanm | 0:9b334a45a8ff | 164 | BusFault_Handler, // The bus fault handler |
bogdanm | 0:9b334a45a8ff | 165 | UsageFault_Handler, // The usage fault handler |
bogdanm | 0:9b334a45a8ff | 166 | 0, // Reserved |
bogdanm | 0:9b334a45a8ff | 167 | 0, // Reserved |
bogdanm | 0:9b334a45a8ff | 168 | 0, // Reserved |
bogdanm | 0:9b334a45a8ff | 169 | 0, // Reserved |
bogdanm | 0:9b334a45a8ff | 170 | SVC_Handler, // SVCall handler |
bogdanm | 0:9b334a45a8ff | 171 | DebugMon_Handler, // Debug monitor handler |
bogdanm | 0:9b334a45a8ff | 172 | 0, // Reserved |
bogdanm | 0:9b334a45a8ff | 173 | PendSV_Handler, // The PendSV handler |
bogdanm | 0:9b334a45a8ff | 174 | SysTick_Handler, // The SysTick handler |
bogdanm | 0:9b334a45a8ff | 175 | |
bogdanm | 0:9b334a45a8ff | 176 | // Chip Level - LPC17 |
bogdanm | 0:9b334a45a8ff | 177 | WDT_IRQHandler, // 16, 0x40 - WDT |
bogdanm | 0:9b334a45a8ff | 178 | TIMER0_IRQHandler, // 17, 0x44 - TIMER0 |
bogdanm | 0:9b334a45a8ff | 179 | TIMER1_IRQHandler, // 18, 0x48 - TIMER1 |
bogdanm | 0:9b334a45a8ff | 180 | TIMER2_IRQHandler, // 19, 0x4c - TIMER2 |
bogdanm | 0:9b334a45a8ff | 181 | TIMER3_IRQHandler, // 20, 0x50 - TIMER3 |
bogdanm | 0:9b334a45a8ff | 182 | UART0_IRQHandler, // 21, 0x54 - UART0 |
bogdanm | 0:9b334a45a8ff | 183 | UART1_IRQHandler, // 22, 0x58 - UART1 |
bogdanm | 0:9b334a45a8ff | 184 | UART2_IRQHandler, // 23, 0x5c - UART2 |
bogdanm | 0:9b334a45a8ff | 185 | UART3_IRQHandler, // 24, 0x60 - UART3 |
bogdanm | 0:9b334a45a8ff | 186 | PWM1_IRQHandler, // 25, 0x64 - PWM1 |
bogdanm | 0:9b334a45a8ff | 187 | I2C0_IRQHandler, // 26, 0x68 - I2C0 |
bogdanm | 0:9b334a45a8ff | 188 | I2C1_IRQHandler, // 27, 0x6c - I2C1 |
bogdanm | 0:9b334a45a8ff | 189 | I2C2_IRQHandler, // 28, 0x70 - I2C2 |
bogdanm | 0:9b334a45a8ff | 190 | IntDefaultHandler, // 29, Not used |
bogdanm | 0:9b334a45a8ff | 191 | SSP0_IRQHandler, // 30, 0x78 - SSP0 |
bogdanm | 0:9b334a45a8ff | 192 | SSP1_IRQHandler, // 31, 0x7c - SSP1 |
bogdanm | 0:9b334a45a8ff | 193 | PLL0_IRQHandler, // 32, 0x80 - PLL0 (Main PLL) |
bogdanm | 0:9b334a45a8ff | 194 | RTC_IRQHandler, // 33, 0x84 - RTC |
bogdanm | 0:9b334a45a8ff | 195 | EINT0_IRQHandler, // 34, 0x88 - EINT0 |
bogdanm | 0:9b334a45a8ff | 196 | EINT1_IRQHandler, // 35, 0x8c - EINT1 |
bogdanm | 0:9b334a45a8ff | 197 | EINT2_IRQHandler, // 36, 0x90 - EINT2 |
bogdanm | 0:9b334a45a8ff | 198 | EINT3_IRQHandler, // 37, 0x94 - EINT3 |
bogdanm | 0:9b334a45a8ff | 199 | ADC_IRQHandler, // 38, 0x98 - ADC |
bogdanm | 0:9b334a45a8ff | 200 | BOD_IRQHandler, // 39, 0x9c - BOD |
bogdanm | 0:9b334a45a8ff | 201 | USB_IRQHandler, // 40, 0xA0 - USB |
bogdanm | 0:9b334a45a8ff | 202 | CAN_IRQHandler, // 41, 0xa4 - CAN |
bogdanm | 0:9b334a45a8ff | 203 | DMA_IRQHandler, // 42, 0xa8 - GP DMA |
bogdanm | 0:9b334a45a8ff | 204 | I2S_IRQHandler, // 43, 0xac - I2S |
bogdanm | 0:9b334a45a8ff | 205 | ENET_IRQHandler, // 44, 0xb0 - Ethernet |
bogdanm | 0:9b334a45a8ff | 206 | MCI_IRQHandler, // 45, 0xb4 - SD/MMC card I/F |
bogdanm | 0:9b334a45a8ff | 207 | MCPWM_IRQHandler, // 46, 0xb8 - Motor Control PWM |
bogdanm | 0:9b334a45a8ff | 208 | QEI_IRQHandler, // 47, 0xbc - Quadrature Encoder |
bogdanm | 0:9b334a45a8ff | 209 | PLL1_IRQHandler, // 48, 0xc0 - PLL1 (USB PLL) |
bogdanm | 0:9b334a45a8ff | 210 | USBActivity_IRQHandler, // 49, 0xc4 - USB Activity interrupt to wakeup |
bogdanm | 0:9b334a45a8ff | 211 | CANActivity_IRQHandler, // 50, 0xc8 - CAN Activity interrupt to wakeup |
bogdanm | 0:9b334a45a8ff | 212 | UART4_IRQHandler, // 51, 0xcc - UART4 |
bogdanm | 0:9b334a45a8ff | 213 | |
bogdanm | 0:9b334a45a8ff | 214 | SSP2_IRQHandler, // 52, 0xd0 - SSP2 |
bogdanm | 0:9b334a45a8ff | 215 | LCD_IRQHandler, // 53, 0xd4 - LCD |
bogdanm | 0:9b334a45a8ff | 216 | GPIO_IRQHandler, // 54, 0xd8 - GPIO |
bogdanm | 0:9b334a45a8ff | 217 | PWM0_IRQHandler, // 55, 0xdc - PWM0 |
bogdanm | 0:9b334a45a8ff | 218 | EEPROM_IRQHandler, // 56, 0xe0 - EEPROM |
bogdanm | 0:9b334a45a8ff | 219 | |
bogdanm | 0:9b334a45a8ff | 220 | }; |
bogdanm | 0:9b334a45a8ff | 221 | |
bogdanm | 0:9b334a45a8ff | 222 | //***************************************************************************** |
bogdanm | 0:9b334a45a8ff | 223 | // Functions to carry out the initialization of RW and BSS data sections. These |
bogdanm | 0:9b334a45a8ff | 224 | // are written as separate functions rather than being inlined within the |
bogdanm | 0:9b334a45a8ff | 225 | // ResetISR() function in order to cope with MCUs with multiple banks of |
bogdanm | 0:9b334a45a8ff | 226 | // memory. |
bogdanm | 0:9b334a45a8ff | 227 | //***************************************************************************** |
bogdanm | 0:9b334a45a8ff | 228 | __attribute__ ((section(".after_vectors"))) |
bogdanm | 0:9b334a45a8ff | 229 | void data_init(unsigned int romstart, unsigned int start, unsigned int len) { |
bogdanm | 0:9b334a45a8ff | 230 | unsigned int *pulDest = (unsigned int*) start; |
bogdanm | 0:9b334a45a8ff | 231 | unsigned int *pulSrc = (unsigned int*) romstart; |
bogdanm | 0:9b334a45a8ff | 232 | unsigned int loop; |
bogdanm | 0:9b334a45a8ff | 233 | for (loop = 0; loop < len; loop = loop + 4) |
bogdanm | 0:9b334a45a8ff | 234 | *pulDest++ = *pulSrc++; |
bogdanm | 0:9b334a45a8ff | 235 | } |
bogdanm | 0:9b334a45a8ff | 236 | |
bogdanm | 0:9b334a45a8ff | 237 | __attribute__ ((section(".after_vectors"))) |
bogdanm | 0:9b334a45a8ff | 238 | void bss_init(unsigned int start, unsigned int len) { |
bogdanm | 0:9b334a45a8ff | 239 | unsigned int *pulDest = (unsigned int*) start; |
bogdanm | 0:9b334a45a8ff | 240 | unsigned int loop; |
bogdanm | 0:9b334a45a8ff | 241 | for (loop = 0; loop < len; loop = loop + 4) |
bogdanm | 0:9b334a45a8ff | 242 | *pulDest++ = 0; |
bogdanm | 0:9b334a45a8ff | 243 | } |
bogdanm | 0:9b334a45a8ff | 244 | |
bogdanm | 0:9b334a45a8ff | 245 | //***************************************************************************** |
bogdanm | 0:9b334a45a8ff | 246 | // The following symbols are constructs generated by the linker, indicating |
bogdanm | 0:9b334a45a8ff | 247 | // the location of various points in the "Global Section Table". This table is |
bogdanm | 0:9b334a45a8ff | 248 | // created by the linker via the Code Red managed linker script mechanism. It |
bogdanm | 0:9b334a45a8ff | 249 | // contains the load address, execution address and length of each RW data |
bogdanm | 0:9b334a45a8ff | 250 | // section and the execution and length of each BSS (zero initialized) section. |
bogdanm | 0:9b334a45a8ff | 251 | //***************************************************************************** |
bogdanm | 0:9b334a45a8ff | 252 | extern unsigned int __data_section_table; |
bogdanm | 0:9b334a45a8ff | 253 | extern unsigned int __data_section_table_end; |
bogdanm | 0:9b334a45a8ff | 254 | extern unsigned int __bss_section_table; |
bogdanm | 0:9b334a45a8ff | 255 | extern unsigned int __bss_section_table_end; |
bogdanm | 0:9b334a45a8ff | 256 | |
bogdanm | 0:9b334a45a8ff | 257 | //***************************************************************************** |
bogdanm | 0:9b334a45a8ff | 258 | // Reset entry point for your code. |
bogdanm | 0:9b334a45a8ff | 259 | // Sets up a simple runtime environment and initializes the C/C++ |
bogdanm | 0:9b334a45a8ff | 260 | // library. |
bogdanm | 0:9b334a45a8ff | 261 | //***************************************************************************** |
bogdanm | 0:9b334a45a8ff | 262 | |
bogdanm | 0:9b334a45a8ff | 263 | extern "C" void software_init_hook(void) __attribute__((weak)); |
bogdanm | 0:9b334a45a8ff | 264 | |
bogdanm | 0:9b334a45a8ff | 265 | __attribute__ ((section(".after_vectors"))) |
bogdanm | 0:9b334a45a8ff | 266 | void |
bogdanm | 0:9b334a45a8ff | 267 | ResetISR(void) { |
bogdanm | 0:9b334a45a8ff | 268 | |
bogdanm | 0:9b334a45a8ff | 269 | // |
bogdanm | 0:9b334a45a8ff | 270 | // Copy the data sections from flash to SRAM. |
bogdanm | 0:9b334a45a8ff | 271 | // |
bogdanm | 0:9b334a45a8ff | 272 | unsigned int LoadAddr, ExeAddr, SectionLen; |
bogdanm | 0:9b334a45a8ff | 273 | unsigned int *SectionTableAddr; |
bogdanm | 0:9b334a45a8ff | 274 | |
bogdanm | 0:9b334a45a8ff | 275 | // Load base address of Global Section Table |
bogdanm | 0:9b334a45a8ff | 276 | SectionTableAddr = &__data_section_table; |
bogdanm | 0:9b334a45a8ff | 277 | |
bogdanm | 0:9b334a45a8ff | 278 | // Copy the data sections from flash to SRAM. |
bogdanm | 0:9b334a45a8ff | 279 | while (SectionTableAddr < &__data_section_table_end) { |
bogdanm | 0:9b334a45a8ff | 280 | LoadAddr = *SectionTableAddr++; |
bogdanm | 0:9b334a45a8ff | 281 | ExeAddr = *SectionTableAddr++; |
bogdanm | 0:9b334a45a8ff | 282 | SectionLen = *SectionTableAddr++; |
bogdanm | 0:9b334a45a8ff | 283 | data_init(LoadAddr, ExeAddr, SectionLen); |
bogdanm | 0:9b334a45a8ff | 284 | } |
bogdanm | 0:9b334a45a8ff | 285 | // At this point, SectionTableAddr = &__bss_section_table; |
bogdanm | 0:9b334a45a8ff | 286 | // Zero fill the bss segment |
bogdanm | 0:9b334a45a8ff | 287 | while (SectionTableAddr < &__bss_section_table_end) { |
bogdanm | 0:9b334a45a8ff | 288 | ExeAddr = *SectionTableAddr++; |
bogdanm | 0:9b334a45a8ff | 289 | SectionLen = *SectionTableAddr++; |
bogdanm | 0:9b334a45a8ff | 290 | bss_init(ExeAddr, SectionLen); |
bogdanm | 0:9b334a45a8ff | 291 | } |
bogdanm | 0:9b334a45a8ff | 292 | |
bogdanm | 0:9b334a45a8ff | 293 | #if defined (__VFP_FP__) && !defined (__SOFTFP__) |
bogdanm | 0:9b334a45a8ff | 294 | /* |
bogdanm | 0:9b334a45a8ff | 295 | * Code to enable the Cortex-M4 FPU only included |
bogdanm | 0:9b334a45a8ff | 296 | * if appropriate build options have been selected. |
bogdanm | 0:9b334a45a8ff | 297 | * Code taken from Section 7.1, Cortex-M4 TRM (DDI0439C) |
bogdanm | 0:9b334a45a8ff | 298 | */ |
bogdanm | 0:9b334a45a8ff | 299 | // Read CPACR (located at address 0xE000ED88) |
bogdanm | 0:9b334a45a8ff | 300 | // Set bits 20-23 to enable CP10 and CP11 coprocessors |
bogdanm | 0:9b334a45a8ff | 301 | // Write back the modified value to the CPACR |
bogdanm | 0:9b334a45a8ff | 302 | asm volatile ("LDR.W R0, =0xE000ED88\n\t" |
bogdanm | 0:9b334a45a8ff | 303 | "LDR R1, [R0]\n\t" |
bogdanm | 0:9b334a45a8ff | 304 | "ORR R1, R1, #(0xF << 20)\n\t" |
bogdanm | 0:9b334a45a8ff | 305 | "STR R1, [R0]"); |
bogdanm | 0:9b334a45a8ff | 306 | #endif // (__VFP_FP__) && !(__SOFTFP__) |
bogdanm | 0:9b334a45a8ff | 307 | |
bogdanm | 0:9b334a45a8ff | 308 | // Check to see if we are running the code from a non-zero |
bogdanm | 0:9b334a45a8ff | 309 | // address (eg RAM, external flash), in which case we need |
bogdanm | 0:9b334a45a8ff | 310 | // to modify the VTOR register to tell the CPU that the |
bogdanm | 0:9b334a45a8ff | 311 | // vector table is located at a non-0x0 address. |
bogdanm | 0:9b334a45a8ff | 312 | |
bogdanm | 0:9b334a45a8ff | 313 | // Note that we do not use the CMSIS register access mechanism, |
bogdanm | 0:9b334a45a8ff | 314 | // as there is no guarantee that the project has been configured |
bogdanm | 0:9b334a45a8ff | 315 | // to use CMSIS. |
bogdanm | 0:9b334a45a8ff | 316 | unsigned int * pSCB_VTOR = (unsigned int *) 0xE000ED08; |
bogdanm | 0:9b334a45a8ff | 317 | if ((unsigned int *)g_pfnVectors!=(unsigned int *) 0x00000000) { |
bogdanm | 0:9b334a45a8ff | 318 | // CMSIS : SCB->VTOR = <address of vector table> |
bogdanm | 0:9b334a45a8ff | 319 | *pSCB_VTOR = (unsigned int)g_pfnVectors; |
bogdanm | 0:9b334a45a8ff | 320 | } |
bogdanm | 0:9b334a45a8ff | 321 | |
bogdanm | 0:9b334a45a8ff | 322 | //#ifdef __USE_CMSIS |
bogdanm | 0:9b334a45a8ff | 323 | SystemInit(); |
bogdanm | 0:9b334a45a8ff | 324 | //#endif |
bogdanm | 0:9b334a45a8ff | 325 | if (software_init_hook) // give control to the RTOS |
bogdanm | 0:9b334a45a8ff | 326 | software_init_hook(); // this will also call __libc_init_array |
bogdanm | 0:9b334a45a8ff | 327 | else { |
bogdanm | 0:9b334a45a8ff | 328 | #if defined (__cplusplus) |
bogdanm | 0:9b334a45a8ff | 329 | // |
bogdanm | 0:9b334a45a8ff | 330 | // Call C++ library initialisation |
bogdanm | 0:9b334a45a8ff | 331 | // |
bogdanm | 0:9b334a45a8ff | 332 | __libc_init_array(); |
bogdanm | 0:9b334a45a8ff | 333 | #endif |
bogdanm | 0:9b334a45a8ff | 334 | |
bogdanm | 0:9b334a45a8ff | 335 | #if defined (__REDLIB__) |
bogdanm | 0:9b334a45a8ff | 336 | // Call the Redlib library, which in turn calls main() |
bogdanm | 0:9b334a45a8ff | 337 | __main() ; |
bogdanm | 0:9b334a45a8ff | 338 | #else |
bogdanm | 0:9b334a45a8ff | 339 | main(); |
bogdanm | 0:9b334a45a8ff | 340 | #endif |
bogdanm | 0:9b334a45a8ff | 341 | } |
bogdanm | 0:9b334a45a8ff | 342 | // |
bogdanm | 0:9b334a45a8ff | 343 | // main() shouldn't return, but if it does, we'll just enter an infinite loop |
bogdanm | 0:9b334a45a8ff | 344 | // |
bogdanm | 0:9b334a45a8ff | 345 | while (1) { |
bogdanm | 0:9b334a45a8ff | 346 | ; |
bogdanm | 0:9b334a45a8ff | 347 | } |
bogdanm | 0:9b334a45a8ff | 348 | } |
bogdanm | 0:9b334a45a8ff | 349 | |
bogdanm | 0:9b334a45a8ff | 350 | //***************************************************************************** |
bogdanm | 0:9b334a45a8ff | 351 | // Default exception handlers. Override the ones here by defining your own |
bogdanm | 0:9b334a45a8ff | 352 | // handler routines in your application code. |
bogdanm | 0:9b334a45a8ff | 353 | //***************************************************************************** |
bogdanm | 0:9b334a45a8ff | 354 | __attribute__ ((section(".after_vectors"))) |
bogdanm | 0:9b334a45a8ff | 355 | void NMI_Handler(void) |
bogdanm | 0:9b334a45a8ff | 356 | { |
bogdanm | 0:9b334a45a8ff | 357 | while(1) |
bogdanm | 0:9b334a45a8ff | 358 | { |
bogdanm | 0:9b334a45a8ff | 359 | } |
bogdanm | 0:9b334a45a8ff | 360 | } |
bogdanm | 0:9b334a45a8ff | 361 | __attribute__ ((section(".after_vectors"))) |
bogdanm | 0:9b334a45a8ff | 362 | void HardFault_Handler(void) |
bogdanm | 0:9b334a45a8ff | 363 | { |
bogdanm | 0:9b334a45a8ff | 364 | while(1) |
bogdanm | 0:9b334a45a8ff | 365 | { |
bogdanm | 0:9b334a45a8ff | 366 | } |
bogdanm | 0:9b334a45a8ff | 367 | } |
bogdanm | 0:9b334a45a8ff | 368 | __attribute__ ((section(".after_vectors"))) |
bogdanm | 0:9b334a45a8ff | 369 | void MemManage_Handler(void) |
bogdanm | 0:9b334a45a8ff | 370 | { |
bogdanm | 0:9b334a45a8ff | 371 | while(1) |
bogdanm | 0:9b334a45a8ff | 372 | { |
bogdanm | 0:9b334a45a8ff | 373 | } |
bogdanm | 0:9b334a45a8ff | 374 | } |
bogdanm | 0:9b334a45a8ff | 375 | __attribute__ ((section(".after_vectors"))) |
bogdanm | 0:9b334a45a8ff | 376 | void BusFault_Handler(void) |
bogdanm | 0:9b334a45a8ff | 377 | { |
bogdanm | 0:9b334a45a8ff | 378 | while(1) |
bogdanm | 0:9b334a45a8ff | 379 | { |
bogdanm | 0:9b334a45a8ff | 380 | } |
bogdanm | 0:9b334a45a8ff | 381 | } |
bogdanm | 0:9b334a45a8ff | 382 | __attribute__ ((section(".after_vectors"))) |
bogdanm | 0:9b334a45a8ff | 383 | void UsageFault_Handler(void) |
bogdanm | 0:9b334a45a8ff | 384 | { |
bogdanm | 0:9b334a45a8ff | 385 | while(1) |
bogdanm | 0:9b334a45a8ff | 386 | { |
bogdanm | 0:9b334a45a8ff | 387 | } |
bogdanm | 0:9b334a45a8ff | 388 | } |
bogdanm | 0:9b334a45a8ff | 389 | __attribute__ ((section(".after_vectors"))) |
bogdanm | 0:9b334a45a8ff | 390 | void SVC_Handler(void) |
bogdanm | 0:9b334a45a8ff | 391 | { |
bogdanm | 0:9b334a45a8ff | 392 | while(1) |
bogdanm | 0:9b334a45a8ff | 393 | { |
bogdanm | 0:9b334a45a8ff | 394 | } |
bogdanm | 0:9b334a45a8ff | 395 | } |
bogdanm | 0:9b334a45a8ff | 396 | __attribute__ ((section(".after_vectors"))) |
bogdanm | 0:9b334a45a8ff | 397 | void DebugMon_Handler(void) |
bogdanm | 0:9b334a45a8ff | 398 | { |
bogdanm | 0:9b334a45a8ff | 399 | while(1) |
bogdanm | 0:9b334a45a8ff | 400 | { |
bogdanm | 0:9b334a45a8ff | 401 | } |
bogdanm | 0:9b334a45a8ff | 402 | } |
bogdanm | 0:9b334a45a8ff | 403 | __attribute__ ((section(".after_vectors"))) |
bogdanm | 0:9b334a45a8ff | 404 | void PendSV_Handler(void) |
bogdanm | 0:9b334a45a8ff | 405 | { |
bogdanm | 0:9b334a45a8ff | 406 | while(1) |
bogdanm | 0:9b334a45a8ff | 407 | { |
bogdanm | 0:9b334a45a8ff | 408 | } |
bogdanm | 0:9b334a45a8ff | 409 | } |
bogdanm | 0:9b334a45a8ff | 410 | __attribute__ ((section(".after_vectors"))) |
bogdanm | 0:9b334a45a8ff | 411 | void SysTick_Handler(void) |
bogdanm | 0:9b334a45a8ff | 412 | { |
bogdanm | 0:9b334a45a8ff | 413 | while(1) |
bogdanm | 0:9b334a45a8ff | 414 | { |
bogdanm | 0:9b334a45a8ff | 415 | } |
bogdanm | 0:9b334a45a8ff | 416 | } |
bogdanm | 0:9b334a45a8ff | 417 | |
bogdanm | 0:9b334a45a8ff | 418 | //***************************************************************************** |
bogdanm | 0:9b334a45a8ff | 419 | // |
bogdanm | 0:9b334a45a8ff | 420 | // Processor ends up here if an unexpected interrupt occurs or a specific |
bogdanm | 0:9b334a45a8ff | 421 | // handler is not present in the application code. |
bogdanm | 0:9b334a45a8ff | 422 | // |
bogdanm | 0:9b334a45a8ff | 423 | //***************************************************************************** |
bogdanm | 0:9b334a45a8ff | 424 | __attribute__ ((section(".after_vectors"))) |
bogdanm | 0:9b334a45a8ff | 425 | void IntDefaultHandler(void) |
bogdanm | 0:9b334a45a8ff | 426 | { |
bogdanm | 0:9b334a45a8ff | 427 | while(1) |
bogdanm | 0:9b334a45a8ff | 428 | { |
bogdanm | 0:9b334a45a8ff | 429 | } |
bogdanm | 0:9b334a45a8ff | 430 | } |
bogdanm | 0:9b334a45a8ff | 431 | |
bogdanm | 0:9b334a45a8ff | 432 | #include <stdlib.h> |
bogdanm | 0:9b334a45a8ff | 433 | |
bogdanm | 0:9b334a45a8ff | 434 | void *operator new(size_t size) {return malloc(size);} |
bogdanm | 0:9b334a45a8ff | 435 | void *operator new[](size_t size){return malloc(size);} |
bogdanm | 0:9b334a45a8ff | 436 | |
bogdanm | 0:9b334a45a8ff | 437 | void operator delete(void *p) {free(p);} |
bogdanm | 0:9b334a45a8ff | 438 | void operator delete[](void *p) {free(p);} |