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

📄 start.s

📁 该程序为AT91RM9200引导程序
💻 S
字号:
	INCLUDE   AT91RM9200.inc_STACK_BASEADDRESS	EQU 0x00002F00;/*0x21ff8000//*/0x00002F00//2400_MMUTT_STARTADDRESS	EQU 0x00002F00;/*0x21ff8000//*/0x00002F00//2400_ISR_STARTADDRESS	EQU 0x00003000;/*0x21ffff00//*/0x00003000;Pre-defined constantsUSERMODE    EQU 	0x10FIQMODE     EQU 	0x11IRQMODE     EQU 	0x12SVCMODE     EQU 	0x13ABORTMODE   EQU 	0x17UNDEFMODE   EQU 	0x1bMODEMASK    EQU 	0x1fNOINT       EQU 	0xc0I_BIT	EQU	0x80F_BIT	EQU	0x40T_BIT	EQU	0x20	AREA	reset, CODE, READONLY		ENTRY		EXPORT	__ENTRY__ENTRY	ResetEntry	b	ResetHandler	ldr	pc, =HandlerUndef		;handler for Undefined mode	ldr	pc, =HandlerSWI			;handler for SWI interrupt	ldr	pc, =HandlerPabort		;handler for PAbort	ldr	pc, =HandlerDabort		;handler for DAbort	ldr	pc, =.					;reserved	ldr	pc, =HandlerIRQ			;handler for IRQ interrupt;	ldr	pc, [pc,#-0xF20]		;IRQ : read the AIC	ldr	pc, =HandlerFIQ			;handler for FIQ interrupt		EXPORT	this_machine_ipthis_machine_ip	DCD	(192<<24)|(168<<16)|(2<<8)|(223)    	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	LTORG   HandlerFIQ      HANDLER HandleFIQHandlerIRQ      HANDLER HandleIRQHandlerUndef    HANDLER HandleUndefHandlerSWI      HANDLER HandleSWIHandlerDabort   HANDLER HandleDabortHandlerPabort   HANDLER HandlePabortIsrIRQ	sub	sp, sp, #4       ;reserved for PC	stmfd	sp!,{r8-r9}		ldr	r9, =AT91C_BASE_AIC	mov	r8, r9	ldr	r9, [r9, #AIC_ISR]	and	r9, r9, #0x1f	add	r8, r8, r9, lsl #2	ldr	r8, [r8, #AIC_SVR]	str	r8, [sp, #8]	ldmfd	sp!,{r8-r9,pc}	; * the actual reset codeResetHandler	;Set up User Mode, set User Mode Stack and disable interrupts		msr	CPSR_c, #(SVCMODE|I_BIT|F_BIT)	;------------------------------------------------------------------------------;Step 1.;------------------------------------------------------------------------------;-Enabling the Main Oscillator;-Normally First instruction in PMC initialisation;------------------------------------------------------------------------------;-Main oscillator Enable register	APMC_MOR : Enable main oscillator , OSCOUNT = 0xFF	ldr     r1, = AT91C_BASE_CKGR	; Get the CKGR Base Address	ldr 	r0, = AT91C_CKGR_MOSCEN:OR:AT91C_CKGR_OSCOUNT	str     r0, [r1, #CKGR_MOR]		; set the cpu to SVC32 mode	;	mrs	r0, cpsr;	bic	r0, r0, #0x1f;	orr	r0, r0, #0x13;	msr	cpsr_cf, r0			; relocate exeception table	 				;/*复制ResetEntry处的异常向量表到0开始的地方	adr	r0, ResetEntry							;r0 <-- ResetEntry处地址	mov	r1, #0									;r1 = 0;	mov	r2, #16									;r2 = 16;copyex	subs	r2, r2, #1							;r2 --	ldr	r3, [r0], #4							;r3 = *r0, r0 +=4	str	r3, [r1], #4							;*r1 = r3, r1 +=4;	bne	copyex									;*/		IMPORT	LowLevelInit	;	ldr	r1, =0x204000;=SVCStack;	bic	r1, r1, #3				; Insure word alignement;	mov	sp, r1					; Init stack SYS	mov	sp, #0x204000			;//sp设为2M+16K的地方		bl 	LowLevelInit			;//跳到低级初始化去执行		;Initialize stacks	bl	InitStacks				;//跳到初始化栈去执行	copy_proc_beg	adr	r0, ResetEntry			;//r0 <=ResetEntry处地址	ldr	r2, BaseOfROM			;//r2 = BaseOfROM	cmp	r0, r2					;//比较r0和r2大小 if(r0==r2){ldreq r0,TopOfROM,b InitRam}	ldreq	r0, TopOfROM		;//假如r0==r2执行r0=TopOfROM	beq	InitRam					;//假如r0==r2跳到InitRam去执行	ldr r3, TopOfROM			;//r3 = TopOfROM0								;/*拷备ResetEntry地址开始的程序到RO段	ldmia	r0!, {r4-r7}		;//*r0-->{r4-r7}	stmia	r2!, {r4-r7}		;//{r4-r7}-->*r2	cmp	r2, r3	bcc	%B0						;*/		sub	r2, r2, r3				;//r2 -=r3	sub	r0, r0, r2				;//r0 -=r2		InitRam		ldr	r2, BaseOfBSS			;//r2 = BaseOfBSS//RW开始处地址	ldr	r3, BaseOfZero			;//r3 = BaseOfZero//0初始基地址0								;/*拷贝RAM内容到RW段	cmp	r2, r3					;//if (r2<r3) {ldr r1,[r0],#4 str r1,[r2],#4 b %B0}	ldrcc	r1, [r0], #4		;//执行ldr r1,[r0],#4 假如Carry Clear	strcc	r1, [r2], #4		;//执行str r1,[r2],#4 假如Carry Clear	bcc	%B0						;//执行b %B0 假如Carry Clear*/	mov	r0,	#0					;/*清零ZI段	ldr	r3,	EndOfBSS1		cmp	r2,	r3	strcc	r0, [r2], #4	bcc	%B1						;*/		IMPORT	irq_handler  	; Setup IRQ handler	ldr	r0, =HandleIRQ			;This routine is needed	;ldr	r1, =IsrIRQ			;if there isn't 'subs pc,lr,#4' at 0x18, 0x1c	ldr	r1, =irq_handler	str	r1, [r0]	IMPORT	main_main__main	EXPORT	_main	EXPORT	__main;	swi	0x1234		;test swi	ldr	r0, =main	mov	lr, pc	bx	r0		b	.;===========================================================;The location of stacksUserStack	EQU	(_STACK_BASEADDRESS-0x3800)	;0x33ff4800 ~;/*0x3800*/ SVCStack	EQU	(_STACK_BASEADDRESS-0x2800) ;0x33ff5800 ~;/*0x2800*/UndefStack	EQU	(_STACK_BASEADDRESS-0x2400) ;0x33ff5c00 ~;/*0x2400*/AbortStack	EQU	(_STACK_BASEADDRESS-0x2000) ;0x33ff6000 ~;/*0x2000*/IRQStack	EQU	(_STACK_BASEADDRESS-0x1000)	;0x33ff7000 ~/*0x1000*/FIQStack	EQU	(_STACK_BASEADDRESS-0x0)	;0x33ff8000 ~ ;function initializing stacksInitStacks	;Don't use DRAM,such as stmfd,ldmfd......	;SVCstack is initialized before	;Under toolkit ver 2.5, 'msr cpsr,r1' can be used instead of 'msr cpsr_cxsf,r1'	mrs	r0,cpsr	bic	r0,r0,#MODEMASK	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	bic	r0,r0,#MODEMASK|NOINT	orr	r1,r0,#SVCMODE	msr	cpsr_cxsf,r1		;SVCMode	ldr	sp,=SVCStack		;USER mode has not be initialized.		mov	pc,lr 	;The LR register won't be valid if the current mode is not SVC mode.;===========================================================		IMPORT  |Image$$RO$$Base|	; Base of ROM code	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	BaseOfROM	DCD	|Image$$RO$$Base|			;//Image开始地址,程序只读(代码或数据)存放的起始地址TopOfROM	DCD	|Image$$RO$$Limit|			;//程序只读(代码或数据)起始地址+代码长度+1BaseOfBSS	DCD	|Image$$RW$$Base|			;//Linker中RW基地址指定,读写存放起始地址BaseOfZero	DCD	|Image$$ZI$$Base|			;//零初始基地址EndOfBSS	DCD	|Image$$ZI$$Limit|			;//Image结束地址		ALIGN			EXPORT DisableIntDisableInt	mrs	r0,	cpsr	orr	r0,	r0, #0xc0	msr	cpsr_cf, r0	mov	pc,	lr		    	AREA RamData, DATA, READWRITE        ^   _ISR_STARTADDRESSHandleReset 	#   4HandleUndef 	#   4HandleSWI   	#   4HandlePabort    #   4HandleDabort    #   4HandleReserved  #   4HandleIRQ   	#   4HandleFIQ   	#   4;Don`t use the label 'IntVectorTable',;The value of IntVectorTable is different with the address you think it may be.;IntVectorTableHandleEINT0   	#   4HandleEINT1   	#   4HandleEINT2   	#   4HandleEINT3   	#   4HandleEINT4_7	#   4HandleEINT8_23	#   4HandleRSV6	#   4HandleBATFLT   	#   4HandleTICK   	#   4HandleWDT	#   4HandleTIMER0 	#   4HandleTIMER1 	#   4HandleTIMER2 	#   4HandleTIMER3 	#   4HandleTIMER4 	#   4HandleUART2  	#   4HandleLCD 	#   4HandleDMA0	#   4HandleDMA1	#   4HandleDMA2	#   4HandleDMA3	#   4HandleMMC	#   4HandleSPI0	#   4HandleUART1	#   4HandleRSV24	#   4HandleUSBD	#   4HandleUSBH	#   4HandleIIC   	#   4HandleUART0 	#   4HandleSPI1 	#   4HandleRTC 	#   4HandleADC 	#   4	END

⌨️ 快捷键说明

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