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

📄 boot.s

📁 《ARM与嵌入式系统基础教程》
💻 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
        

⌨️ 快捷键说明

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