ARM7启动代码.docx
《ARM7启动代码.docx》由会员分享,可在线阅读,更多相关《ARM7启动代码.docx(14页珍藏版)》请在冰豆网上搜索。
ARM7启动代码
SAMSUNG公司推出的16、32位RISC处理器S3C44BOX为手持设备和一般类型应用提供了高性价比和高性能的微控制器解决方案。
为了降低成本,S3C44BOX提供了丰富的内置部件,包括8KBCache和内部SRAM,LCD控制器,带自动握手的2通道UART,4通道DMA,系统管理器(片选逻辑,FP/EDO/SDRAM控制器)。
带PWM功能的5通道定时器和一个内部定时器,I/O端口,RTC,8通道10位ADC,IIC_BUS接口,IIS_BUS接口,同步SIO接口和PLL倍频器。
这里是一般的44BINIT.S,即其启动代码如下:
;*******************************************************
;*NAME:
44BINIT.S*
;*Version:
10.JAn.2003*
;*Description:
*
;*Cstartupcodes*
;*Configurememory,InitializeISR,stacks*
;*InitializeC-variables*
;*Fillzerosintozero-initializedC-variables*
;*******************************************************
GET..\inc\option.s
GET..\inc\memcfg.s
;InterruptControl
INTPNDEQU0x01e00004
INTMODEQU0x01e00008
INTMSKEQU0x01e0000c
I_ISPREQU0x01e00020
I_CMSTEQU0x01e0001c
;Watchdogtimer
WTCONEQU0x01d30000
;ClockController
PLLCONEQU0x01d80000
CLKCONEQU0x01d80004
LOCKTIMEEQU0x01d8000c
;MemoryController
REFRESHEQU0x01c80024
;Pre-definedconstants
USERMODEEQU0x10
FIQMODEEQU0x11
IRQMODEEQU0x12
SVCMODEEQU0x13
ABORTMODEEQU0x17
UNDEFMODEEQU0x1b
MODEMASKEQU0x1f
NOINTEQU0xc0
;checkiftasm.exeisused.
GBLLTHUMBCODE
[{CONFIG}=16
THUMBCODESETL{TRUE}
CODE32
|
THUMBCODESETL{FALSE}
]
[THUMBCODE
CODE32;forstart-upcodeforThumbmode
]
MACRO
$HandlerLabelHANDLER$HandleLabel
$HandlerLabel
subsp,sp,#4;decrementsp(tostorejumpaddress)
stmfdsp!
{r0};PUSHtheworkregistertostack(lrdoestpushbecauseitreturntooriginaladdress)
ldrr0,=$HandleLabel;loadtheaddressofHandleXXXtor0
ldrr0,[r0];loadthecontents(serviceroutinestartaddress)ofHandleXXX
strr0,[sp,#4];storethecontents(ISR)ofHandleXXXtostack
ldmfdsp!
{r0,pc};POPtheworkregisterandpc(jumptoISR)
MEND
IMPORT|Image$$RO$$Limit|;EndofROMcode(=startofROMdata)
IMPORT|Image$$RW$$Base|;BaseofRAMtoinitialise
IMPORT|Image$$ZI$$Base|;Baseandlimitofarea
IMPORT|Image$$ZI$$Limit|;tozeroinitialise
IMPORTMain;Themainentryofmonprogram
AREAInit,CODE,READONLY
ENTRY
bResetHandler;fordebug
bHandlerUndef;handlerUndef
bHandlerSWI;SWIinterrupthandler
bHandlerPabort;handlerPAbort
bHandlerDabort;handlerDAbort
b.;handlerReserved
bHandlerIRQ
bHandlerFIQ
;***IMPORTANTNOTE***
;IftheH/Wvectoredinterrutpmodeisenabled,Theabovetwoinstructionsshould
;bechangedlikebelow,towork-aroundwithH/WbugofS3C44B0Xinterruptcontroller.
;bHandlerIRQ->subspc,lr,#4
;bHandlerIRQ->subspc,lr,#4
VECTOR_BRANCH
ldrpc,=HandlerEINT0;mGAH/Winterruptvectortable
ldrpc,=HandlerEINT1;
ldrpc,=HandlerEINT2;
ldrpc,=HandlerEINT3;
ldrpc,=HandlerEINT4567;
ldrpc,=HandlerTICK;mGA
b.
b.
ldrpc,=HandlerZDMA0;mGB
ldrpc,=HandlerZDMA1;
ldrpc,=HandlerBDMA0;
ldrpc,=HandlerBDMA1;
ldrpc,=HandlerWDT;
ldrpc,=HandlerUERR01;mGB
b.
b.
ldrpc,=HandlerTIMER0;mGC
ldrpc,=HandlerTIMER1;
ldrpc,=HandlerTIMER2;
ldrpc,=HandlerTIMER3;
ldrpc,=HandlerTIMER4;
ldrpc,=HandlerTIMER5;mGC
b.
b.
ldrpc,=HandlerURXD0;mGD
ldrpc,=HandlerURXD1;
ldrpc,=HandlerIIC;
ldrpc,=HandlerSIO;
ldrpc,=HandlerUTXD0;
ldrpc,=HandlerUTXD1;mGD
b.
b.
ldrpc,=HandlerRTC;mGKA
b.;
b.;
b.;
b.;
b.;mGKA
b.
b.
ldrpc,=HandlerADC;mGKB
b.;
b.;
b.;
b.;
b.;mGKB
b.
b.
ldrpc,=EnterPWDN
EXPORToutportw
outportwstrhr0,[r1]
movpc,lr
EXPORToutportl
outportlstrr0,[r1]
movpc,lr
EXPORTinportw
inportwldrhr0,[r0]
movpc,lr
EXPORTinportl
inportlldrr0,[r0]
movpc,lr
LTORG
HandlerFIQHANDLERHandleFIQ
HandlerIRQHANDLERHandleIRQ
HandlerUndefHANDLERHandleUndef
HandlerSWIHANDLERHandleSWI
HandlerDabortHANDLERHandleDabort
HandlerPabortHANDLERHandlePabort
HandlerADCHANDLERHandleADC
HandlerRTCHANDLERHandleRTC
HandlerUTXD1HANDLERHandleUTXD1
HandlerUTXD0HANDLERHandleUTXD0
HandlerSIOHANDLERHandleSIO
HandlerIICHANDLERHandleIIC
HandlerURXD1HANDLERHandleURXD1
HandlerURXD0HANDLERHandleURXD0
HandlerTIMER5HANDLERHandleTIMER5
HandlerTIMER4HANDLERHandleTIMER4
HandlerTIMER3HANDLERHandleTIMER3
HandlerTIMER2HANDLERHandleTIMER2
HandlerTIMER1HANDLERHandleTIMER1
HandlerTIMER0HANDLERHandleTIMER0
HandlerUERR01HANDLERHandleUERR01
HandlerWDTHANDLERHandleWDT
HandlerBDMA1HANDLERHandleBDMA1
HandlerBDMA0HANDLERHandleBDMA0
HandlerZDMA1HANDLERHandleZDMA1
HandlerZDMA0HANDLERHandleZDMA0
HandlerTICKHANDLERHandleTICK
HandlerEINT4567HANDLERHandleEINT4567
HandlerEINT3HANDLERHandleEINT3
HandlerEINT2HANDLERHandleEINT2
HandlerEINT1HANDLERHandleEINT1
HandlerEINT0HANDLERHandleEINT0
;Oneofthefollowingtworoutinescanbeusedfornon-vectoredinterrupt.
IsrIRQ;usingI_ISPRregister.
subsp,sp,#4;reservedforPC
stmfdsp!
{r8-r9}
;IMPORTANTCAUTION
;ifI_ISPCisntusedproperly,I_ISPRcanbe0inthisroutine.
ldrr9,=I_ISPR
ldrr9,[r9]
movr8,#0x0
0
movsr9,r9,lsr#1
bcs%F1
addr8,r8,#4
b%B0
1
ldrr9,=HandleADC
addr9,r9,r8
ldrr9,[r9]
strr9,[sp,#8]
ldmfdsp!
{r8-r9,pc}
;****************************************************
;*START*
;****************************************************
ResetHandler
ldrr0,=WTCON;watchdogdisable
ldrr1,=0x0
strr1,[r0]
ldrr0,=INTMSK
ldrr1,=0x07ffffff;allinterruptdisable
strr1,[r0]
;****************************************************
;*Setclockcontrolregisters*
;****************************************************
ldrr0,=LOCKTIME
ldrr1,=800;count=t_lock*Fin(t_lock=200us,Fin=4MHz)=800
strr1,[r0]
[PLLONSTART
ldrr0,=PLLCON;temporarysettingofPLL
ldrr1,=((M_DIV<<12)+(P_DIV<<4)+S_DIV);Fin=10MHz,Fout=40MHz
strr1,[r0]
]
ldrr0,=CLKCON
ldrr1,=0x7ff8;AllunitblockCLKenable
strr1,[r0]
;****************************************************
;*Setmemorycontrolregisters*
;****************************************************
ldrr0,=SMRDATA
ldmiar0,{r1-r13}
ldrr0,=0x01c80000;BWSCONAddress
stmiar0,{r1-r13}
;****************************************************
;*Initializestacks*
;****************************************************
ldrsp,=SVCStack;Why?
blInitStacks
;****************************************************
;*SetupIRQhandler*
;****************************************************
ldrr0,=HandleIRQ;Thisroutineisneeded
ldrr1,=IsrIRQ;ifthereisn't'subspc,lr,#4at0x18,0x1c
strr1,[r0]
;********************************************************
;*CopyandpasteRWdata/zeroinitializeddata*
;********************************************************
ldrr0,=|Image$$RO$$Limit|;GetpointertoROMdata
ldrr1,=|Image$$RW$$Base|;andRAMcopy
ldrr3,=|Image$$ZI$$Base|
;Zeroinitbase=>topofinitialiseddata
cmpr0,r1;Checkthattheyaredifferent
beq%F1
0
cmpr1,r3;Copyinitdata
ldrccr2,[r0],#4;-->LDRCCr2,[r0]+ADDr0,r0,#4
strccr2,[r1],#4;-->STRCCr2,[r1]+ADDr1,r1,#4
bcc%B0
1
ldrr1,=|Image$$ZI$$Limit|;Topofzeroinitsegment
movr2,#0
2
cmpr3,r1;Zeroinit
strccr2,[r3],#4
bcc%B2
[:
LNOT:
THUMBCODE
BLMain;Dontusemain()
B.
]
[THUMBCODE;forstart-upcodeforThumbmode
orrlr,pc,#1
bxlr
CODE16
blMain;Dontusemain()
b.
CODE32
]
;****************************************************
;*Thefunctionforinitializingstack*
;****************************************************
InitStacks
;DontuseDRAM,suchasstmfd,ldmfd......
;SVCstackisinitializedbefore
;Undertoolkitver2.50,'msrcpsr,r1'canbeusedinsteadof'msrcpsr_cxsf,r1'
mrsr0,cpsr
bicr0,r0,#MODEMASK
orrr1,r0,#UNDEFMODE|NOINT
msrcpsr_cxsf,r1;UndefMode
ldrsp,=UndefStack
orrr1,r0,#ABORTMODE|NOINT
msrcpsr_cxsf,r1;AbortMode
ldrsp,=AbortStack
orrr1,r0,#IRQMODE|NOINT
msrcpsr_cxsf,r1;IRQMode
ldrsp,=IRQStack
orrr1,r0,#FIQMODE|NOINT
msrcpsr_cxsf,r1;FIQMode
ldrsp,=FIQStack
bicr0,r0,#MODEMASK|NOINT
orrr1,r0,#SVCMODE
msrcpsr_cxsf,r1;SVCMode
ldrsp,=SVCStack
;USERmodeisnotinitialized.
movpc,lr;TheLRregistermaybenotvalidforthemodechanges.
;****************************************************
;*Thefunctionforenteringpowerdownmode*
;****************************************************
;voidEnterPWDN(intCLKCON);
EnterPWDN
movr2,r0;r0=CLKCON
ldrr0,=REFRESH
ldrr3,[r0]
movr1,r3
orrr1,r1,#0x400000;self-refreshenable
strr1,[r0]
nop;Waituntilself-refreshisissued.Maynotbeneeded.
nop;Iftheotherbusmasterholdsthebus,...
nop;movr0,r0
nop
nop
nop
nop
;enterPOWERDNmode
ldrr0,=CLKCON
strr2,[r0]
;waituntilenterSL_IDLE,STOPmodeanduntilwake-up
movr0,#0xff
0subsr0,r0,#1
bne%B0
;exitfromDRAM/SDRAMselfrefreshmode.
ldrr0,=REFRESH
strr3,[r0]
movpc,lr
LTORG
SMRDATADATA
;*****************************************************************
;*Memoryconfigurationhastobeoptimizedforbestperformance*
;*Thefollowingparameterisnotoptimized.*
;*****************************************************************
;***memoryaccesscycleparameterstrategy***
;1)EvenFP-DRAM,EDOsettinghasmorelatefetchpointbyhalf-clock
;2)Thememorysettings,here,aremadethe