📄 startup_1.s
字号:
;/********************************************************************************************************/
;定义堆栈的大小
USR_STACK_LEGTH EQU 256
SVC_STACK_LEGTH EQU 0
FIQ_STACK_LEGTH EQU 0
IRQ_STACK_LEGTH EQU 256
ABT_STACK_LEGTH EQU 0
UND_STACK_LEGTH EQU 0
;USR_STACK_LEGTH EQU 0
NoInt EQU 0x80
USR32Mode EQU 0x10
SVC32Mode EQU 0x13
SYS32Mode EQU 0x1f
IRQ32Mode EQU 0x12
FIQ32Mode EQU 0x11
PINSEL2 EQU 0xE002C014
BCFG0 EQU 0xFFE00000
BCFG1 EQU 0xFFE00004
BCFG2 EQU 0xFFE00008
BCFG3 EQU 0xFFE0000C
;//************************************************************
;检查是否使用tasm.exe进行编译
GBLL THUMBCODE
[ {CONFIG} = 16
THUMBCODE SETL {TRUE}
CODE32
|
THUMBCODE SETL {FALSE}
]
[ THUMBCODE
CODE32 ;for start-up code for Thumb mode
]
MACRO
MOV_PC_LR
[ THUMBCODE
bx lr
|
mov pc, lr
]
MEND
;引入的外部标号在这声明
IMPORT FIQ_Exception ;快速中断异常处理程序
EXPORT __rt_div0
IMPORT main ;C语言主程序入口
IMPORT TargetResetInit ;目标板基本初始化
;给外部使用的标号在这声明
EXPORT Reset
CODE32
AREA vectors,CODE,READONLY
ENTRY
;中断向量表
Reset
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_Handler
;未定义指令
Undefined
B Undefined
;软中断
SoftwareInterrupt
B SoftwareInterrupt
;取指令中止
PrefetchAbort
B PrefetchAbort
;取数据中止
DataAbort
B DataAbort
;快速中断
FIQ_Handler
STMFD SP!, {R0-R3, LR}
BL FIQ_Exception
LDMFD SP!, {R0-R3, LR}
SUBS PC, LR, #4
;/*********************************************************************************************************
;** 函数名称: 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, =StackUsr
MOV PC, R0
;/*********************************************************************************************************
;** 函数名称: ResetInit
;********************************************************************************************************/
ResetInit
;初始化外部总线控制器,根据目标板决定配置
LDR R0, =PINSEL2
IF :DEF: EN_CRP
LDR R1, =0x0f814910
ELSE
LDR R1, =0x0f814914
ENDIF
STR R1, [R0]
LDR R0, =BCFG0
LDR R1, =((1<<28)+(0x4<<11)+(1<<10)+(0x4<<5)+(0x01));//16位数据宽度,存取周期90nS(SST39VF1601-90) OK
STR R1, [R0] ;//以上的值是我实验最快的值,速度再快就要出错了!gongjun
LDR R0, =BCFG1
LDR R1, =((1<<28)+(0x02<<11)+(1<<10)+(0x02<<5)+(1));//16位数据宽度,存取周期10nS(SRAM 慢速) OK
;//LDR R1, =((1<<28)+(1<<11)+(1<<10)+(1<<5)+(1));//16位数据宽度,存取周期10nS(SRAM IS61LV25616-10T)
STR R1, [R0] ;//以上的值是我实验最快的值,速度再快就要出错了!gongjun
LDR R0, =BCFG2
;//LDR R1, =((0<<28)+(0x5<<11)+(1<<10)+(0x5<<5)+(0x01)) ;//8位数据宽度,(PDIUSBD12和LCD、NandFlash)
LDR R1, =((0<<28)+(0x6<<11)+(1<<10)+(0x6<<5)+(0x01)) ;//8位数据宽度,(PDIUSBD12和LCD、NandFlash) OK
STR R1, [R0]
LDR R0, =BCFG3
LDR R1, =((1<<28)+(0x0f<<11)+(1<<10)+(0x0f<<5)+(0x8)) ;//16位数据宽度,(GCS3 用户使用) OK
;//LDR R1, =((1<<28)+(0x04<<11)+(1<<10)+(0x04<<5)+(0x1)) ;//16位数据宽度,(GCS3 用户使用)
;//LDR R1, =((1<<28)+(0x1f<<11)+(1<<10)+(0x1f<<5)+(0xf)) ;//16位数据宽度,(GCS3 用户使用)
STR R1, [R0]
BL InitStack ;初始化堆栈
BL TargetResetInit ;目标板基本初始化
B main ;跳转到c语言入口
;/********************************************************************************************************/
EXPORT DisableInt
DisableInt
mrs r0, cpsr
orr r0, r0, #NoInt
msr cpsr_cf, r0
MOV_PC_LR
EXPORT EnableInt
EnableInt
mrs r0, cpsr
bic r0, r0, #NoInt
msr cpsr_cf, r0
MOV_PC_LR
;save cpsr and disable int, r0 = address to save cpsr
EXPORT EnterCritical
EnterCritical
mrs r1, cpsr
str r1, [r0]
orr r1, r1, #NoInt
msr cpsr_cxsf, r1
MOV_PC_LR
;restore cpsr, r0 = address to restore cpsr
EXPORT ExitCritical
ExitCritical
ldr r1, [r0]
msr cpsr_cxsf, r1
MOV_PC_LR
EXPORT outportb
outportb strb r0, [r1]
MOV_PC_LR
EXPORT outportw
outportw strh r0, [r1]
MOV_PC_LR
EXPORT outportl
outportl str r0, [r1]
MOV_PC_LR
EXPORT inportb
inportb ldrb r0, [r0]
MOV_PC_LR
EXPORT inportw
inportw ldrh r0, [r0]
MOV_PC_LR
EXPORT inportl
inportl ldr r0, [r0]
MOV_PC_LR
;/*********************************************************************************************************
;** 函数名称: __rt_div0
;/********************************************************************************************************/
__rt_div0
B __rt_div0
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
MACRO
$IRQ_Label HANDLER $IRQ_Exception_Function
EXPORT $IRQ_Label ; 输出的标号
IMPORT $IRQ_Exception_Function ; 引用的外部标号
$IRQ_Label
SUB LR, LR, #4 ; 计算返回地址
STMFD SP!, {R0-R3, R12, LR} ; 保存任务环境
MRS R3, SPSR ; 保存状态
STMFD SP!, {R3}
STMFD SP, {LR}^ ; 保存用户状态的SP,注意不能回写
; 如果回写的是用户的SP,所以后面要调整SP
SUB SP, SP, #4
MSR CPSR_c, #(NoInt | SYS32Mode) ; 切换到系统模式
BL $IRQ_Exception_Function ; 调用c语言的中断处理程序
MSR CPSR_c, #(NoInt | IRQ32Mode) ; 切换回irq模式
LDMFD SP, {LR}^ ; 恢复用户状态的SP,注意不能回写
; 如果回写的是用户的SP,所以后面要调整SP
ADD SP, SP, #4 ;
LDMFD SP!, {R3}
MSR SPSR_cxsf, R3
LDMFD SP!, {R0-R3, R12, PC}^ ;
MEND
;/*********************************************************************************************************
;** 函数名称: CrpData
;** 功能描述: 支持芯片加密功能
;/********************************************************************************************************/
IF :DEF: EN_CRP
IF . >= 0x1fc
INFO 1,"\nThe data at 0x000001fc must be 0x87654321.\nPlease delete some source before this line."
ENDIF
CrpData
WHILE . < 0x1fc
NOP
WEND
CrpData1
;//DCD 0x87654321 ;/* 当此数为0x87654321时,用户程序被保护 */
DCD 0x00000000 ;/* 当此数不为0x87654321时,用户程序不被保护 */
ENDIF
;/* 分配堆栈空间 */
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 ;未定义模式堆栈
StackUsr SPACE 1
END
;/*********************************************************************************************************
;** End Of File
;/********************************************************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -