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

📄 44binit.s

📁 44b0+ucos dgfgfjhjkjkjkjjl
💻 S
📖 第 1 页 / 共 2 页
字号:
;********************************************************
; Name		: 44BINIT.S									*
; Modify	: hugang, hgx2000@mail.china.com			*
; Description:											*
; C start up codes								   		*
;	Configure memory, Initialize ISR ,stacks			*
;   Initialize C-variables								*
;	Fill zeros into zero-initialized C-variables		*
;********************************************************
 
    GET ..\inc\option.s
    GET ..\inc\memcfg.s

;****************************************************************************
;存储器空间
;GCS6 64M 16bit(8MB) DRAM/SDRAM(0xc000000-0xc7fffff)
;APP    RAM=0xc000000~0xc7effff 
;44BMON RAM=0xc7f0000-0xc7fffff
;STACK	   =0xc7ffa00		   

;****************************************************************************
;中断控制预定义
INTPND	    EQU	0x01e00004
INTMOD	    EQU	0x01e00008
INTMSK	    EQU	0x01e0000c
I_ISPR	    EQU	0x01e00020
I_CMST	    EQU	0x01e0001c

;****************************************************************************
;看门狗定时器预定义
WTCON	    EQU	0x01d30000

;****************************************************************************
;系统时钟预定义
PLLCON	    EQU	0x01d80000
CLKCON	    EQU	0x01d80004
LOCKTIME    EQU	0x01d8000c
	
;****************************************************************************
;存储器控制预定义
REFRESH	    EQU 0x01c80024

;****************************************************************************
;BDMA目的寄存器
BDIDES0     EQU 0x1f80008
BDIDES1     EQU 0x1f80028

;****************************************************************************
;预定义常数(常量)
USERMODE    EQU	0x10
FIQMODE	    EQU	0x11
IRQMODE	    EQU	0x12
SVCMODE	    EQU	0x13
ABORTMODE   EQU	0x17
UNDEFMODE   EQU	0x1b
MODEMASK    EQU	0x1f
NOINT	    EQU	0xc0

;****************************************************************************
;检查是否使用tasm.exe进行编译
    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 
    
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;Code Begin;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    AREA    Init,CODE,READONLY

	ENTRY
ResetEntry
    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    H/W interrupt vector table
    ldr pc,=HandlerEINT1    ;	
    ldr pc,=HandlerEINT2    ;
    ldr pc,=HandlerEINT3    ;
    ldr pc,=HandlerEINT4567 ;
    ldr pc,=HandlerTICK	    ;mGA
    b .
    b .
    ldr pc,=HandlerZDMA0    ;mGB
    ldr pc,=HandlerZDMA1    ;
    ldr pc,=HandlerBDMA0    ;
    ldr pc,=HandlerBDMA1    ;
    ldr pc,=HandlerWDT	    ;
    ldr pc,=HandlerUERR01   ;mGB
    b .
    b .
    ldr pc,=HandlerTIMER0   ;mGC
    ldr pc,=HandlerTIMER1   ;
    ldr pc,=HandlerTIMER2   ;
    ldr pc,=HandlerTIMER3   ;
    ldr pc,=HandlerTIMER4   ;
    ldr pc,=HandlerTIMER5   ;mGC
    b .
    b .
    ldr pc,=HandlerURXD0    ;mGD
    ldr pc,=HandlerURXD1    ;
    ldr pc,=HandlerIIC	    ;
    ldr pc,=HandlerSIO	    ;
    ldr pc,=HandlerUTXD0    ;
    ldr pc,=HandlerUTXD1    ;mGD
    b .
    b .
    ldr pc,=HandlerRTC	    ;mGKA
    b .						;
    b .						;
    b .						;
    b .						;
    b .						;mGKA
    b .
    b .
    ldr pc,=HandlerADC	    ;mGKB
    b .						;
    b .						;
    b .						;
    b .						;
    b .						;mGKB
    b .
    b .
;0xe0=EnterPWDN
    ldr pc,=EnterPWDN

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;复位中断处理函数																							;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
ResetHandler

    ldr	    r0,=WTCON	    ;禁止看门狗
    ldr	    r1,=0x0 		
    str	    r1,[r0]

    ldr	    r0,=INTMSK
    ldr	    r1,=0x07ffffff  ;禁止所有中断
    str	    r1,[r0]

   	;以下三段设置时钟控制寄存器
    ldr		r0,=LOCKTIME
    ldr		r1,=0xfff
    str		r1,[r0]

    [ PLLONSTART
	ldr		r0,=PLLCON			;锁相环倍频设定
    ldr		r1,=((M_DIV<<12)+(P_DIV<<4)+S_DIV)		;设定系统主时钟频率
	str		r1,[r0]
    ]

    ldr	    r0,=CLKCON		 
    ldr	    r1,=0x7ff8	    ;所有功能单元块时钟使能
    str	    r1,[r0]

	;****************************************************
	;change BDMACON reset value for BDMA                *
	;****************************************************
    ldr     r0,=BDIDES0       
    ldr     r1,=0x40000000   ;BDIDESn reset value should be 0x40000000	 
    str     r1,[r0]

    ldr     r0,=BDIDES1      
    ldr     r1,=0x40000000   ;BDIDESn reset value should be 0x40000000	 
    str     r1,[r0]

    ;****************************************************
    ;设定存储器控制寄存器            					* 	
    ;****************************************************
	adr	r0, ResetHandler
	ldr	r1, =ResetHandler
	sub	r0, r1, r0		
	ldr	r1, =SMRDATA
	sub	r0, r1, r0 
	ldmia   r0, {r1-r13}
	ldr	    r0, =0x01c80000			;BWSCON Address
	stmia   r0, {r1-r13}	

    ;****************************************************
    ;初始化堆栈              							* 
    ;****************************************************
    ldr	    sp, =SVCStack
    bl	    InitStacks

    ;****************************************************
    ;设置中断处理        								*
    ;****************************************************
    ldr	    r0,=HandleIRQ		;This routine is needed
    ldr	    r1,=IsrIRQ			;if there isn't 'subs pc,lr,#4' at 0x18, 0x1c
    str	    r1,[r0]

    ;****************************************************
    ;Copy and paste RW data/zero initialized data    	*
    ;****************************************************
	adr		r0, ResetEntry					
	ldr		r1,	BaseOfROM
	cmp		r0,	r1
	ldreq	r0, TopOfROM
	beq		InitRamData
	
	;****************************************************
	;计算拷贝程序在flash中的实际位置					*
	;****************************************************
	ldr		r2,	=CopyProcBeg
	sub		r1, r2, r1
	add		r0, r0, r1	
	ldr		r3,	=CopyProcEnd
	
	;****************************************************
	;将拷贝程序复制到ram中								*
	;****************************************************
0	
	ldmia	r0!, {r4-r7}
	stmia	r2!, {r4-r7}
	cmp		r2, r3
	bcc		%B0	
	
	;********************************************************
	;开始用ram中的拷贝程序复本将所有剩下的代码复制到ram中	*
	;********************************************************
	ldr		r3, TopOfROM		
	ldr		pc, =CopyProcBeg
	
	;********************************************************
	;本段将代码由实际烧入的地址拷贝到ro-base所指定的位置	*
	;只拷贝CopyProcEnd以后的代码							*
	;********************************************************
CopyProcBeg	
0	
	ldmia	r0!, {r4-r11}
	stmia	r2!, {r4-r11}
	cmp		r2, r3
	bcc		%B0	
CopyProcEnd
	
	sub		r1, r2, r3
	sub		r0, r0, r1		
	
InitRamData	
	ldr		r2, BaseOfBSS
	ldr		r3, BaseOfZero	
0
	cmp		r2, r3
	ldrcc	r1, [r0], #4
	strcc	r1, [r2], #4
	bcc		%B0	

	mov		r0,	#0
	ldr		r3,	EndOfBSS
1	
	cmp		r2,	r3
	strcc	r0, [r2], #4
	bcc		%B1			
		 		 		
    [ :LNOT:THUMBCODE
	BL		Main	    ;从汇编进入C语言代码空间,不要使用main()
	B	.						
    ]

    [ THUMBCODE		    ;for start-up code for Thumb mode
	orr     lr,pc,#1
	bx      lr
	CODE16
	bl      Main	    ;从汇编进入C语言代码空间,不要使用main()
	b       .
	CODE32
    ]

	LTORG
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;中断向量表                                                                                 	    	;
;Example: HandlerADC	HANDLE HandleADC 解为															;

⌨️ 快捷键说明

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