📄 startup.s
字号:
;/****************************************Copyright (c)**************************************************
;** 修改人:
;** 日 期:
;** 描 述:
;**
;**------------------------------------------------------------------------------------------------------
;********************************************************************************************************/
;定义堆栈的大小
SVC_STACK_LEGTH EQU 0
FIQ_STACK_LEGTH EQU 16
IRQ_STACK_LEGTH EQU 128
ABT_STACK_LEGTH EQU 0
UND_STACK_LEGTH EQU 0
MEMMAP EQU 0xE01FC040 ; REMAP控制寄存器
PINSEL2 EQU 0xE002C014
BCFG0 EQU 0xFFE00000
BCFG1 EQU 0xFFE00004
BCFG2 EQU 0xFFE00008
BCFG3 EQU 0xFFE0000C
;引入的外部标号在这声明
IMPORT FIQ_Handler ;快速中断异常处理程序
IMPORT __main ;C语言主程序入口
IMPORT __use_two_region_memory
IMPORT HZK16 ;
IMPORT ASCII16 ;
IMPORT HZK_16 ;
IMPORT ASCII_16 ;
IMPORT HZK12 ;
IMPORT ASCII12 ;
IMPORT HZK_12 ;
IMPORT ASCII_12 ;
IMPORT ||Image$$STACK$$ZI$$Base|| ;
IMPORT ||Image$$STACK$$ZI$$Limit|| ;
IMPORT ||Image$$HEAP$$ZI$$Base|| ;
IMPORT ||Image$$HEAP$$ZI$$Limit|| ;
IMPORT ||Image$$ROM_EXEC$$Limit|| ;
IMPORT ||Image$$IRAM$$Length|| ;
;给外部使用的标号在这声明
EXPORT ARMDisableInt
EXPORT ARMEnableInt
EXPORT __user_initial_stackheap
EXPORT P_HZKASCII
EXPORT ROM_END_ADD
CODE32
AREA Startup,CODE,READONLY
;中断向量表
Vectors
LDR PC, ResetAddr
LDR PC, UndefinedAddr
LDR PC, SWI_Addr
LDR PC, PrefetchAddr
LDR PC, DataAbortAddr
DCD 0xb9205f80
LDR PC, [PC, #-0xff0]
LDR PC, FIQ_Addr
ResetAddr DCD ResetInit
UndefinedAddr DCD Undefined
SWI_Addr DCD SoftwareInterrupt
PrefetchAddr DCD PrefetchAbort
DataAbortAddr DCD DataAbort
Nouse DCD 0
IRQ_Addr DCD 0
FIQ_Addr DCD FIQ_Exception
;未定义指令
Undefined
B Undefined
;软中断
SoftwareInterrupt
B SoftwareInterrupt
PrefetchAbort
B PrefetchAbort
;取数据中止
DataAbort
B DataAbort
;快速中断
FIQ_Exception
STMFD SP!, {R0-R3, LR}
BL FIQ_Exception
LDMFD SP!, {R0-R3, LR}
SUBS PC, LR, #4
;/*********************************************************************************************************
;**函数名称: ResetInit
;**功能描述: RESET 复位入口初始化外部总线控制器,根据目标板决定配置
;**输 入: None 无
;**输 出 : None 无
;********************************************************************************************************/
ResetInit
LDR R0, =PINSEL2
IF :DEF: EN_CRP
LDR R1, =0x0f814910
ELSE
LDR R1, =0x0f814914
ENDIF
STR R1, [R0]
LDR R0, =BCFG0
LDR R1, =0x10001c41
STR R1, [R0]
LDR R0, =BCFG1
LDR R1, =0x1000ffef
STR R1, [R0]
; LDR R0, =BCFG3
; LDR R1, =0x2000ffef
; STR R1, [R0]
;/*********************************************************************************************************
;** 函数名称: InitStack
;** 功能描述: 初始化堆栈
;********************************************************************************************************/
InitStack
MOV R0, LR
;设置管理模式堆栈
MSR CPSR_c, #0xd3
LDR SP, StackSvc
;设置中断模式堆栈
MSR CPSR_c, #0xd2
LDR SP, StackIrq
;设置快速中断模式堆栈
MSR CPSR_c, #0xd1
LDR SP, StackFiq
;设置中止模式堆栈
MSR CPSR_c, #0xd7
LDR SP, StackAbt
;设置未定义模式堆栈
MSR CPSR_c, #0xdb
LDR SP, StackUnd
;设置系统模式堆栈
MSR CPSR_c, #0xdf
LDR SP, stack_limit
; 实现REMAP操作
;REMAPS
; MOV R2,#0x40000000 ; 复制中断向量代码,设置目标地址
; LDR R1,=Vectors ; 设置源地址
; LDMIA R1!,{R3-R10} ; 共复制16个字(64字节)
; STMIA R2!,{R3-R10}
; LDMIA R1!,{R3-R10}
; STMIA R2!,{R3-R10}
; LDR R2,=MEMMAP ; REMAP操作
; MOV R1,#0x01
; STR R1,[R2]
; MSR CPSR_c, #0x1f
B __main
MOV PC, R0
; 其它
P_HZKASCII
LDR R4,=HZK16
LDR R5,=HZK_16
STR R4,[R5]
LDR R4,=ASCII16
LDR R5,=ASCII_16
STR R4,[R5]
LDR R4,=HZK12
LDR R5,=HZK_12
STR R4,[R5]
LDR R4,=ASCII12
LDR R5,=ASCII_12
STR R4,[R5]
ARMDisableInt
STMDB sp!, {r0}
MRS r0, CPSR
ORR r0, r0, #0x80
MSR CPSR_c, r0
LDMIA sp!, {r0}
MOV pc, lr
ARMEnableInt
STMDB sp!, {r0}
MRS r0, CPSR
BIC r0, r0, #0x80
MSR CPSR_c, r0
LDMIA sp!, {r0}
MOV pc, lr
;/*********************************************************************************************************
;** 函数名称: __user_initial_stackheap
;** 功能描述: 库函数初始化堆和栈,不能删除
;**
;** 输 入: 参考库函数手册
;** 输 出: 参考库函数手册
;**
;********************************************************************************************************/
__user_initial_stackheap
LDR r0,heap_base ;堆的基地址,地址从小往大增长
LDR r1,stack_limit ;栈的底部地址
LDR r2,heap_limit ;堆的顶部地址
LDR r3,stack_base ;栈的基址址,地址从大往小增长
MOV pc,lr
;/*********************************************************************************************************
;** 函数名称: __rt_div0
;** 功能描述: 整数除法除数为0错误处理函数,替代原始的__rt_div0减少目标代码大小
;**
;** 输 入: 参考库函数手册
;********************************************************************************************************/
__rt_div0
B __rt_div0
heap_base DCD ||Image$$HEAP$$ZI$$Base||
heap_limit DCD (||Image$$HEAP$$ZI$$Limit||-1)
stack_base DCD ||Image$$STACK$$ZI$$Base||
stack_limit DCD ||Image$$STACK$$ZI$$Limit||
ROM_END_ADD DCD (||Image$$ROM_EXEC$$Limit||+||Image$$IRAM$$Length||+0x20)
StackSvc DCD SvcStackSpace + (SVC_STACK_LEGTH - 1)* 4
StackIrq DCD IrqStackSpace + (IRQ_STACK_LEGTH - 1)* 4
StackFiq DCD FiqStackSpace + (FIQ_STACK_LEGTH - 1)* 4
StackAbt DCD AbtStackSpace + (ABT_STACK_LEGTH - 1)* 4
StackUnd DCD UndtStackSpace + (UND_STACK_LEGTH - 1)* 4
;/* 分配堆栈空间 */
AREA MyStacks, DATA, NOINIT, ALIGN=2 ;
SvcStackSpace SPACE SVC_STACK_LEGTH * 4 ;管理模式堆栈空间
IrqStackSpace SPACE IRQ_STACK_LEGTH * 4 ;中断模式堆栈空间
FiqStackSpace SPACE FIQ_STACK_LEGTH * 4 ;快速中断模式堆栈空间
AbtStackSpace SPACE ABT_STACK_LEGTH * 4 ;中止义模式堆栈空间
UndtStackSpace SPACE UND_STACK_LEGTH * 4 ;未定义模式堆栈
AREA Heap, DATA, NOINIT
SPACE 0x1000
AREA Stacks, DATA, NOINIT
SPACE 0x1000
END
;/*********************************************************************************************************
;** End Of File
;********************************************************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -