mbed library sources: Modified to operate FRDM-KL25Z at 48MHz from internal 32kHz oscillator (nothing else changed).
Fork of mbed-src by
The only file that changed is: mbed-src-FLL48/targets/cmsis/TARGET_Freescale/TARGET_KL25Z/system_MKL25Z4.h
Diff: targets/cmsis/TARGET_NXP/TARGET_LPC43XX/TOOLCHAIN_GCC_CR/startup_LPC43xx.cpp
- Revision:
- 20:4263a77256ae
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/targets/cmsis/TARGET_NXP/TARGET_LPC43XX/TOOLCHAIN_GCC_CR/startup_LPC43xx.cpp Tue Sep 10 15:14:19 2013 +0300 @@ -0,0 +1,445 @@ +// ***************************************************************************** +// +--+ +// | ++----+ +// +-++ | +// | | +// +-+--+ | +// | +--+--+ +// +----+ Copyright (c) 2011-12 Code Red Technologies Ltd. +// +// LPC43xx Microcontroller Startup code for use with Red Suite +// +// Version : 120430 +// +// Software License Agreement +// +// The software is owned by Code Red Technologies and/or its suppliers, and is +// protected under applicable copyright laws. All rights are reserved. Any +// use in violation of the foregoing restrictions may subject the user to criminal +// sanctions under applicable laws, as well as to civil liability for the breach +// of the terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// USE OF THIS SOFTWARE FOR COMMERCIAL DEVELOPMENT AND/OR EDUCATION IS SUBJECT +// TO A CURRENT END USER LICENSE AGREEMENT (COMMERCIAL OR EDUCATIONAL) WITH +// CODE RED TECHNOLOGIES LTD. +// +// ***************************************************************************** +#if defined(__cplusplus) +#ifdef __REDLIB__ +#error Redlib does not support C++ +#else +// ***************************************************************************** +// +// The entry point for the C++ library startup +// +// ***************************************************************************** +extern "C" { +extern void __libc_init_array(void); + +} +#endif +#endif + +#define WEAK __attribute__ ((weak)) +#define ALIAS(f) __attribute__ ((weak, alias(# f))) + +//#if defined (__USE_CMSIS) +#include "LPC43xx.h" +//#endif + +#if defined(OS_UCOS_III) +extern void OS_CPU_PendSVHandler(void); +extern void OS_CPU_SysTickHandler (void); +#endif + +// ***************************************************************************** +#if defined(__cplusplus) +extern "C" { +#endif + +// ***************************************************************************** +// +// Forward declaration of the default handlers. These are aliased. +// When the application defines a handler (with the same name), this will +// automatically take precedence over these weak definitions +// +// ***************************************************************************** +void ResetISR(void); +WEAK void NMI_Handler(void); +WEAK void HardFault_Handler(void); +WEAK void MemManage_Handler(void); +WEAK void BusFault_Handler(void); +WEAK void UsageFault_Handler(void); +WEAK void SVC_Handler(void); +WEAK void DebugMon_Handler(void); +WEAK void PendSV_Handler(void); +WEAK void SysTick_Handler(void); +WEAK void IntDefaultHandler(void); + +// ***************************************************************************** +// +// Forward declaration of the specific IRQ handlers. These are aliased +// to the IntDefaultHandler, which is a 'forever' loop. When the application +// defines a handler (with the same name), this will automatically take +// precedence over these weak definitions +// +// ***************************************************************************** +void DAC_IRQHandler(void) ALIAS(IntDefaultHandler); +void MX_CORE_IRQHandler(void) ALIAS(IntDefaultHandler); +void DMA_IRQHandler(void) ALIAS(IntDefaultHandler); +void FLASHEEPROM_IRQHandler(void) ALIAS(IntDefaultHandler); +void ETH_IRQHandler(void) ALIAS(IntDefaultHandler); +void SDIO_IRQHandler(void) ALIAS(IntDefaultHandler); +void LCD_IRQHandler(void) ALIAS(IntDefaultHandler); +void USB0_IRQHandler(void) ALIAS(IntDefaultHandler); +void USB1_IRQHandler(void) ALIAS(IntDefaultHandler); +void SCT_IRQHandler(void) ALIAS(IntDefaultHandler); +void RIT_IRQHandler(void) ALIAS(IntDefaultHandler); +void TIMER0_IRQHandler(void) ALIAS(IntDefaultHandler); +void TIMER1_IRQHandler(void) ALIAS(IntDefaultHandler); +void TIMER2_IRQHandler(void) ALIAS(IntDefaultHandler); +void TIMER3_IRQHandler(void) ALIAS(IntDefaultHandler); +void MCPWM_IRQHandler(void) ALIAS(IntDefaultHandler); +void ADC0_IRQHandler(void) ALIAS(IntDefaultHandler); +void I2C0_IRQHandler(void) ALIAS(IntDefaultHandler); +void I2C1_IRQHandler(void) ALIAS(IntDefaultHandler); +void SPI_IRQHandler (void) ALIAS(IntDefaultHandler); +void ADC1_IRQHandler(void) ALIAS(IntDefaultHandler); +void SSP0_IRQHandler(void) ALIAS(IntDefaultHandler); +void SSP1_IRQHandler(void) ALIAS(IntDefaultHandler); +void UART0_IRQHandler(void) ALIAS(IntDefaultHandler); +void UART1_IRQHandler(void) ALIAS(IntDefaultHandler); +void UART2_IRQHandler(void) ALIAS(IntDefaultHandler); +void UART3_IRQHandler(void) ALIAS(IntDefaultHandler); +void I2S0_IRQHandler(void) ALIAS(IntDefaultHandler); +void I2S1_IRQHandler(void) ALIAS(IntDefaultHandler); +void SPIFI_IRQHandler(void) ALIAS(IntDefaultHandler); +void SGPIO_IRQHandler(void) ALIAS(IntDefaultHandler); +void GPIO0_IRQHandler(void) ALIAS(IntDefaultHandler); +void GPIO1_IRQHandler(void) ALIAS(IntDefaultHandler); +void GPIO2_IRQHandler(void) ALIAS(IntDefaultHandler); +void GPIO3_IRQHandler(void) ALIAS(IntDefaultHandler); +void GPIO4_IRQHandler(void) ALIAS(IntDefaultHandler); +void GPIO5_IRQHandler(void) ALIAS(IntDefaultHandler); +void GPIO6_IRQHandler(void) ALIAS(IntDefaultHandler); +void GPIO7_IRQHandler(void) ALIAS(IntDefaultHandler); +void GINT0_IRQHandler(void) ALIAS(IntDefaultHandler); +void GINT1_IRQHandler(void) ALIAS(IntDefaultHandler); +void EVRT_IRQHandler(void) ALIAS(IntDefaultHandler); +void CAN1_IRQHandler(void) ALIAS(IntDefaultHandler); +void ATIMER_IRQHandler(void) ALIAS(IntDefaultHandler); +void RTC_IRQHandler(void) ALIAS(IntDefaultHandler); +void WDT_IRQHandler(void) ALIAS(IntDefaultHandler); +void CAN0_IRQHandler(void) ALIAS(IntDefaultHandler); +void QEI_IRQHandler(void) ALIAS(IntDefaultHandler); + +// ***************************************************************************** +// +// The entry point for the application. +// __main() is the entry point for Redlib based applications +// main() is the entry point for Newlib based applications +// +// ***************************************************************************** +#if defined(__REDLIB__) +extern void __main(void); + +#endif +extern int main(void); + +// ***************************************************************************** +// +// External declaration for the pointer to the stack top from the Linker Script +// +// ***************************************************************************** +extern void _vStackTop(void); + +// ***************************************************************************** +// +// Application can define Stack size (If not defined, default stack size will +// used +// +// ***************************************************************************** +#ifndef STACK_SIZE +#define STACK_SIZE (0x200) +#endif + +// ***************************************************************************** +// +// Application can define Heap size (If not defined, default Heap size will +// used +// +// ***************************************************************************** +#ifndef HEAP_SIZE +#define HEAP_SIZE (0x4000) +#endif + +unsigned int __vStack[STACK_SIZE / sizeof(unsigned int)] __attribute__((section("STACK,\"aw\",%nobits@"))); +unsigned int __vHeap[HEAP_SIZE / sizeof(unsigned int)] __attribute__((section("HEAP,\"aw\",%nobits@"))); + +// ***************************************************************************** +#if defined(__cplusplus) +} // extern "C" +#endif +// ***************************************************************************** +// +// The vector table. +// This relies on the linker script to place at correct location in memory. +// +// ***************************************************************************** +extern void(*const g_pfnVectors[]) (void); +__attribute__ ((section(".isr_vector"))) +void(*const g_pfnVectors[]) (void) = { + // Core Level - CM4/CM3 + &_vStackTop, // The initial stack pointer + ResetISR, // The reset handler + NMI_Handler, // The NMI handler + HardFault_Handler, // The hard fault handler + MemManage_Handler, // The MPU fault handler + BusFault_Handler, // The bus fault handler + UsageFault_Handler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + SVC_Handler, // SVCall handler + DebugMon_Handler, // Debug monitor handler + 0, // Reserved +#if defined(OS_UCOS_III) + OS_CPU_PendSVHandler, // uCOS-III PendSV handler + OS_CPU_SysTickHandler, // uCOS-III SysTick handler +#else + PendSV_Handler, // The PendSV handler + SysTick_Handler, // The SysTick handler +#endif + + // Chip Level - LPC18xx/43xx + DAC_IRQHandler, // 16 D/A Converter + MX_CORE_IRQHandler, // 17 CortexM4/M0 (LPC43XX ONLY) + DMA_IRQHandler, // 18 General Purpose DMA + 0, // 19 Reserved + FLASHEEPROM_IRQHandler, // 20 ORed flash Bank A, flash Bank B, EEPROM interrupts + ETH_IRQHandler, // 21 Ethernet + SDIO_IRQHandler, // 22 SD/MMC + LCD_IRQHandler, // 23 LCD + USB0_IRQHandler, // 24 USB0 + USB1_IRQHandler, // 25 USB1 + SCT_IRQHandler, // 26 State Configurable Timer + RIT_IRQHandler, // 27 Repetitive Interrupt Timer + TIMER0_IRQHandler, // 28 Timer0 + TIMER1_IRQHandler, // 29 Timer 1 + TIMER2_IRQHandler, // 30 Timer 2 + TIMER3_IRQHandler, // 31 Timer 3 + MCPWM_IRQHandler, // 32 Motor Control PWM + ADC0_IRQHandler, // 33 A/D Converter 0 + I2C0_IRQHandler, // 34 I2C0 + I2C1_IRQHandler, // 35 I2C1 + SPI_IRQHandler, // 36 SPI (LPC43XX ONLY) + ADC1_IRQHandler, // 37 A/D Converter 1 + SSP0_IRQHandler, // 38 SSP0 + SSP1_IRQHandler, // 39 SSP1 + UART0_IRQHandler, // 40 UART0 + UART1_IRQHandler, // 41 UART1 + UART2_IRQHandler, // 42 UART2 + UART3_IRQHandler, // 43 USRT3 + I2S0_IRQHandler, // 44 I2S0 + I2S1_IRQHandler, // 45 I2S1 + SPIFI_IRQHandler, // 46 SPI Flash Interface + SGPIO_IRQHandler, // 47 SGPIO (LPC43XX ONLY) + GPIO0_IRQHandler, // 48 GPIO0 + GPIO1_IRQHandler, // 49 GPIO1 + GPIO2_IRQHandler, // 50 GPIO2 + GPIO3_IRQHandler, // 51 GPIO3 + GPIO4_IRQHandler, // 52 GPIO4 + GPIO5_IRQHandler, // 53 GPIO5 + GPIO6_IRQHandler, // 54 GPIO6 + GPIO7_IRQHandler, // 55 GPIO7 + GINT0_IRQHandler, // 56 GINT0 + GINT1_IRQHandler, // 57 GINT1 + EVRT_IRQHandler, // 58 Event Router + CAN1_IRQHandler, // 59 C_CAN1 + 0, // 60 Reserved + 0, // 61 Reserved + ATIMER_IRQHandler, // 62 ATIMER + RTC_IRQHandler, // 63 RTC + 0, // 64 Reserved + WDT_IRQHandler, // 65 WDT + 0, // 66 Reserved + CAN0_IRQHandler, // 67 C_CAN0 + QEI_IRQHandler, // 68 QEI +}; + +// ***************************************************************************** +// Functions to carry out the initialization of RW and BSS data sections. These +// are written as separate functions rather than being inlined within the +// ResetISR() function in order to cope with MCUs with multiple banks of +// memory. +// ***************************************************************************** +__attribute__ ((section(".after_vectors"))) +void data_init(unsigned int romstart, unsigned int start, unsigned int len) { + unsigned int *pulDest = (unsigned int *) start; + unsigned int *pulSrc = (unsigned int *) romstart; + unsigned int loop; + for (loop = 0; loop < len; loop = loop + 4) + *pulDest++ = *pulSrc++; +} + +__attribute__ ((section(".after_vectors"))) +void bss_init(unsigned int start, unsigned int len) { + unsigned int *pulDest = (unsigned int *) start; + unsigned int loop; + for (loop = 0; loop < len; loop = loop + 4) + *pulDest++ = 0; +} + +// ***************************************************************************** +// The following symbols are constructs generated by the linker, indicating +// the location of various points in the "Global Section Table". This table is +// created by the linker via the Code Red managed linker script mechanism. It +// contains the load address, execution address and length of each RW data +// section and the execution and length of each BSS (zero initialized) section. +// ***************************************************************************** +extern unsigned int __data_section_table; +extern unsigned int __data_section_table_end; +extern unsigned int __bss_section_table; +extern unsigned int __bss_section_table_end; + +// ***************************************************************************** +// Reset entry point for your code. +// Sets up a simple runtime environment and initializes the C/C++ +// library. +// +// ***************************************************************************** +void +ResetISR(void) { + + // + // Copy the data sections from flash to SRAM. + // + unsigned int LoadAddr, ExeAddr, SectionLen; + unsigned int *SectionTableAddr; + + /* Call SystemInit() for clocking/memory setup prior to scatter load */ + SystemInit(); + + // Load base address of Global Section Table + SectionTableAddr = &__data_section_table; + + // Copy the data sections from flash to SRAM. + while (SectionTableAddr < &__data_section_table_end) { + LoadAddr = *SectionTableAddr++; + ExeAddr = *SectionTableAddr++; + SectionLen = *SectionTableAddr++; + data_init(LoadAddr, ExeAddr, SectionLen); + } + // At this point, SectionTableAddr = &__bss_section_table; + // Zero fill the bss segment + while (SectionTableAddr < &__bss_section_table_end) { + ExeAddr = *SectionTableAddr++; + SectionLen = *SectionTableAddr++; + bss_init(ExeAddr, SectionLen); + } + + #if defined(__cplusplus) + // + // Call C++ library initialisation + // + __libc_init_array(); + #endif + + #if defined(__REDLIB__) + // Call the Redlib library, which in turn calls main() + __main(); + #else + main(); + #endif + + // + // main() shouldn't return, but if it does, we'll just enter an infinite loop + // + while (1) {} +} + +// ***************************************************************************** +// Default exception handlers. Override the ones here by defining your own +// handler routines in your application code. +// ***************************************************************************** +__attribute__ ((section(".after_vectors"))) +void NMI_Handler(void) +{ + while (1) {} +} + +__attribute__ ((section(".after_vectors"))) +void HardFault_Handler(void) +{ + while (1) {} +} + +__attribute__ ((section(".after_vectors"))) +void MemManage_Handler(void) +{ + while (1) {} +} + +__attribute__ ((section(".after_vectors"))) +void BusFault_Handler(void) +{ + while (1) {} +} + +__attribute__ ((section(".after_vectors"))) +void UsageFault_Handler(void) +{ + while (1) {} +} + +__attribute__ ((section(".after_vectors"))) +void SVC_Handler(void) +{ + while (1) {} +} + +__attribute__ ((section(".after_vectors"))) +void DebugMon_Handler(void) +{ + while (1) {} +} + +__attribute__ ((section(".after_vectors"))) +void PendSV_Handler(void) +{ + while (1) {} +} + +__attribute__ ((section(".after_vectors"))) +void SysTick_Handler(void) +{ + while (1) {} +} + +// ***************************************************************************** +// +// Processor ends up here if an unexpected interrupt occurs or a specific +// handler is not present in the application code. +// +// ***************************************************************************** +__attribute__ ((section(".after_vectors"))) +void IntDefaultHandler(void) +{ + while (1) {} +} + +// ***************************************************************************** +// +// Heap overflow check function required by REDLib_V2 library +// +// ***************************************************************************** +extern unsigned int *_pvHeapStart; +unsigned int __check_heap_overflow (void * new_end_of_heap) +{ + return (new_end_of_heap >= (void *)&__vHeap[HEAP_SIZE/sizeof(unsigned int)]); +} +