www.pudn.com > LwIP_OSE_1.rar > boot.s


;-------------------------------------------------------------------------------------------------- 
;							- AT91SAM7x256启动程序 - 作者:焦海波 -  
;-------------------------------------------------------------------------------------------------- 
;- 文件名称 : cstartup.s 
;- 功能描述 : 这是启动代码文件,其完成硬件的的初始化工作:1、存储器重映射;2、设置并选择PLLCK作为主 
;-      : 机时钟和处理器时钟;3、将中断向量表复制到系统RAM;4、为系统各个处理模式分配堆栈;5、将 
;-          : 系统控制权交给C入口程序 
;-   版本 : V0.1 
;- 建立时间 : 2007/02/22 18:34 
;-------------------------------------------------------------------------------------------------- 
						INCLUDE		at91sam7x256/include/AT91SAM7X256.inc 
						INCLUDE		arm7tdmi/include/arm.inc 
;-------------------------------------------------------------------------------------------------- 
;- 仅本文件使用的一些宏定义 
;-------------------------------------------------------------------------------------------------- 
TARGET_TYPE_ICE			EQU		0 
TARGET_TYPE_BOARD		EQU		1				 
AT91C_SRAM_BEFORE_REMAP	EQU		AT91C_ISRAM 
AT91C_SRAM_AFTER_REMAP	EQU		0x0 
TOP_INTERNAL_MEMORY  	EQU   	AT91C_SRAM_BEFORE_REMAP 
	 
;- 系统各内核模式使用的堆栈,注意这是重映射指令之后的堆栈分配 
IRQ_STACK_SIZE      	EQU     (256 * 4) 
FIQ_STACK_SIZE	    	EQU	    (16 * 4) 
ABT_STACK_SIZE      	EQU     (16 * 4) 
UND_STACK_SIZE      	EQU     (16 * 4) 
 
;-------------------------------------------------------------------------------------------------- 
;- 代码区 
;-------------------------------------------------------------------------------------------------- 
					AREA        Startup, CODE, READONLY 
					ENTRY 
					EXPORT		SYSEntry 
					 
SYSEntry 
		B           Handler_Reset			;跳转到复位处理函数 
 
VEC_UndefInst 
		B			VEC_UndefInst			;未定义指令异常 
 
VEC_SoftInterrupt 
		B			VEC_SoftInterrupt		;软件中断 
 
VEC_PrefetchAbort 
		B			VEC_PrefetchAbort		;预取指异常 
 
VEC_DataAbort 
		B			VEC_DataAbort			;数据终止异常 
 
VEC_Reserve 
		B			VEC_Reserve				;保留 
 
VEC_IRQ 
		B			VEC_IRQ					;IRQ 
 
VEC_FIQ 
		B			VEC_FIQ					;FIQ 
;-------------------------------------------------------------------------------------------------- 
;- 存储器重映射后的异常向量表 
;--------------------------------------------------------------------------------------------------						 
		IMPORT	IRQHandler 
		IMPORT	FIQHandler 
		 
		EXPORT	VectorTable 
		 
VectorTable						 
		LDR			PC, [PC, #&18]          ;- 软件复位 
        LDR         PC, [PC, #&18]          ;- 未定义 
        LDR         PC, [PC, #&18]          ;- SWI 
        LDR         PC, [PC, #&18]          ;- 预取终止 
        LDR         PC, [PC, #&18]          ;- 数据终止 
        NOP                                 ;- 保留 
        LDR			PC, [PC, #&18]			;- IRQ 
        LDR			PC, [PC, #&18]			;- FIQ 
 
		DCD         SoftReset 
		DCD         UndefHandler 
		DCD         SWIHandler 
		DCD         PrefetchAbortHandler 
		DCD         DataAbortHandler 
		DCD			0 
		DCD			IRQHandler 
		DCD			FIQHandler 
 
SoftReset 
		B           ExceptionHandler 
 
UndefHandler 
		B           ExceptionHandler 
		 
SWIHandler 
		B			ExceptionHandler 
				 
PrefetchAbortHandler 
		B           ExceptionHandler 
                 
DataAbortHandler 
		B           ExceptionHandler 
		 
ExceptionHandler 
		B			AT91C_IFLASH 
;-------------------------------------------------------------------------------------------------- 
;- 系统复位后的初始化函数 
;--------------------------------------------------------------------------------------------------	 
Handler_Reset 
 
		IMPORT	rvLowLevelInit									;- 导入硬件初始化函数 
 
		LDR     R13, = (TOP_INTERNAL_MEMORY+AT91C_ISRAM_SIZE)	;- 为C程序分配一个临时堆栈,并进入底层硬件初始化程序 
		LDR		R1, = TOP_INTERNAL_MEMORY						 
		LDR		R0, = VectorTable								 
        BL      rvLowLevelInit									 
        		 
		LDR		R2, =0x00000000									;- 向0x0写0x12345678,如果改写成功则表明存储器已经重映射 
		LDR		R1, [R2] 
		LDR		R3, =0x12345678 
		STR		R3, [R2] 
		LDR		R2, [R2] 
		CMP		R3, R2 
		BEQ		Recover 
		 
		LDR     R12, pfunInitRemap        						;- 加载存储器重映射之后的处理函数地址 
		 
        MOV     R1, #AT91C_MC_RCB        						;- 重映射 
        STR     R1, [R0]     
 
	 
		MOV		PC, R12 
         
pfunInitRemap 
		DCD		InitRemap 
		 
Recover 
		LDR		R2, =0x00000000 
		STR		R1, [R2] 
         
;------------------------------------------------------------------------------ 
;- 重映射之后的复位处理,主要是为各种内核模式分配堆栈 
;------------------------------------------------------------------------------ 
InitRemap 
		LDR     R0, = (AT91C_SRAM_AFTER_REMAP + AT91C_ISRAM_SIZE) 
 
;- FIQ模式 
		MSR     CPSR_c, #ARM_MODE_FIQ:OR:I_BIT:OR:F_BIT 
		MOV     R13, R0 
		SUB     R0, R0, #FIQ_STACK_SIZE 
 
;- IRQ模式 
		MSR     CPSR_c, #ARM_MODE_IRQ:OR:I_BIT:OR:F_BIT 
		MOV     R13, R0 
		SUB     R0, R0, #IRQ_STACK_SIZE 
 
;- 异常终止模式 
		MSR     CPSR_c, #ARM_MODE_ABORT:OR:I_BIT:OR:F_BIT 
		MOV     R13, R0 
		SUB     R0, R0, #ABT_STACK_SIZE 
 
;- 未定义指令模式 
		MSR     CPSR_c, #ARM_MODE_UNDEF:OR:I_BIT:OR:F_BIT 
		MOV     R13, R0 
		SUB     R0, R0, #UND_STACK_SIZE 
 
;- 管理模式 
		MSR     CPSR_c, #ARM_MODE_SVC 
		MOV     R13, R0 
;------------------------------------------------------------------------------ 
;- 进入C程序 
;------------------------------------------------------------------------------ 
		IMPORT	CMain 
 
		LDR		R0, =CMain 
		MOV		LR, PC 
		BX		R0 
		 
		EXPORT ARMCoreEnableInt 
		 
ARMCoreEnableInt 
  		MRS 	R1, CPSR   
  		BIC 	R1, R1, #I_BIT 
  		MSR 	CPSR_c, R1 
  		BX		LR 
 
    			END