| /***************************************************************************** |
| * Copyright (c) 2009 Rowley Associates Limited. * |
| * * |
| * This file may be distributed under the terms of the License Agreement * |
| * provided with this software. * |
| * * |
| * THIS FILE IS PROVIDED AS IS WITH NO WARRANTY OF ANY KIND, INCLUDING THE * |
| * WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. * |
| *****************************************************************************/ |
| |
| /***************************************************************************** |
| * Preprocessor Definitions |
| * ------------------------ |
| * |
| * STARTUP_FROM_RESET |
| * |
| * If defined, the program will startup from power-on/reset. If not defined |
| * the program will just loop endlessly from power-on/reset. |
| * |
| * This definition is not defined by default on this target because the |
| * debugger is unable to reset this target and maintain control of it over the |
| * JTAG interface. The advantage of doing this is that it allows the debugger |
| * to reset the CPU and run programs from a known reset CPU state on each run. |
| * It also acts as a safety net if you accidently download a program in FLASH |
| * that crashes and prevents the debugger from taking control over JTAG |
| * rendering the target unusable over JTAG. The obvious disadvantage of doing |
| * this is that your application will not startup without the debugger. |
| * |
| * We advise that on this target you keep STARTUP_FROM_RESET undefined whilst |
| * you are developing and only define STARTUP_FROM_RESET when development is |
| * complete.A |
| * |
| * |
| * CONFIGURE_USB |
| * |
| * If defined, the USB clock will be configured. |
| * |
| *****************************************************************************/ |
| |
| #include <LPC1000.h> |
| |
| #if OSCILLATOR_CLOCK_FREQUENCY==12000000 |
| |
| #ifdef FULL_SPEED |
| |
| /* Fosc = 12Mhz, Fcco = 400Mhz, cclk = 100Mhz */ |
| #ifndef PLL0CFG_VAL |
| #define PLL0CFG_VAL ((49 << PLL0CFG_MSEL0_BIT) | (2 << PLL0CFG_NSEL0_BIT)) |
| #endif |
| |
| #ifndef CCLKCFG_VAL |
| #define CCLKCFG_VAL 3 |
| #endif |
| |
| #ifndef FLASHCFG_VAL |
| #define FLASHCFG_VAL 0x0000403A |
| #endif |
| |
| #else |
| |
| /* Fosc = 12Mhz, Fcco = 288Mhz, cclk = 72Mhz */ |
| #ifndef PLL0CFG_VAL |
| #define PLL0CFG_VAL ((11 << PLL0CFG_MSEL0_BIT) | (0 << PLL0CFG_NSEL0_BIT)) |
| #endif |
| |
| #ifndef CCLKCFG_VAL |
| #define CCLKCFG_VAL 3 |
| #endif |
| |
| #ifndef FLASHCFG_VAL |
| #define FLASHCFG_VAL 0x0000303A |
| #endif |
| |
| #endif |
| |
| /* Fosc = 12Mhz, Fcco = 192Mhz, usbclk = 48Mhz */ |
| #ifndef PLL1CFG_VAL |
| #define PLL1CFG_VAL ((3 << PLL1CFG_MSEL1_BIT) | (1 << PLL1CFG_PSEL1_BIT)) |
| #endif |
| |
| #endif |
| |
| .global reset_handler |
| |
| .syntax unified |
| |
| .section .vectors, "ax" |
| .code 16 |
| .align 0 |
| .global _vectors |
| |
| .macro DEFAULT_ISR_HANDLER name= |
| .thumb_func |
| .weak \name |
| \name: |
| 1: b 1b /* endless loop */ |
| .endm |
| |
| .extern xPortPendSVHandler |
| .extern xPortSysTickHandler |
| .extern vPortSVCHandler |
| .extern vEMAC_ISR; |
| |
| _vectors: |
| .word __stack_end__ |
| #ifdef STARTUP_FROM_RESET |
| .word reset_handler |
| #else |
| .word reset_wait |
| #endif /* STARTUP_FROM_RESET */ |
| .word NMI_Handler |
| .word HardFault_Handler |
| .word MemManage_Handler |
| .word BusFault_Handler |
| .word UsageFault_Handler |
| .word 0 // Reserved |
| .word 0 // Reserved |
| .word 0 // Reserved |
| .word 0 // Reserved |
| .word vPortSVCHandler |
| .word DebugMon_Handler |
| .word 0 // Reserved |
| .word xPortPendSVHandler |
| .word xPortSysTickHandler |
| .word WDT_IRQHandler |
| .word TIMER0_IRQHandler |
| .word TIMER1_IRQHandler |
| .word TIMER2_IRQHandler |
| .word TIMER3_IRQHandler |
| .word UART0_IRQHandler |
| .word UART1_IRQHandler |
| .word UART2_IRQHandler |
| .word UART3_IRQHandler |
| .word PWM1_IRQHandler |
| .word I2C0_IRQHandler |
| .word I2C1_IRQHandler |
| .word I2C2_IRQHandler |
| .word SPI_IRQHandler |
| .word SSP0_IRQHandler |
| .word SSP1_IRQHandler |
| .word PLL0_IRQHandler |
| .word RTC_IRQHandler |
| .word EINT0_IRQHandler |
| .word EINT1_IRQHandler |
| .word EINT2_IRQHandler |
| .word EINT3_IRQHandler |
| .word ADC_IRQHandler |
| .word BOD_IRQHandler |
| .word USB_IRQHandler |
| .word CAN_IRQHandler |
| .word GPDMA_IRQHandler |
| .word I2S_IRQHandler |
| .word vEMAC_ISR |
| .word RIT_IRQHandler |
| .word MCPWM_IRQHandler |
| .word QEI_IRQHandler |
| .word PLL1_IRQHandler |
| .word USBACT_IRQHandler |
| .word CANACT_IRQHandler |
| |
| .section .init, "ax" |
| .thumb_func |
| |
| reset_handler: |
| #ifndef __FLASH_BUILD |
| /* If this is a RAM build, configure vector table offset register to point |
| to the RAM vector table. */ |
| ldr r0, =0xE000ED08 |
| ldr r1, =_vectors |
| str r1, [r0] |
| #endif |
| |
| ldr r0, =SC_BASE_ADDRESS |
| |
| /* Configure PLL0 Multiplier/Divider */ |
| ldr r1, [r0, #PLL0STAT_OFFSET] |
| tst r1, #PLL0STAT_PLLC0_STAT |
| beq 1f |
| |
| /* Disconnect PLL0 */ |
| ldr r1, =PLL0CON_PLLE0 |
| str r1, [r0, #PLL0CON_OFFSET] |
| mov r1, #0xAA |
| str r1, [r0, #PLL0FEED_OFFSET] |
| mov r1, #0x55 |
| str r1, [r0, #PLL0FEED_OFFSET] |
| 1: |
| /* Disable PLL0 */ |
| ldr r1, =0 |
| str r1, [r0, #PLL0CON_OFFSET] |
| mov r1, #0xAA |
| str r1, [r0, #PLL0FEED_OFFSET] |
| mov r1, #0x55 |
| str r1, [r0, #PLL0FEED_OFFSET] |
| |
| /* Enable main oscillator */ |
| ldr r1, [r0, #SCS_OFFSET] |
| orr r1, r1, #SCS_OSCEN |
| str r1, [r0, #SCS_OFFSET] |
| 1: |
| ldr r1, [r0, #SCS_OFFSET] |
| tst r1, #SCS_OSCSTAT |
| beq 1b |
| |
| /* Select main oscillator as the PLL0 clock source */ |
| ldr r1, =1 |
| str r1, [r0, #CLKSRCSEL_OFFSET] |
| |
| /* Set PLL0CFG */ |
| ldr r1, =PLL0CFG_VAL |
| str r1, [r0, #PLL0CFG_OFFSET] |
| mov r1, #0xAA |
| str r1, [r0, #PLL0FEED_OFFSET] |
| mov r1, #0x55 |
| str r1, [r0, #PLL0FEED_OFFSET] |
| |
| /* Enable PLL0 */ |
| ldr r1, =PLL0CON_PLLE0 |
| str r1, [r0, #PLL0CON_OFFSET] |
| mov r1, #0xAA |
| str r1, [r0, #PLL0FEED_OFFSET] |
| mov r1, #0x55 |
| str r1, [r0, #PLL0FEED_OFFSET] |
| |
| #ifdef CCLKCFG_VAL |
| /* Set the CPU clock divider */ |
| ldr r1, =CCLKCFG_VAL |
| str r1, [r0, #CCLKCFG_OFFSET] |
| #endif |
| |
| #ifdef FLASHCFG_VAL |
| /* Configure the FLASH accelerator */ |
| ldr r1, =FLASHCFG_VAL |
| str r1, [r0, #FLASHCFG_OFFSET] |
| #endif |
| |
| /* Wait for PLL0 to lock */ |
| 1: |
| ldr r1, [r0, #PLL0STAT_OFFSET] |
| tst r1, #PLL0STAT_PLOCK0 |
| beq 1b |
| |
| /* PLL0 Locked, connect PLL as clock source */ |
| mov r1, #(PLL0CON_PLLE0 | PLL0CON_PLLC0) |
| str r1, [r0, #PLL0CON_OFFSET] |
| mov r1, #0xAA |
| str r1, [r0, #PLL0FEED_OFFSET] |
| mov r1, #0x55 |
| str r1, [r0, #PLL0FEED_OFFSET] |
| /* Wait for PLL0 to connect */ |
| 1: |
| ldr r1, [r0, #PLL0STAT_OFFSET] |
| tst r1, #PLL0STAT_PLLC0_STAT |
| beq 1b |
| |
| #ifdef CONFIGURE_USB |
| /* Configure PLL1 Multiplier/Divider */ |
| ldr r1, [r0, #PLL1STAT_OFFSET] |
| tst r1, #PLL1STAT_PLLC1_STAT |
| beq 1f |
| |
| /* Disconnect PLL1 */ |
| ldr r1, =PLL1CON_PLLE1 |
| str r1, [r0, #PLL1CON_OFFSET] |
| mov r1, #0xAA |
| str r1, [r0, #PLL1FEED_OFFSET] |
| mov r1, #0x55 |
| str r1, [r0, #PLL1FEED_OFFSET] |
| 1: |
| /* Disable PLL1 */ |
| ldr r1, =0 |
| str r1, [r0, #PLL1CON_OFFSET] |
| mov r1, #0xAA |
| str r1, [r0, #PLL1FEED_OFFSET] |
| mov r1, #0x55 |
| str r1, [r0, #PLL1FEED_OFFSET] |
| |
| /* Set PLL1CFG */ |
| ldr r1, =PLL1CFG_VAL |
| str r1, [r0, #PLL1CFG_OFFSET] |
| mov r1, #0xAA |
| str r1, [r0, #PLL1FEED_OFFSET] |
| mov r1, #0x55 |
| str r1, [r0, #PLL1FEED_OFFSET] |
| |
| /* Enable PLL1 */ |
| ldr r1, =PLL1CON_PLLE1 |
| str r1, [r0, #PLL1CON_OFFSET] |
| mov r1, #0xAA |
| str r1, [r0, #PLL1FEED_OFFSET] |
| mov r1, #0x55 |
| str r1, [r0, #PLL1FEED_OFFSET] |
| |
| /* Wait for PLL1 to lock */ |
| 1: |
| ldr r1, [r0, #PLL1STAT_OFFSET] |
| tst r1, #PLL1STAT_PLOCK1 |
| beq 1b |
| |
| /* PLL1 Locked, connect PLL as clock source */ |
| mov r1, #(PLL1CON_PLLE1 | PLL1CON_PLLC1) |
| str r1, [r0, #PLL1CON_OFFSET] |
| mov r1, #0xAA |
| str r1, [r0, #PLL1FEED_OFFSET] |
| mov r1, #0x55 |
| str r1, [r0, #PLL1FEED_OFFSET] |
| /* Wait for PLL1 to connect */ |
| 1: |
| ldr r1, [r0, #PLL1STAT_OFFSET] |
| tst r1, #PLL1STAT_PLLC1_STAT |
| beq 1b |
| #endif |
| |
| b _start |
| |
| DEFAULT_ISR_HANDLER NMI_Handler |
| DEFAULT_ISR_HANDLER HardFault_Handler |
| DEFAULT_ISR_HANDLER MemManage_Handler |
| DEFAULT_ISR_HANDLER BusFault_Handler |
| DEFAULT_ISR_HANDLER UsageFault_Handler |
| DEFAULT_ISR_HANDLER SVC_Handler |
| DEFAULT_ISR_HANDLER DebugMon_Handler |
| DEFAULT_ISR_HANDLER PendSV_Handler |
| DEFAULT_ISR_HANDLER SysTick_Handler |
| DEFAULT_ISR_HANDLER WDT_IRQHandler |
| DEFAULT_ISR_HANDLER TIMER0_IRQHandler |
| DEFAULT_ISR_HANDLER TIMER1_IRQHandler |
| DEFAULT_ISR_HANDLER TIMER2_IRQHandler |
| DEFAULT_ISR_HANDLER TIMER3_IRQHandler |
| DEFAULT_ISR_HANDLER UART0_IRQHandler |
| DEFAULT_ISR_HANDLER UART1_IRQHandler |
| DEFAULT_ISR_HANDLER UART2_IRQHandler |
| DEFAULT_ISR_HANDLER UART3_IRQHandler |
| DEFAULT_ISR_HANDLER PWM1_IRQHandler |
| DEFAULT_ISR_HANDLER I2C0_IRQHandler |
| DEFAULT_ISR_HANDLER I2C1_IRQHandler |
| DEFAULT_ISR_HANDLER I2C2_IRQHandler |
| DEFAULT_ISR_HANDLER SPI_IRQHandler |
| DEFAULT_ISR_HANDLER SSP0_IRQHandler |
| DEFAULT_ISR_HANDLER SSP1_IRQHandler |
| DEFAULT_ISR_HANDLER PLL0_IRQHandler |
| DEFAULT_ISR_HANDLER RTC_IRQHandler |
| DEFAULT_ISR_HANDLER EINT0_IRQHandler |
| DEFAULT_ISR_HANDLER EINT1_IRQHandler |
| DEFAULT_ISR_HANDLER EINT2_IRQHandler |
| DEFAULT_ISR_HANDLER EINT3_IRQHandler |
| DEFAULT_ISR_HANDLER ADC_IRQHandler |
| DEFAULT_ISR_HANDLER BOD_IRQHandler |
| DEFAULT_ISR_HANDLER USB_IRQHandler |
| DEFAULT_ISR_HANDLER CAN_IRQHandler |
| DEFAULT_ISR_HANDLER GPDMA_IRQHandler |
| DEFAULT_ISR_HANDLER I2S_IRQHandler |
| DEFAULT_ISR_HANDLER ENET_IRQHandler |
| DEFAULT_ISR_HANDLER RIT_IRQHandler |
| DEFAULT_ISR_HANDLER MCPWM_IRQHandler |
| DEFAULT_ISR_HANDLER QEI_IRQHandler |
| DEFAULT_ISR_HANDLER PLL1_IRQHandler |
| DEFAULT_ISR_HANDLER USBACT_IRQHandler |
| DEFAULT_ISR_HANDLER CANACT_IRQHandler |
| |
| #ifndef STARTUP_FROM_RESET |
| DEFAULT_ISR_HANDLER reset_wait |
| #endif /* STARTUP_FROM_RESET */ |
| |