📄 startup.s
字号:
SUBS PC, LR, #4
;/*********************************************************************************************************
;** Function name: Reset
;** Descriptions: 复位入口
;** Input: 无
;** Output: 无
;** Created by: 陈明计
;** Created Date: 2004-02-02
;**-------------------------------------------------------------------------------------------------------
;** Modified by: 黄绍斌
;** Modified Date: 2005-10-21
;**------------------------------------------------------------------------------------------------------
;********************************************************************************************************/
Reset
BL InitStack ;初始化堆栈
BL TargetInitReset ;针对目标板的系统初始化
B __main ;跳转到c语言入口
;/*********************************************************************************************************
;** Function name: TargetInitReset
;** Descriptions: 针对目标板的系统初始化,包括WDT、中断、PLL、SDRAM控制器等等。
;** Input: 无
;** Output: 无
;** Created by: 黄绍斌
;** Created Date: 2005-10-21
;**-------------------------------------------------------------------------------------------------------
;** Modified by:
;** Modified Date:
;**------------------------------------------------------------------------------------------------------
;********************************************************************************************************/
TargetInitReset
LDR R0,=WTCON ; 关闭WDT
LDR R1,=0x0000
STR R1,[R0] ; WTCON=0x0000
LDR R0,=INTMSK ; 禁止所有中断 (中断控制器)
LDR R1,=0xFFFFFFFF
STR R1,[R0] ; INTMSK=0xFFFFFFFF
LDR R0,=INTSUBMSK
LDR R1,=0x07FF ; INTSUBMSK=0x07FF
STR R1,[R0]
LDR R0,=SRCPND ; 清除中断标志 (add)
LDR R1,=0xFFFFFFFF
STR R1,[R0]
LDR R0,=INTPND
LDR R1,=0xFFFFFFFF
STR R1,[R0]
IF :DEF: Release
; 系统时钟设置,启用PLL
LDR R0,=LOCKTIME
LDR R1,=0x00FFFFFF ; 锁定时间设置U_LTIME=0xFFF,M_LTIME=0xFFF
STR R1,[R0]
LDR R0,=CLKDIVN
MOV R1,#0x03 ; HCLK=FCLK/2,PCLK=HCLK/2
STR R1,[R0]
MRC p15,0,R1,c1,c0,0 ; (MMU设置)读控制寄存器
ORR R1,R1,#0xC0000000 ; 异步
MRC p15,0,R1,c1,c0,0 ; 写控制寄存器
LDR R0,=MPLLCON
LDR R1,=MPLLCON_200 ; 设置CPU时钟为200Mhz (FCLK)
STR R1,[R0]
; 总线设置,初始化SDRAM
LDR R0,=BUS_INIT
LDR R1,=BWSCON
LDMIA R0!,{R2-R8}
STMIA R1!,{R2-R8}
LDMIA R0!,{R2-R7}
STMIA R1!,{R2-R7}
ENDIF
MOV PC,LR
BUS_INIT DCD (B7_BWCON<<28)|(B6_BWCON<<24)|(B5_BWCON<<20)|(B4_BWCON<<16)|(B3_BWCON<<12)|(B2_BWCON<<8)|(B1_BWCON<<4) ; BWSCON寄存器
DCD (1<<13)|(1<<11)|(7<<8)|(1<<6)|(1<<4)|(1<<2)|(0<<0) ; BANKCON0寄存器
DCD (1<<13)|(1<<11)|(7<<8)|(1<<6)|(1<<4)|(1<<2)|(0<<0) ; BANKCON1寄存器
DCD (1<<13)|(1<<11)|(7<<8)|(1<<6)|(1<<4)|(1<<2)|(0<<0) ; BANKCON2寄存器
DCD (1<<13)|(1<<11)|(7<<8)|(1<<6)|(1<<4)|(1<<2)|(0<<0) ; BANKCON3寄存器
DCD (1<<13)|(1<<11)|(7<<8)|(1<<6)|(1<<4)|(1<<2)|(0<<0) ; BANKCON4寄存器
DCD (1<<13)|(1<<11)|(7<<8)|(1<<6)|(1<<4)|(1<<2)|(0<<0) ; BANKCON5寄存器
DCD (3<<15)|(1<<2)|(1<<0) ; BANKCON6寄存器 (SDRAM)
DCD (0<<15)|(1<<13)|(1<<11)|(7<<8)|(1<<6)|(1<<4)|(1<<2)|(0<<0) ; BANKCON7寄存器 (SRAM)
DCD (1<<23)|(0<<22)|(0<<20)|(3<<18)|(1113) ; REFRESH寄存器(SDRAM) ,period=15.6us, HCLK=60Mhz, (2048+1-15.6*60)
DCD (1<<7)|(1<<5)|(1<<4)|(2<<0) ; BANKSIZE寄存器,128MB
DCD (3<<4) ; MRSRB6寄存器
DCD (3<<4) ; MRSRB7寄存器
;/*********************************************************************************************************
;** Function name: InitStack
;** Descriptions: 初始化堆栈。最后返回时,处理器工作在系统模式。
;** Input: 无
;** Output: 无
** Note: 由本文件开头的USR_STACK_LEGTH、SVC_STACK_LEGTH等定义各工作模式的堆栈大小。
;** Created by: 黄绍斌
;** Created Date: 2005-10-21
;**-------------------------------------------------------------------------------------------------------
;** Modified by:
;** Modified Date:
;**------------------------------------------------------------------------------------------------------
;********************************************************************************************************/
InitStack
MOV R0, LR
;设置管理模式堆栈
MSR CPSR_c, #(Mode_SVC | I_BIT | F_BIT) ; 0xd3
LDR SP, StackSvc
;设置中断模式堆栈
MSR CPSR_c, #(Mode_IRQ | I_BIT | F_BIT) ; 0xd2
LDR SP, StackIrq
;设置快速中断模式堆栈
MSR CPSR_c, #(Mode_FIQ | I_BIT | F_BIT) ; 0xd1
LDR SP, StackFiq
;设置中止模式堆栈
MSR CPSR_c, #(Mode_ABT | I_BIT | F_BIT) ; 0xd7
LDR SP, StackAbt
;设置未定义模式堆栈
MSR CPSR_c, #(Mode_UND | I_BIT | F_BIT) ; 0xdb
LDR SP, StackUnd
;设置系统模式堆栈
MSR CPSR_c, #(Mode_SYS | I_BIT | F_BIT) ; 0xdf
LDR SP, StackUsr
MOV PC, R0
StackUsr DCD UsrStackSpace + (USR_STACK_LEGTH - 1) * 4
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
;/*********************************************************************************************************
;** Function name: __user_initial_stackheap
;** Descriptions: 库函数初始化堆和栈,不能删除
;** Input: 参考库函数手册
;** Output: 参考库函数手册
;** Created by: 陈明计
;** Created Date: 2004-02-02
;**-------------------------------------------------------------------------------------------------------
;** Modified by:
;** Modified Date:
;**------------------------------------------------------------------------------------------------------
;********************************************************************************************************/
__user_initial_stackheap
LDR r0,=bottom_of_heap
MOV pc,lr
;/*********************************************************************************************************
;** Function name: __rt_div0
;** Descriptions: 整数除法除数为0错误处理函数,替代原始的__rt_div0减少目标代码大小
;** Input: 参考库函数手册
;** Output: 无
;** Created by: 陈明计
;** Created Date: 2004-02-02
;**-------------------------------------------------------------------------------------------------------
;** Modified by:
;** Modified Date:
;**------------------------------------------------------------------------------------------------------
;********************************************************************************************************/
__rt_div0
B __rt_div0
; /* 分配堆空间 */
AREA Myheap, DATA, NOINIT, ALIGN=2
bottom_of_heap SPACE 256 ;库函数的堆空间
; /* 分配堆栈空间 */
AREA MyStacks, DATA, NOINIT, ALIGN=2
UsrStackSpace SPACE USR_STACK_LEGTH * 4 ;用户(系统)模式堆栈空间
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 ;未定义模式堆栈
END
;/*********************************************************************************************************
;** End Of File
;********************************************************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -