📄 init.s
字号:
##########################################################################################
#
# Filename: init.s
#
# Description:This code initials memory,stack pointer,exception vectors,variables in C code
#
# Author:
#
# Date:2004.2.5
#
###########################################################################################
.include "asmdef.a"
.macro HANDLER HandleLabel
sub sp,sp,#4 /* decrement sp(to store jump address) */
stmfd sp!,{r0} /* PUSH the work register to stack(lr does't push because it return to original address) */
ldr r0,=\HandleLabel /* load the address of HandleXXX to r0 */
ldr r0,[r0] /* load the contents(service routine start address) of HandleXXX */
str r0,[sp,#4] /* store the contents(ISR) of HandleXXX to stack */
ldmfd sp!,{r0,pc} /* POP the work register and pc(jump to ISR) */
.endm
####################################################
# Program entry point and exception vector
####################################################
ENTRY:
B Reset_Handler
B ArmUndefHandler
B ArmSwiHandler
B ArmPreHandler
B ArmAbortHandler
B .
B ArmIrqHandler
B ArmFiqHandler
.ltorg
ArmUndefHandler: HANDLER ArmUndefHandle
ArmSwiHandler: HANDLER ArmSwiHandle
ArmPreHandler: HANDLER ArmPreHandle
ArmAbortHandler: HANDLER ArmAbortHandle
ArmRevHandler: HANDLER ArmRevHandle
ArmIrqHandler: HANDLER ArmIrqHandle
ArmFiqHandler: HANDLER ArmFiqHandle
#****************************************************
#* START *
#****************************************************
.global Reset_Handler
Reset_Handler:
###############################################
#
###############################################
# LDR sp, =0x0100000
###############################################
# Setup the system configure register(SYSCFG)
###############################################
LDR r0, =SPREG_BASEADDR
LDR r1, =0xE7FFFF90
STR r1, [r0]
################################################
# Configure memory (ROM,SRAM,SDRAM)
################################################
LDR r0, =MemoryCtrlRegValue
LDMIA r0, {r1-r12}
LDR r0, =MEMCONFBASE_ADDR
STMIA r0, {r1-r12}
################################################
# Disable all interrupts
################################################
LDR r0, =INTPEND_ADDR
LDR r1, =0xFFFFFFFF
STR r1, [r0]
LDR r0, =INTMASK_ADDR
LDR r1, =0x003FFFFF
STR r1, [r0]
#################################################
# Configure System clock
#################################################
LDR r0, =CLKCON_ADDR
LDR r1, =0x00000000
STR r1, [r0]
#################################################
# Configure Exteral I/O Regs
#################################################
LDR r0, =EXTACON0_ADDR
LDR r1, =0x02000200
STR r1, [r0]
LDR r0, =EXTACON1_ADDR
LDR r1, =0x02000200
STR r1, [r0]
#;****************************************************
#;* Setup IRQ handler *
#;****************************************************
ldr r0,=ArmIrqHandle /* This routine is needed */
ldr r1,=ArmIRQIsr /* if there isn't 'subs pc,lr,#4' at 0x18, 0x1c */
str r1,[r0]
#################################################
# external symbol used
#################################################
.extern Image_RO_Limit
.extern Image_RW_Base
.extern Image_ZI_Base
.extern Image_ZI_Limit
#################################################
# Initialize memory with zero used in C code
#################################################
LDR r0, =Image_RO_Limit
LDR r1, =Image_RW_Base
LDR r3, =Image_ZI_Base
CMP r0, r1
BEQ LOOP1
LOOP0:
CMP r1, r3
LDRCC r2, [r0], #4
STRCC r2, [r1], #4
BCC LOOP0
LOOP1:
LDR r1,=Image_ZI_Limit
MOV r2, #0
LOOP2:
CMP r3, r1
STRCC r2, [r3], #4
BCC LOOP2
#################################################
# Initialize Stack Space
#################################################
INITIALIZE_STACK:
MRS r0, cpsr
BIC r0, r0, #CPSR_DISABLE_INT | CPSR_MODE_MASK
ORR r2, r0, #CPSR_USR_MODE
ORR r1, r0, #CPSR_DISABLE_INT | CPSR_FIQ_MODE
MSR cpsr_cf, r1
MSR spsr_cf, r2
LDR sp, =FIQ_STACK
ORR r1, r0, #CPSR_DISABLE_INT | CPSR_IRQ_MODE
MSR cpsr_cf, r1
MSR spsr_cf, r2
LDR sp, =IRQ_STACK
ORR r1, r0, #CPSR_DISABLE_INT | CPSR_ABT_MODE
MSR cpsr_cf, r1
MSR spsr_cf, r2
LDR sp, =ABT_STACK
ORR r1, r0, #CPSR_DISABLE_INT | CPSR_UDF_MODE
MSR cpsr_cf, r1
MSR spsr_cf, r2
LDR sp, =UDF_STACK
ORR r1, r0, #CPSR_DISABLE_INT | CPSR_SUP_MODE
#
BIC r1,r1,#CPSR_DISABLE_INT
#
MSR cpsr_cf, r1
MSR spsr_cf, r2
LDR sp, =SUP_STACK
# ORR r1, r0, #CPSR_DISABLE_INT | CPSR_SUP_MODE
# MSR cpsr_cf, r1
# MSR spsr_cf, r2
# LDR sp, =SUP_STACK
#######################################################
# Switch user mode and set its stack
#######################################################
# MRS r0, cpsr
# BIC r0, r0, #CPSR_DISABLE_INT | CPSR_MODE_MASK
# ORR r1, r0, #CPSR_USR_MODE
# MSR cpsr_cf, r1
# LDR sp, =USR_STACK
###########################################################
# Entry to main() in C code
###########################################################
.extern Main
BL Main
######################################################
# define exception handle functions
######################################################
#
#SystemUndefinedHandler:
# B SystemUndefinedHandler
#SystemSwiHandler:
# B SystemSwiHandler
#SystemPrefetchHandler:
# B SystemPrefetchHandler
#SystemAbortHandler:
# B SystemAbortHandler
#SystemReserveHandler:
# B SystemReserveHandler
#SystemIrqHandler:
# .extern ISR_IrqHandler
# STMFD sp!, {r0-r12,lr}
# BL ISR_IrqHandler
# LDMFD sp!, {r0-r12,lr}
# SUBS pc, lr, #4
#SystemFiqHandler:
# .extern ISR_FiqHandler
# STMFD sp!, {r0-r7,lr}
# BL ISR_FiqHandler
# LDMFD sp!, {r0-r7,lr}
# SUBS pc, lr, #4
########################################################
# constant value of memory control registers allocated
# in ROM/FLASH
########################################################
MemoryCtrlRegValue:
.long 0x05503E02
# .long 0x02000060
.long 0x1a060040 @配置ROM0从0x1800000到0x1a00000
.long 0x00000060
.long 0x00000060
.long 0x00000060
.long 0x00000060
.long 0x00000060
# .long 0x14010380
.long 0x10000301 @配置RAM0从0x0到0x1000000
.long 0x00000000
.long 0x00000000
.long 0x00000000
.long 0x67178360
#########################################################
# Define stack space for all modes
#########################################################
.data
.SPACE 2048
USR_STACK: .SPACE 512
UDF_STACK: .SPACE 512
ABT_STACK: .SPACE 512
IRQ_STACK: .SPACE 512
FIQ_STACK: .SPACE 1024
SUP_STACK:
# .end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -