📄 boot.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 + -