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

📄 boot.s

📁 《ARM与嵌入式系统基础教程》
💻 S
字号:
;--------------------------------------------------------------------------------------------------
;							- AT91SAM7x256启动程序 - 作者:焦海波 - 
;--------------------------------------------------------------------------------------------------
;- 文件名称 : cstartup.s
;- 功能描述 : 这是启动代码文件,其将中断向量表复制到系统RAM后,会将系统控制权主动交给C入口程序
;-   版本 : V0.1
;- 建立时间 : 2007/02/22 18:34
;--------------------------------------------------------------------------------------------------
						INCLUDE		at91sam7x256/include/AT91SAM7X256.inc
						INCLUDE		arm7tdmi/include/arm.inc
;--------------------------------------------------------------------------------------------------
;- 仅本文件使用的一些宏定义
;--------------------------------------------------------------------------------------------------
AT91C_SRAM_AFTER_REMAP	EQU		0x0
SYS_LOAD_ADDR			EQU		0x00100A00
;--------------------------------------------------------------------------------------------------
;- 代码区
;--------------------------------------------------------------------------------------------------
					AREA        Startup, CODE, READONLY
					ENTRY
					EXPORT		SYSEntry
SYSEntry
		B           Handler_Reset			;跳转到复位处理函数
;--------------------------------------------------------------------------------------------------
;- 存储器重映射后的异常向量表
;--------------------------------------------------------------------------------------------------
		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
				
PrefetchAbortHandler
		B           ExceptionHandler
                
DataAbortHandler
		B           ExceptionHandler
		
ExceptionHandler
		B			AT91C_IFLASH
;--------------------------------------------------------------------------------------------------
;- 系统复位后的初始化函数
;--------------------------------------------------------------------------------------------------	
Handler_Reset

		IMPORT	vCreateVectorTable								;- 导入硬件初始化函数

		LDR     R13, =(AT91C_SRAM_AFTER_REMAP+AT91C_ISRAM_SIZE)	;为C程序分配一个临时堆栈
		LDR		R1, = AT91C_SRAM_AFTER_REMAP						
		LDR		R0, = VectorTable								
        BL      vCreateVectorTable									
;------------------------------------------------------------------------------
;- 设置好需要在RAM中运行的系统函数库及运行环境后进入应用系统
;------------------------------------------------------------------------------
		LDR		R0, =SYS_LOAD_ADDR
		MOV		LR, PC
		BX		R0
		
;- 处理极端异常的情况
End
        B       End
;------------------------------------------------------------------------------
;- SWI中断处理函数以及函数入口表
;------------------------------------------------------------------------------
		IMPORT	DFL_IsLockedPage
		IMPORT	DFL_PageLock		
		IMPORT	DFL_PageUnlock
		IMPORT	DFL_WriteFlash
		IMPORT	DFL_WriteAndLockFlash
		IMPORT	DFL_EraseAllFlash
		IMPORT	DFL_SetNVM
		IMPORT	DFL_ClearNVM
		
SysFunEntryTable
		DCD		DFL_IsLockedPage
		DCD		DFL_PageLock		
		DCD		DFL_PageUnlock
		DCD		DFL_WriteFlash
		DCD		DFL_WriteAndLockFlash
		DCD		DFL_EraseAllFlash
		DCD		DFL_SetNVM
		DCD		DFL_ClearNVM
		
SWIHandler
		STMFD	SP!, {R0-R2}					;- 首先将函数要用到的寄存器推入堆栈,以便处理完毕后恢复相关寄存器内容
		
		LDR		R0, [LR, #-4]					;- LR当前指向的是返回地址,也就是SWI指令下面的的一条指令,因此必须减4才能获得SWI指令本身
		BIC		R0, R0, #0xFF000000				;- 清除指令本身,保留函数编号部分		
		LDR		R1, =SysFunEntryTable           ;- 获得函数入口表首地址
		LDR		R2, [R1, R0, LSL #2]            ;- 从函数入口表中获得函数入口地址
		STMFD	SP, {R2}                        ;- 将入口地址入栈		
		
		LDMFD	SP!, {R0-R2}					;- 恢复R0-R2寄存器的内容
		MSR		CPSR_c, #ARM_MODE_SVC			;- 允许中断
		LDR		PC, [SP, #-&10]                 ;- 进入要调用的函数

;------------------------------------------------------------------------------
;- 不做任何处理,其将被主系统的ISR代替,其存在的主要目的是为了避免编译、链接错误
;------------------------------------------------------------------------------
IRQHandler
		B		IRQHandler
		
FIQHandler
		B		FIQHandler
;------------------------------------------------------------------------------
;- 临界段代码处理函数
;------------------------------------------------------------------------------
		EXPORT		ARMCoreDisableIntExt
		EXPORT		ARMCoreRestoreIntStatus

ARMCoreDisableIntExt
		MRS     R0,CPSR                     ;- 将CPSR寄存器的值传送到参数寄存器R0中

__DisableInt
        ORR     R1,R0,#I_BIT:OR:F_BIT
        
        MSR     CPSR_c,R1                   ;- 进行判断的目的是确认中断禁止操作已经成功后再开始临界处理
        MRS     R1,CPSR                     
        AND     R1,R1,#I_BIT:OR:F_BIT
        CMP     R1,#I_BIT:OR:F_BIT
        BNE     __DisableInt                
        BX		LR                          ;- 返回调用函数并返回原来的CPSR值

ARMCoreRestoreIntStatus
		MSR		CPSR_c, R0                  
		BX		LR

    			END
        

⌨️ 快捷键说明

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