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

📄 vector1.s

📁 可以实现44B0的底层所有通信
💻 S
📖 第 1 页 / 共 2 页
字号:
;****************************************************************************
; Name		: VECTOR.S									                    *
; Modified	: CHENZHI      2006-4-9 20:26			                        *
; Description:											                    *
; C start up codes		for "ARM7 Study Board"   		                    *
;	Configure memory, Initialize ISR ,stacks			                    *
;   Initialize C-variables								                    *
;	Fill zeros into zero-initialized C-variables		                    *
;****************************************************************************
 
    INCLUDE ..\inc\option.s
    INCLUDE ..\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	;当前IRQ主群优先级

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

;****************************************************************************
;系统时钟预定义
PLLCON	    EQU	0x01d80000	;PLL控制
CLKCON	    EQU	0x01d80004	;时钟控制
LOCKTIME    EQU	0x01d8000c	;锁时计数器
	
;****************************************************************************
;存储器控制预定义
REFRESH	    EQU 0x01c80024	;DRAM/SDRAM刷新控制

;****************************************************************************
;BDMA目的寄存器
BDIDES0     EQU 0x1f80008	;BDMA初始目的寄存器
BDIDES1     EQU 0x1f80028	;BDMA当前目的寄存器

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




;****************************************************************************
;检查是否使用tasm.exe进行编译
    GBLL    THUMBCODE		;GBLL -->声明一个全局逻辑变量,并将其初始化为{FALSE} 
    [ {CONFIG} = 16		
THUMBCODE SETL	{TRUE}		;SETL -->给全局或局部逻辑变量赋值
    CODE32					;CODE32-->ARM指令
    |   
THUMBCODE SETL	{FALSE}
    ]

    [ THUMBCODE
    CODE32   ;for start-up code for Thumb mode
    ]

;;;;;;;;;;;Vector Macro;;;;;;;;;;;;;;;;;;
;;;{$label}     macroname {$parameter{,$parameter}...}
  
    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 do not 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	sectionname {,attr}{,attr}
    AREA    SelfBoot,CODE,READONLY	;AREA -->定义一个代码段或数据段

    ENTRY 						;指定程序入口点
    
ResetEntry
    b ResetHandler				;for debug				复位入口
    b HandlerUndef				;handlerUndef			Undef异常入口
    b HandlerSWI				;SWI interrupt handler	SWI中断入口
    b HandlerPabort				;handlerPAbort			指令Abort异常入口
    b HandlerDabort				;handlerDAbort			数据Abort异常入口
    b .							;handlerReserved		ARM核保留
    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                  	;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

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

	mrs r0,cpsr
	bic r0,r0,#MODEMASK
	
	orr r0,r0,#(SVCMODE :OR: IRQ_BIT :OR: FIQ_BIT)
	msr cpsr_c,r0  
  
	;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
	;********************************************
	;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;    
    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		;复位后位SVC模式
    bl	    InitStacks



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



	;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
	;********************************************
	;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;    
    ;****************************************************
    ;拷贝并粘贴 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			
		 		 		

	;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
	;********************************************
	;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;    
	;********************************************
	;跳入主程序的main()						*
	;********************************************
 	
 	[ :LNOT:THUMBCODE
	BL		Main	    ;从汇编进入C语言代码空间,请使用Main(),不要使用main()
	B	.						

⌨️ 快捷键说明

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