mirror of
https://github.com/FreeRTOS/FreeRTOS-Kernel.git
synced 2025-05-04 20:30:58 -04:00
365 lines
9.3 KiB
ArmAsm
365 lines
9.3 KiB
ArmAsm
/*****************************************************************************
|
|
* 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 */
|
|
|