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

📄 vector.s

📁 一个在ARM上通用的IIC的程序,已经测试用过了,
💻 S
字号:
;定义各种异常模式和中断屏蔽
USERMODE		EQU	0x10
FIQMODE			EQU	0x11
IRQMODE			EQU	0x12
SVCMODE			EQU	0x13
ABORTMODE		EQU	0x17
UNDEFMODE		EQU	0x1B
MODEMASK 		EQU	0x1F
I_BIT			EQU	0x80
F_BIT			EQU	0x40
T_BIT			EQU	0x20
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
    ]
 ;定义一个调用程序的返回的宏
	MACRO		
	MOV_PC_LR
	[ THUMBCODE
    	bx lr
	|
		mov pc, lr
	]
	MEND
 	    
;******************************************************
	AREA	reset, CODE, READONLY

	ENTRY	
	
	EXPORT	__ENTRY
__ENTRY	
;复位和上电启动的入口
       ; IMPORT  ISR_IrqHandler
ResetEntry
	b	SYS_RST_HANDLER
	;b	UDF_INS_HANDLER
	;b	SWI_SVC_HANDLER
	;b	INS_ABT_HANDLER
	;b	DAT_ABT_HANDLER
	;b	.
	;b	IRQ_SVC_HANDLER
	;b	FIQ_SVC_HANDLER

;******************************************************
;功能:用一个宏来处理中断处理程序与中断向量地址的映射关系,很方便
;******************************************************
	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
	
;UDF_INS_HANDLER	HANDLER	UdfInsVector
;SWI_SVC_HANDLER	HANDLER	SwiSvcVector
;INS_ABT_HANDLER	HANDLER	InsAbtVector
;DAT_ABT_HANDLER	HANDLER	DatAbtVector
;IRQ_SVC_HANDLER	HANDLER	IrqSvcVector
;FIQ_SVC_HANDLER	HANDLER	FiqSvcVector
				
;*******************************************************
;系统复位处理程序
;*******************************************************
SYS_RST_HANDLER
	mrs	r0, cpsr				;enter svc mode and disable irq,fiq
	bic	r0, r0, #MODEMASK
	orr	r0, r0, #(SVCMODE :OR: I_BIT :OR: F_BIT)
	msr	cpsr_c, r0
	
	b	InitSystem
	
InitSystem_exit	
	
;****************************************************	
;初始化堆栈
	;Do not use DRAM,such as stmfd,ldmfd......
	;SVCstack is initialized before
	;Under toolkit ver 2.50, 'msr cpsr,r1' can be used instead of 'msr cpsr_cxsf,r1'
	
	mrs	r0, cpsr
	bic	r0, r0, #(MODEMASK|NOINT)
	
	orr	r1, r0, #UNDEFMODE|NOINT
	msr	cpsr_cxsf, r1		;UndefMode
	ldr	sp, =UndefStack
	
	orr	r1, r0, #ABORTMODE|NOINT
	msr	cpsr_cxsf, r1		;AbortMode
	ldr	sp, =AbortStack
	
	orr	r1, r0, #IRQMODE|NOINT
	msr	cpsr_cxsf, r1		;IRQMode
	ldr	sp, =IRQStack
	
	orr	r1, r0, #FIQMODE|NOINT
	msr	cpsr_cxsf, r1		;FIQMode
	ldr	sp, =FIQStack	
		
	orr	r1, r0, #SVCMODE		;enable irq,fiq
;	orr	r1, r0, #SVCMODE|NOINT	;disable irq, fiq
	msr	cpsr_cxsf,r1		;SVCMode
	ldr	sp, =SVCStack

	;USER mode is not initialized.
	;未初始化用户模式栈,程序使用SVC模式

;****************************************************	
;将RW拷贝到RWBASE(即运行后的地址),初始化ZI区域
	adr	r0, ResetEntry
	ldr	r2, BaseOfROM
	cmp	r0, r2
	ldreq	r0, TopOfROM
	beq	InitRam	
	ldr r3, TopOfROM
0	
	ldmia	r0!, {r4-r7}
	stmia	r2!, {r4-r7}
	cmp	r2, r3
	bcc	%B0
	
	sub	r2, r2, r3
	sub	r0, r0, r2				
		
InitRam	
	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
	
;****************************************************
;设置IQR处理程序入口, 在配置好RAM后设置	
;	IMPORT	IRQ_SERVICE
      ;  IMPORT ISR_IrqHandler
      ;  ldr	r0, =IrqSvcVector	
      ;  ldr     r1, =IRQ_SERVICE
	;ldr	r1, =ISR_IrqHandler		
	;str	r1, [r0]

;****************************************************

_main
__main
	EXPORT	_main
	EXPORT	__main
	
	ldr	lr, GotoMain
	MOV_PC_LR

	GBLS	MainEntry
MainEntry	SETS	"Main"
	IMPORT	$MainEntry

GotoMain	DCD	$MainEntry
;禁止中断
	EXPORT DisableInt
DisableInt
	mrs	r0,	cpsr
	orr	r0,	r0, #NOINT
	msr	cpsr_cf, r0
	MOV_PC_LR
;允许中断
	EXPORT EnableInt
EnableInt
	mrs	r0,	cpsr
	bic	r0,	r0, #NOINT
	msr	cpsr_cf, r0
	MOV_PC_LR
	
;save cpsr and disable int, r0 = address to save cpsr
	EXPORT	EnterCritical
EnterCritical   
	mrs	r1, cpsr
	str	r1, [r0]
	orr	r1, r1, #NOINT
	msr	cpsr_cxsf, r1		
	MOV_PC_LR
;restore cpsr, r0 = address to restore cpsr	
	EXPORT	ExitCritical
ExitCritical
	ldr	r1, [r0]
	msr	cpsr_cxsf, r1	
	MOV_PC_LR	
;向寄存器输出值
	EXPORT	outportb
outportb	strb	r0, [r1]
	MOV_PC_LR
	
	EXPORT	outportw
outportw	strh	r0, [r1]
	MOV_PC_LR
	
	EXPORT	outportl
outportl	str	r0, [r1]
	MOV_PC_LR
	
	EXPORT	inportb
inportb	ldrb	r0, [r0]
	MOV_PC_LR

	EXPORT	inportw
inportw	ldrh	r0, [r0]
	MOV_PC_LR

	EXPORT	inportl
inportl	ldr	r0, [r0]
	MOV_PC_LR

;***********************************************
;编译连接后的IMAGE中的地址
	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|
	
;***********************************************

;	IMPORT	UserStack
;	IMPORT	SVCStack
;	IMPORT	UndefStack
;	IMPORT	AbortStack
;	IMPORT	IRQStack
;	IMPORT	FIQStack
	
;	IMPORT	SysRstVector
;	IMPORT	UdfInsVector
;	IMPORT	SwiSvcVector
;	IMPORT	InsAbtVector
;	IMPORT	DatAbtVector
;	IMPORT	ReservedVector
;	IMPORT	IrqSvcVector
;	IMPORT	FiqSvcVector
	
;***********************************************	
	
	END

⌨️ 快捷键说明

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