;/*****************************************************************************/ ;/* STARTUP.S: Startup file for ADI ADuC702x device series */ ;/*****************************************************************************/ ;/* <<< Use Configuration Wizard in Context Menu >>> */ ;/*****************************************************************************/ ;/* This file is part of the uVision/ARM development tools. */ ;/* Copyright (c) 2005-2006 Keil Software. All rights reserved. */ ;/* This software may only be used under the terms of a valid, current, */ ;/* end user licence from KEIL for a compatible version of KEIL software */ ;/* development tools. Nothing else gives you the right to use this software. */ ;/*****************************************************************************/ ;/* ; * The STARTUP.S code is executed after CPU Reset. This file may be ; * translated with the following SET symbols. In uVision these SET ; * symbols are entered under Options - ASM - Define. ; * ; * RAM_INTVEC: when set the startup code copies exception vectors ; * from on-chip Flash to on-chip RAM and remaps RAM to address 0. ; */ ; Standard definitions of Mode bits and Interrupt (I & F) flags in PSRs Mode_USR EQU 0x10 Mode_FIQ EQU 0x11 Mode_IRQ EQU 0x12 Mode_SVC EQU 0x13 Mode_ABT EQU 0x17 Mode_UND EQU 0x1B Mode_SYS EQU 0x1F I_Bit EQU 0x80 ; when I bit is set, IRQ is disabled F_Bit EQU 0x40 ; when F bit is set, FIQ is disabled ;// Stack Configuration (Stack Sizes in Bytes) ;// Undefined Mode <0x0-0xFFFFFFFF:8> ;// Supervisor Mode <0x0-0xFFFFFFFF:8> ;// Abort Mode <0x0-0xFFFFFFFF:8> ;// Fast Interrupt Mode <0x0-0xFFFFFFFF:8> ;// Interrupt Mode <0x0-0xFFFFFFFF:8> ;// User/System Mode <0x0-0xFFFFFFFF:8> ;// UND_Stack_Size EQU 0x00000080 SVC_Stack_Size EQU 0x00000080 ABT_Stack_Size EQU 0x00000080 FIQ_Stack_Size EQU 0x00000080 IRQ_Stack_Size EQU 0x00000080 USR_Stack_Size EQU 0x00000400 Stack_Size EQU (UND_Stack_Size + SVC_Stack_Size + ABT_Stack_Size + \ FIQ_Stack_Size + IRQ_Stack_Size + USR_Stack_Size) AREA STACK, NOINIT, READWRITE, ALIGN=3 Stack_Mem SPACE Stack_Size Stack_Top EQU Stack_Mem + Stack_Size ;// Heap Configuration ;// Heap Size (in Bytes) <0x0-0xFFFFFFFF> ;// Heap_Size EQU 0x00000000 AREA HEAP, NOINIT, READWRITE, ALIGN=3 Heap_Mem SPACE Heap_Size ; MMR definitions MMR_BASE EQU 0xFFFF0000 ; MMR Base Address REMAP_OFFSET EQU 0x0220 POWKEY1_OFFSET EQU 0x0404 POWCON_OFFSET EQU 0x0408 POWKEY2_OFFSET EQU 0x040C ;// PLL Setup ;// CD: PLL Multiplier Selection ;// <0-7> ;// CD Value ;// FINT: Fast Interrupt ;// <0-1> ;// Switches to CD0 for FIQ ;// PLL_SETUP EQU 1 PLLCFG_Val EQU 0x00000001 ;// Pin Setup GPIO_SETUP EQU 0 GPIOBASE EQU 0xFFFFF400 ;// Port 0 ;// P0.0 <0=> GPIO <1=> CMPOUT <2=> MS2 <3=> PLAI[7] ;// P0.1 <0=> GPIO <1=> --- <2=> XBEN0 <3=> --- ;// P0.2 <0=> GPIO <1=> --- <2=> XBEN1 <3=> --- ;// P0.3 <0=> GPIO <1=> TRST <2=> XA16 <3=> ADCBUSY ;// P0.4 <0=> GPIO/IRQ0 <1=> CONVSTART <2=> MS1 <3=> PLAO[1] ;// P0.5 <0=> GPIO/IRQ1 <1=> ADCBUSY <2=> MS0 <3=> PLAO[2] ;// P0.6 <0=> GPIO <1=> MRST <2=> XAE <3=> PLAO[3] ;// P0.7 <0=> GPIO <1=> ECLK <2=> SIN <3=> PLAO[4] ;// GP0CON_Val EQU 0x00000000 ;// Port 1 ;// P1.0 <0=> GPIO <1=> SIN <2=> I2C0SCL <3=> PLAI[0] ;// P1.1 <0=> GPIO <1=> SOUT <2=> I2C0SDA <3=> PLAI[1] ;// P1.2 <0=> GPIO <1=> RTS <2=> I2C1SCL <3=> PLAI[2] ;// P1.3 <0=> GPIO <1=> CTS <2=> I2C1SDA <3=> PLAI[3] ;// P1.4 <0=> GPIO/IRQ2 <1=> RI <2=> SPICLK <3=> PLAI[4] ;// P1.5 <0=> GPIO/IRQ3 <1=> DCD <2=> SPIMISO <3=> PLAI[5] ;// P1.6 <0=> GPIO <1=> DSR <2=> SPIMOSI <3=> PLAI[6] ;// P1.7 <0=> GPIO <1=> DTR <2=> SPICSL <3=> PLAO[0] ;// GP1CON_Val EQU 0x00000000 ;// Port 2 ;// P2.0 <0=> GPIO <1=> CONVSTART <2=> SOUT <3=> PLAO[5] ;// P2.1 <0=> GPIO <1=> --- <2=> XWS <3=> PLAO[6] ;// P2.2 <0=> GPIO <1=> --- <2=> XRS <3=> PLAO[7] ;// P2.3 <0=> GPIO <1=> --- <2=> XAE <3=> --- ;// P2.4 <0=> GPIO <1=> --- <2=> MS0 <3=> --- ;// P2.5 <0=> GPIO <1=> --- <2=> MS1 <3=> --- ;// P2.6 <0=> GPIO <1=> --- <2=> MS2 <3=> --- ;// P2.7 <0=> GPIO <1=> --- <2=> MS3 <3=> --- ;// GP2CON_Val EQU 0x00000000 ;// Port 3 ;// P3.0 <0=> GPIO <1=> PWM0H <2=> XAD0 <3=> PLAI[8] ;// P3.1 <0=> GPIO <1=> PWM0L <2=> XAD1 <3=> PLAI[9] ;// P3.2 <0=> GPIO <1=> PWM1H <2=> XAD2 <3=> PLAI[10] ;// P3.3 <0=> GPIO <1=> PWM1L <2=> XAD3 <3=> PLAI[11] ;// P3.4 <0=> GPIO <1=> PWM2H <2=> XAD4 <3=> PLAI[12] ;// P3.5 <0=> GPIO <1=> PWM2L <2=> XAD5 <3=> PLAI[13] ;// P3.6 <0=> GPIO <1=> PWMTRIP <2=> XAD6 <3=> PLAI[14] ;// P3.7 <0=> GPIO <1=> PWMSYNC <2=> XAD7 <3=> PLAI[15] ;// GP3CON_Val EQU 0x00000000 ;// Port 4 ;// P4.0 <0=> GPIO <1=> --- <2=> XAD8 <3=> PLAO[8] ;// P4.1 <0=> GPIO <1=> --- <2=> XAD9 <3=> PLAO[9] ;// P4.2 <0=> GPIO <1=> --- <2=> XAD10 <3=> PLAO[10] ;// P4.3 <0=> GPIO <1=> --- <2=> XAD11 <3=> PLAO[11] ;// P4.4 <0=> GPIO <1=> --- <2=> XAD12 <3=> PLAO[12] ;// P4.5 <0=> GPIO <1=> --- <2=> XAD13 <3=> PLAO[13] ;// P4.6 <0=> GPIO <1=> --- <2=> XAD14 <3=> PLAO[14] ;// P4.7 <0=> GPIO <1=> --- <2=> XAD15 <3=> PLAO[15] ;// GP4CON_Val EQU 0x00000000 ;// ;// External Memory Interface XM_SETUP EQU 0 XMBASE EQU 0xFFFFF000 ;// Enable Memory Region 0 ;// Data Bus Width <0=> 8-bit <1=> 16-bit ;// Enable Dynamic Addressing ;// Byte Enabled Write Strobe ;// Disable extra Address Latch Hold Cycle ;// Disable extra Write Address Hold Cycle ;// Disable Read Bus Turn Cycle ;// Address Wait States <0-7> ;// Number of Wait States added for AE ;// Read Wait States <0-15> ;// Number of Wait States added for RS ;// Write Wait States <0-15> ;// Number of Wait States added for WS ;// XM0CON_Val EQU 0x00000000 XM0PAR_Val EQU 0x000070FF ;// Enable Memory Region 1 ;// Data Bus Width <0=> 8-bit <1=> 16-bit ;// Enable Dynamic Addressing ;// Byte Enabled Write Strobe ;// Disable extra Address Latch Hold Cycle ;// Disable extra Write Address Hold Cycle ;// Disable Read Bus Turn Cycle ;// Address Wait States <0-7> ;// Number of Wait States added for AE ;// Read Wait States <0-15> ;// Number of Wait States added for RS ;// Write Wait States <0-15> ;// Number of Wait States added for WS ;// XM1CON_Val EQU 0x00000000 XM1PAR_Val EQU 0x000070FF ;// Enable Memory Region 2 ;// Data Bus Width <0=> 8-bit <1=> 16-bit ;// Enable Dynamic Addressing ;// Byte Enabled Write Strobe ;// Disable extra Address Latch Hold Cycle ;// Disable extra Write Address Hold Cycle ;// Disable Read Bus Turn Cycle ;// Address Wait States <0-7> ;// Number of Wait States added for AE ;// Read Wait States <0-15> ;// Number of Wait States added for RS ;// Write Wait States <0-15> ;// Number of Wait States added for WS ;// XM2CON_Val EQU 0x00000000 XM2PAR_Val EQU 0x000070FF ;// Enable Memory Region 3 ;// Data Bus Width <0=> 8-bit <1=> 16-bit ;// Enable Dynamic Addressing ;// Byte Enabled Write Strobe ;// Disable extra Address Latch Hold Cycle ;// Disable extra Write Address Hold Cycle ;// Disable Read Bus Turn Cycle ;// Address Wait States <0-7> ;// Number of Wait States added for AE ;// Read Wait States <0-15> ;// Number of Wait States added for RS ;// Write Wait States <0-15> ;// Number of Wait States added for WS ;// XM3CON_Val EQU 0x00000000 XM3PAR_Val EQU 0x000070FF ;// Memory Muxed Mode XMCFG_Val EQU 0x00000001 ;// ;// PRESERVE8 ; Area Definition and Entry Point ; Startup Code must be linked first at Address at which it expects to run. AREA Reset, CODE, READONLY ARM ; Exception Vectors ; Mapped to Address 0. ; Absolute addressing mode must be used. ; Dummy Handlers are implemented as infinite loops which can be modified. Vectors LDR PC, Reset_Addr LDR PC, Undef_Addr LDR PC, SWI_Addr LDR PC, PAbt_Addr LDR PC, DAbt_Addr DCD 0xFFFFFFFF ; Reserved Vector LDR PC, IRQ_Addr LDR PC, FIQ_Addr EXTERN Undef_Handler EXTERN SWI_Handler EXTERN PAbt_Handler EXTERN DAbt_Handler EXTERN IRQ_Handler EXTERN FIQ_Handler Reset_Addr DCD Reset_Handler Undef_Addr DCD Undef_Handler SWI_Addr DCD SWI_Handler PAbt_Addr DCD PAbt_Handler DAbt_Addr DCD DAbt_Handler DCD 0xFFFFFFFF ; Reserved Address IRQ_Addr DCD IRQ_Handler FIQ_Addr DCD FIQ_Handler ; Reset Handler EXPORT Reset_Handler Reset_Handler ; Setup PLL IF PLL_SETUP <> 0 LDR R0, =MMR_BASE MOV R1, #0x01 STR R1, [R0,#POWKEY1_OFFSET] MOV R1, #PLLCFG_Val STR R1, [R0,#POWCON_OFFSET] MOV R1, #0xF4 STR R1, [R0,#POWKEY2_OFFSET] ENDIF ; PLL_SETUP ; Setup Pins IF GPIO_SETUP <> 0 ADR R10, GPIO_CFG ; Pointer to GPIO CFG LDMIA R10, {R0-R5} ; Load GPIO Configuration STMIA R0, {R1-R5} ; Store GPxCON B GPIO_END GPIO_CFG DCD GPIOBASE DCD GP0CON_Val DCD GP1CON_Val DCD GP2CON_Val DCD GP3CON_Val DCD GP4CON_Val GPIO_END ENDIF ; GPIO_SETUP ; Setup External Memory Interface IF XM_SETUP <> 0 ADR R10, XM_CFG ; Pointer to XM CFG LDMIA R10, {R0-R9} ; Load XM Configuration STR R1, [R0],#0x10 ; Store XMCFG STMIA R0, {R2-R9} ; Store XMxCON & XMxPAR B XM_END XM_CFG DCD XMBASE DCD XMCFG_Val DCD XM0CON_Val DCD XM1CON_Val DCD XM2CON_Val DCD XM3CON_Val DCD XM0PAR_Val DCD XM1PAR_Val DCD XM2PAR_Val DCD XM3PAR_Val XM_END ENDIF ; XM_SETUP ; Copy Exception Vectors to Internal RAM and Remap Memory ; (when Interrupt Vectors are in RAM) IF :DEF:RAM_INTVEC ADR R8, Vectors ; Source LDR R9, =0x00010000 ; Destination LDMIA R8!, {R0-R7} ; Load Vectors STMIA R9!, {R0-R7} ; Store Vectors LDMIA R8!, {R0-R7} ; Load Handler Addresses STMIA R9!, {R0-R7} ; Store Handler Addresses LDR R0, =MMR_BASE MOV R1, #1 STR R1, [R0,#REMAP_OFFSET] ENDIF ; Setup Stack for each mode LDR R0, =Stack_Top ; Enter Undefined Instruction Mode and set its Stack Pointer MSR CPSR_c, #Mode_UND:OR:I_Bit:OR:F_Bit MOV SP, R0 SUB R0, R0, #UND_Stack_Size ; Enter Abort Mode and set its Stack Pointer MSR CPSR_c, #Mode_ABT:OR:I_Bit:OR:F_Bit MOV SP, R0 SUB R0, R0, #ABT_Stack_Size ; Enter FIQ Mode and set its Stack Pointer MSR CPSR_c, #Mode_FIQ:OR:I_Bit:OR:F_Bit MOV SP, R0 SUB R0, R0, #FIQ_Stack_Size ; Enter IRQ Mode and set its Stack Pointer MSR CPSR_c, #Mode_IRQ:OR:I_Bit:OR:F_Bit MOV SP, R0 SUB R0, R0, #IRQ_Stack_Size ; Enter Supervisor Mode and set its Stack Pointer MSR CPSR_c, #Mode_SVC:OR:I_Bit:OR:F_Bit MOV SP, R0 SUB R0, R0, #SVC_Stack_Size ; Enter User Mode and set its Stack Pointer MSR CPSR_c, #Mode_USR MOV SP, R0 SUB SL, SP, #USR_Stack_Size ; Enter the C code IMPORT __main LDR R0, =__main BX R0 ; User Initial Stack & Heap AREA |.text|, CODE, READONLY IMPORT __use_two_region_memory EXPORT __user_initial_stackheap __user_initial_stackheap LDR R0, = Heap_Mem LDR R1, =(Stack_Mem + USR_Stack_Size) LDR R2, = (Heap_Mem + Heap_Size) LDR R3, = Stack_Mem BX LR END