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

📄 vector.s

📁 可以实现44B0的底层所有通信
💻 S
字号:



ModeMask 		EQU	0x1F
SVC32Mode		EQU	0x13
IRQ32Mode		EQU	0x12
FIQ32Mode		EQU	0x11
User32Mode		EQU	0x10
Abort32Mode		EQU	0x17
Undef32Mode		EQU	0x1B
IRQ_BIT			EQU	0x80
FIQ_BIT			EQU	0x40

	GBLS	MainEntry
MainEntry	SETS	"Main"
	IMPORT	$MainEntry


;**********************************************************
;检查是否使用tasm.exe进行编译
	
 GBLL    THUMBCODE
    [ {CONFIG} = 16	
THUMBCODE SETL	{TRUE}
    CODE32
    |   
THUMBCODE SETL	{FALSE}
    ]

    [ THUMBCODE
    CODE32   ;for start-up code for Thumb mode
    ]    
 	    
 	    
;******************************************************
;  SelfBoot edited by tianjh  05.04.06
	AREA	SelfBoot,	CODE,	READONLY
	
	
	IMPORT	UDF_INS_VECTOR
	IMPORT	SWI_SVC_VECTOR
	IMPORT	INS_ABT_VECTOR
	IMPORT	DAT_ABT_VECTOR
	IMPORT	IRQ_SVC_VECTOR
	IMPORT	FIQ_SVC_VECTOR				
	
	
	
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;***************************************************
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

	
;IMPORT		HandleADC		
;IMPORT		HandleRTC		
;IMPORT		HandleUTXD1		
;IMPORT		HandleUTXD0		
;IMPORT		HandleSIO		
;IMPORT		HandleIIC		
;IMPORT		HandleURXD1		
;IMPORT		HandleURXD0		
;IMPORT		HandleTIMER5	
;IMPORT		HandleTIMER4	
;IMPORT		HandleTIMER3	
;IMPORT		HandleTIMER2	
;IMPORT		HandleTIMER1	
;IMPORT		HandleTIMER0	
;IMPORT		HandleUERR01	
;IMPORT		HandleWDT		
;IMPORT		HandleBDMA1		
;IMPORT		HandleBDMA0		
;IMPORT		HandleZDMA1		
;IMPORT		HandleZDMA0		
;IMPORT		HandleTICK		
;IMPORT		HandleEINT4567	
;IMPORT		HandleEINT3		
;IMPORT		HandleEINT2		
;IMPORT		HandleEINT1		
;IMPORT		HandleEINT0		 	

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

		
	ENTRY	
	IF :DEF: |ads$version|
	ELSE
	EXPORT	__main
__main
	ENDIF		
ResetEntry
	b	SYS_RST_HANDLER			;FOR debugging		
	b	UDF_INS_HANDLER			;handlerUndef
	b	SWI_SVC_HANDLER			;SWI(SoftWare Interrupt) interrupt handler
	b	INS_ABT_HANDLER			;handler PAbort
	b	DAT_ABT_HANDLER			;handler DAbort
	b	.						;reserved by ARM
	b	IRQ_SVC_HANDLER			;handler IRQ
	b	FIQ_SVC_HANDLER			;handler FIQ	



;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;******************************************************
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7

	MACRO	
$Label	HANDLER	$Vector
$Label
	sub	lr, lr, #4			
	stmfd	sp!, {r0-r3, lr}		;FD满递减堆栈  执行寄存器压栈操作	
	ldr	r0, =$Vector				;汇编里的处理函数地址,然后跳到C中,在DRAM
	ldr	pc, [r0]					;中断向量地址给R0
	ldmfd	sp!, {r0-r3, pc}^		;数据出栈
	MEND
	
;  ^ = MAP -->定义一个结构化的内存表(Storage Map)的首地址	
	
UDF_INS_HANDLER
	stmfd	sp!, {r0-r3, lr}
	ldr	r0, =UDF_INS_VECTOR
	mov	lr, pc
	ldr	pc, [r0]
	ldmfd	sp!, {r0-r3, pc}^
SWI_SVC_HANDLER
	stmfd	sp!, {r0-r3, lr}
	ldr	r0, =SWI_SVC_VECTOR
	mov	lr, pc
	ldr	pc, [r0]
	ldmfd	sp!, {r0-r3, pc}^
INS_ABT_HANDLER
	sub	lr, lr, #4
	stmfd	sp!, {r0-r3, lr}
	ldr	r0, =INS_ABT_VECTOR
	mov	lr, pc
	ldr	pc, [r0]
	ldmfd	sp!, {r0-r3, pc}^
DAT_ABT_HANDLER
	sub	lr, lr, #4
	stmfd	sp!, {r0-r3, lr}
	ldr	r0, =DAT_ABT_VECTOR
	mov	lr, pc
	ldr	pc, [r0]
	ldmfd	sp!, {r0-r3, pc}^
IRQ_SVC_HANDLER
	sub	lr, lr, #4
	stmfd	sp!, {r0-r12, lr}	
	mrs	r0, spsr
	stmfd	sp!, {r0}
	ldr	r0, =IRQ_SVC_VECTOR
	ldr	pc, [r0]	
FIQ_SVC_HANDLER
	sub	lr, lr, #4
	stmfd	sp!, {r0-r12, lr}	
	mrs	r0, spsr
	stmfd	sp!, {r0}
	ldr	r0, =IRQ_SVC_VECTOR
	ldr	pc, [r0]
				
;在程序的开始处,首先建立了默认的中断调用函数.这个过程大家一定非常熟悉,
;首先执行了压栈,然后给出了中断入口地址.这个HandleFiq就是我们前面提到的在DRAM中建立的中断向量其中一个的地址。
;在HandleFiq开始的四个字节中,放着汇编中断处理函数的入口地址。				
				
				
;*******************************************************
;***************  start ********************************				
;*******************************************************
SYS_RST_HANDLER					
	
	mrs	r0, cpsr				;mrs--> 状态寄存器到通用寄存器的传送指令
								;enter svc mode and disable irq,fiq
								; disable irq,fiq ???????  tianjh
	bic	r0, r0, #ModeMask		;MODEMASK-->0x1f	tianjh
	
;	orr	r0, r0, #(SVC32Mode :OR: IRQ_BIT :OR: FIQ_BIT)	
	orr	r0, r0, #SVC32Mode 
								;-->1101 0011
								;SVC32Mode-->0x13;IRQ_BIT-->0x80;FIQ_BIT -->0x40  tianjh
	msr	cpsr_c, r0				;mrs--> 通用寄存器到状态寄存器的传送指令
	
	
	;*******************************************************
	IMPORT	InitSystem
	bl	InitSystem				;转移连接到
	
	;***********************************************
	;设置IQR处理程序入口, 在配置好RAM后设置		
	;ldr	r0, =IRQ_SVC_VECTOR	
	;ldr	r1, =IRQ_SERVICE		
	;str	r1, [r0]	
	;***********************************************
	
	
	
	;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
	;;;copy and plaste 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中
	;;****************************	

	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		
	
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;********  INIT RAM DATA *******
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
		
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			
	
	

		 		 		
	ldr	pc,	GotoMain	

GotoMain	DCD	$MainEntry





;***********************************************
	IMPORT	|Image$$RO$$Base|	; ROM code start	
	IMPORT	|Image$$RO$$Limit|	; RAM data starts after ROM program
	IMPORT	|Image$$RW$$Base|	; Pre-initialised variables
	IMPORT	|Image$$ZI$$Base|	; uninitialised variables
	IMPORT	|Image$$ZI$$Limit|	; End of variable RAM space


BaseOfROM	DCD	|Image$$RO$$Base|
TopOfROM	DCD	|Image$$RO$$Limit|
BaseOfBSS	DCD	|Image$$RW$$Base|
BaseOfZero	DCD	|Image$$ZI$$Base|
EndOfBSS	DCD	|Image$$ZI$$Limit|

	EXPORT	GetBaseOfROM
	EXPORT	GetEndOfROM
	EXPORT	GetBaseOfBSS
	EXPORT	GetBaseOfZero
	EXPORT	GetEndOfBSS

	
;***********************************************	
GetBaseOfROM
	ldr	r0, BaseOfROM
	mov	pc, lr	

;***********************************************	
GetEndOfROM
	ldr	r0, TopOfROM
	mov	pc,	lr

;***********************************************	
GetBaseOfBSS
	ldr	r0,	BaseOfBSS
	mov	pc,	lr
;***********************************************	
GetBaseOfZero
	ldr	r0,	BaseOfZero
	mov	pc,	lr

;***********************************************	
GetEndOfBSS
	ldr	r0,	EndOfBSS
	mov	pc,	lr
	
;***********************************************	
	
	END		
		

⌨️ 快捷键说明

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