📄 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
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -