?? 44binit.s
字號:
;********************************************************
;* NAME : 44BINIT.S *
;* Version : 10.April.2000 *
;* Description: *
;* C start up codes *
;* Configure memory, Initialize ISR ,stacks *
;* Initialize C-variables *
;* Fill zeros into zero-initialized C-variables *
;********************************************************
; GET option.a
;匯編程序設(shè)置
_ISR_STARTADDRESS EQU 0xc7fff00
;16位或者32位總線設(shè)置
GBLA BUSWIDTH
BUSWIDTH SETA 16
;DRAM或者SDRAM"
GBLS BDRAMTYPE
BDRAMTYPE SETS "SDRAM"
;這個值在Flash存儲器編程時應(yīng)該為真
;這個值在SDRAM存儲器編程時應(yīng)該為假
GBLL PLLONSTART
PLLONSTART SETL {TRUE}
GBLA PLLCLK
PLLCLK SETA 16000000
[ PLLCLK = 16000000
;系統(tǒng)主頻計算公式如下:
;Fout = (8+ M_DIV)*Fout/[(2+P_DIV)*2]
M_DIV EQU 12 ;Fout = Fin * 2
P_DIV EQU 3
S_DIV EQU 1
]
; GET memcfg.a
;**********存儲器控制參數(shù)*******************************
;Bank 0 parameter
B0_Tacs EQU 0x0 ;0clk
B0_Tcos EQU 0x0 ;0clk
B0_Tacc EQU 0x6 ;10clk
B0_Tcoh EQU 0x0 ;0clk
B0_Tah EQU 0x0 ;0clk
B0_Tacp EQU 0x0 ;0clk
B0_PMC EQU 0x0 ;normal(1data)
;Bank 1 parameter
B1_Tacs EQU 0x3 ;4clk
B1_Tcos EQU 0x3 ;4clk
B1_Tacc EQU 0x7 ;14clk
B1_Tcoh EQU 0x3 ;4clk
B1_Tah EQU 0x3 ;4clk
B1_Tacp EQU 0x3 ;6clk
B1_PMC EQU 0x0 ;normal(1data)
;Bank 2 parameter
B2_Tacs EQU 0x3 ;4clk
B2_Tcos EQU 0x3 ;4clk
B2_Tacc EQU 0x7 ;14clk
B2_Tcoh EQU 0x3 ;4clk
B2_Tah EQU 0x3 ;4clk
B2_Tacp EQU 0x3 ;6clk
B2_PMC EQU 0x0 ;normal(1data)
;Bank 3 parameter
B3_Tacs EQU 0x3 ;4clk
B3_Tcos EQU 0x3 ;4clk
B3_Tacc EQU 0x7 ;14clk
B3_Tcoh EQU 0x3 ;4clk
B3_Tah EQU 0x3 ;4clk
B3_Tacp EQU 0x3 ;6clk
B3_PMC EQU 0x0 ;normal(1data)
;Bank 4 parameter
B4_Tacs EQU 0x3 ;4clk
B4_Tcos EQU 0x3 ;4clk
B4_Tacc EQU 0x7 ;14clk
B4_Tcoh EQU 0x3 ;4clk
B4_Tah EQU 0x3 ;4clk
B4_Tacp EQU 0x3 ;6clk
B4_PMC EQU 0x0 ;normal(1data)
;Bank 5 parameter
B5_Tacs EQU 0x3 ;4clk
B5_Tcos EQU 0x3 ;4clk
B5_Tacc EQU 0x7 ;14clk
B5_Tcoh EQU 0x3 ;4clk
B5_Tah EQU 0x3 ;4clk
B5_Tacp EQU 0x3 ;6clk
B5_PMC EQU 0x0 ;normal(1data)
;Bank 6(if SROM) parameter
B6_Tacs EQU 0x3 ;4clk
B6_Tcos EQU 0x3 ;4clk
B6_Tacc EQU 0x7 ;14clk
B6_Tcoh EQU 0x3 ;4clk
B6_Tah EQU 0x3 ;4clk
B6_Tacp EQU 0x3 ;6clk
B6_PMC EQU 0x0 ;normal(1data)
;Bank 7(if SROM) parameter
B7_Tacs EQU 0x3 ;4clk
B7_Tcos EQU 0x3 ;4clk
B7_Tacc EQU 0x7 ;14clk
B7_Tcoh EQU 0x3 ;4clk
B7_Tah EQU 0x3 ;4clk
B7_Tacp EQU 0x3 ;6clk
B7_PMC EQU 0x0 ;normal(1data)
;Bank 6 parameter
;BDRAMTYPE="DRAM" ;MT=01(FP DRAM) or 10(EDO DRAM)
;B6_MT EQU 0x2 ;EDO DRAM
;B6_Trcd EQU 0x0 ;1clk
;B6_Tcas EQU 0x0 ;1clk
;B6_Tcp EQU 0x0 ;1clk
;B6_CAN EQU 0x2 ;10bit
;BDRAMTYPE="SDRAM" ;MT=11(SDRAM)
B6_MT EQU 0x3 ;SDRAM
B6_Trcd EQU 0x0 ;2clk
B6_SCAN EQU 0x0 ;8bit
;Bank 7 parameter
;BDRAMTYPE="DRAM" ;MT=01(FP DRAM) or 10(EDO DRAM)
;B7_MT EQU 0x2 ;EDO DRAM
;B7_Trcd EQU 0x0 ;2clk
;B7_Tcas EQU 0x0 ;2clk
;B7_Tcp EQU 0x0 ;2clk
;B7_CAN EQU 0x2 ;10bit
;BDRAMTYPE="SDRAM" ;MT=11(SDRAM)
B7_MT EQU 0x3 ;SDRAM
B7_Trcd EQU 0x0 ;2clk
B7_SCAN EQU 0x0 ;8bit
;REFRESH parameter
REFEN EQU 0x1 ;Refresh enable
TREFMD EQU 0x0 ;CBR(CAS before RAS)/Auto refresh
Trp EQU 0x0 ;2clk
Trc EQU 0x1 ;5clk
Tchr EQU 0x2 ;3clk
;REFCNT = 2048 + 1 - MCLK(MHz) * 15.6
REFCNT EQU 1050 ;period=15.6us, MCLK=64Mhz
;Memory Area
;GCS6 64M 16bit(8MB) DRAM/SDRAM(0xc000000-0xc7fffff)
;APP RAM=0xc000000~0xc7effff
;MON RAM=0xc7f0000-0xc7fffff
;STACK =0xc7ffa00
;Interrupt Control
INTPND EQU 0x01e00004
INTMOD EQU 0x01e00008
INTMSK EQU 0x01e0000c
I_ISPR EQU 0x01e00020
I_CMST EQU 0x01e0001c
;Watchdog timer
WTCON EQU 0x01d30000
;Clock Controller
PLLCON EQU 0x01d80000
CLKCON EQU 0x01d80004
LOCKTIME EQU 0x01d8000c
;Memory Controller
REFRESH EQU 0x01c80024
;BDMA destination register
BDIDES0 EQU 0x1f80008
BDIDES1 EQU 0x1f80028
;Pre-defined constants
USERMODE EQU 0x10
FIQMODE EQU 0x11
IRQMODE EQU 0x12
SVCMODE EQU 0x13
ABORTMODE EQU 0x17
UNDEFMODE EQU 0x1b
MODEMASK EQU 0x1f
NOINT EQU 0xc0
;check if tasm.exe is used.
GBLL THUMBCODE
[ {CONFIG} = 16
THUMBCODE SETL {TRUE}
CODE32
|
THUMBCODE SETL {FALSE}
]
[ THUMBCODE
CODE32 ;for start-up code for Thumb mode
]
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;Vector Macro;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
MACRO
$HandlerLabel HANDLER $HandleLabel
$HandlerLabel
sub sp,sp,#4 ;decrement sp(to store jump address)
stmfd sp!,{r0} ;PUSH the work register to stack(lr does't push because it return to original address)
ldr r0,=$HandleLabel ;load the address of HandleXXX to r0
ldr r0,[r0] ;load the contents(service routine start address) of HandleXXX
str r0,[sp,#4] ;store the contents(ISR) of HandleXXX to stack
ldmfd sp!,{r0,pc} ;POP the work register and pc(jump to ISR)
MEND
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
IMPORT Main ;The main entry of mon program
EXPORT ResetHandler
PRESERVE8
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;Code Begin;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
AREA Init,CODE,READONLY
ENTRY
b ResetHandler ;for debug
b HandlerUndef ;handlerUndef
b HandlerSWI ;SWI interrupt handler
b HandlerPabort ;handlerPAbort
b HandlerDabort ;handlerDAbort
b . ;handlerReserved
b HandlerIRQ
b HandlerFIQ
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IMPORTANT NOTE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;If the H/W vectored interrutp mode is enabled, The above two instructions should ;
;be changed like below, to work-around with H/W bug of S3C44B0X interrupt controller. ;
; b HandlerIRQ -> subs pc,lr,#4 ;
; b HandlerIRQ -> subs pc,lr,#4 ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;中斷向量表
VECTOR_BRANCH
ldr pc,=HandlerEINT0 ;mGA 0x20
ldr pc,=HandlerEINT1 ;
ldr pc,=HandlerEINT2 ;
ldr pc,=HandlerEINT3 ;
ldr pc,=HandlerEINT4567 ;
ldr pc,=HandlerTICK ;mGA 0x34
b .
b .
ldr pc,=HandlerZDMA0 ;mGB 0x40
ldr pc,=HandlerZDMA1 ;
ldr pc,=HandlerBDMA0 ;
ldr pc,=HandlerBDMA1 ;
ldr pc,=HandlerWDT ;
ldr pc,=HandlerUERR01 ;mGB 0x54
b .
b .
ldr pc,=HandlerTIMER0 ;mGC 0x60
ldr pc,=HandlerTIMER1 ;
ldr pc,=HandlerTIMER2 ;
ldr pc,=HandlerTIMER3 ;
ldr pc,=HandlerTIMER4 ;
ldr pc,=HandlerTIMER5 ;mGC 0x74
b .
b .
ldr pc,=HandlerURXD0 ;mGD 0x80
ldr pc,=HandlerURXD1 ;
ldr pc,=HandlerIIC ;
ldr pc,=HandlerSIO ;
ldr pc,=HandlerUTXD0 ;
ldr pc,=HandlerUTXD1 ;mGD 0x94
b .
b .
ldr pc,=HandlerRTC ;mGKA 0xa0
b .
b .
b .
b .
b . ;mGKA
b .
b .
ldr pc,=HandlerADC ;mGKB 0xc0
b . ;
b . ;
b . ;
b . ;
b . ;mGKB
b .
b .
ldr pc,=EnterPWDN ;0xe0=EnterPWDN
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;向量中斷的處理方法 ;
;Example: HandlerADC HANDLE HandleADC 解為 ;
;HandlerADC ;HandlerADC為中斷向量表的入口 ;
; sub sp,sp,#4 ;將sp減少一個字節(jié),使其在堆棧高端留出存儲返回地址,因為pc在寄存器組中的 ;
; ;的位置大于r0,出棧時裝入的是棧的高端的內(nèi)容 ;
; stmfd sp!,{r0} ;保存r0 ;
; ldr r0,=HandleADC ;裝載中斷處理函數(shù)的指針 ;
; ldr r0,[r0] ;裝載中斷處理函數(shù)的地址 ;
; str r0,[sp,#4] ;將中斷處理函數(shù)的地址存入剛才預(yù)留的位置,r0的上面 ;
; ldmfd sp!,{r0,pc} ;出棧后,pc指向的既是中斷處理函數(shù)的地址 ;
; ;
; INTCON^2 == 0時,vector table使能 ;
; 發(fā)生中斷->HandlerADC->HandleADC(pISR_ADC,即:_ISR_STARTADDRESS+0x20); ;
; 若要在程序中處理此中斷,只要將中斷服務(wù)函數(shù)的指針賦給pISR_ADC,如:pISR_ADC = (int)ADCIsr ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
LTORG
HandlerFIQ HANDLER HandleFIQ
HandlerIRQ HANDLER HandleIRQ
HandlerUndef HANDLER HandleUndef
HandlerSWI HANDLER HandleSWI
HandlerDabort HANDLER HandleDabort
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -