⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 44binit.s

📁 S3C44B0X的启动程序,汇编格式
💻 S
📖 第 1 页 / 共 2 页
字号:
;********************************************************
;* 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
;汇编程序设置
_ISR_STARTADDRESS   EQU   0xc7fff00

;16位或者32位总线设置
			GBLA    BUSWIDTH
BUSWIDTH	SETA    16

;DRAM或者SDRAM"
			GBLS    BDRAMTYPE
BDRAMTYPE	SETS    "SDRAM"

;这个值在Flash存储器编程时应该为真
;这个值在SDRAM存储器编程时应该为假
			GBLL    PLLONSTART
PLLONSTART	SETL    {TRUE}

			GBLA	PLLCLK
PLLCLK		SETA	16000000

	[	PLLCLK = 16000000	
;系统主频计算公式如下:
;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
;**********存储器控制参数*******************************

;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	|Image$$RO$$Limit|	;End of ROM code (=start of ROM data)
    IMPORT	|Image$$RW$$Base|	;Base of RAM to initialise
    IMPORT	|Image$$ZI$$Base|	;Base and limit of area
    IMPORT	|Image$$ZI$$Limit|	;to zero initialise

    IMPORT  Main				;The main entry of mon program 

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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减少一个字节,使其在堆栈高端留出存储返回地址,因为pc在寄存器组中的			;
;								;的位置大于r0,出栈时装入的是栈的高端的内容									;
;   stmfd   sp!,{r0}			;保存r0																	;
;   ldr	    r0,=HandleADC		;装载中断处理函数的指针													;
;   ldr	    r0,[r0]				;装载中断处理函数的地址													;
;   str	    r0,[sp,#4]			;将中断处理函数的地址存入刚才预留的位置,r0的上面								;
;   ldmfd   sp!,{r0,pc}			;出栈后,pc指向的既是中断处理函数的地址									 	;
;                                                                                                       ;
;	INTCON^2 == 0时,vector table使能																		;
;	发生中断->HandlerADC->HandleADC(pISR_ADC,即:_ISR_STARTADDRESS+0x20);									;                          
;	若要在程序中处理此中断,只要将中断服务函数的指针赋给pISR_ADC,如:pISR_ADC = (int)ADCIsr                  	;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    LTORG	

HandlerFIQ		HANDLER HandleFIQ
HandlerIRQ		HANDLER HandleIRQ
HandlerUndef	HANDLER HandleUndef
HandlerSWI		HANDLER HandleSWI
HandlerDabort	HANDLER HandleDabort
HandlerPabort	HANDLER HandlePabort

HandlerADC		HANDLER HandleADC
HandlerRTC		HANDLER HandleRTC
HandlerUTXD1	HANDLER HandleUTXD1
HandlerUTXD0	HANDLER HandleUTXD0
HandlerSIO		HANDLER HandleSIO
HandlerIIC		HANDLER HandleIIC
HandlerURXD1	HANDLER HandleURXD1
HandlerURXD0	HANDLER HandleURXD0

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -