📄 startup.s
字号:
;/****************************************Copyright (c)**************************************************
;** 广州周立功单片机发展有限公司
;** 研 究 所
;** 产品一部
;**
;** http://www.zlgmcu.com
;**
;**--------------文件信息--------------------------------------------------------------------------------
;**文 件 名: Startup.s
;**创 建 人: 陈明计
;**最后修改日期: 2004年3月3日
;**描 述: lpc22xx的启动代码,包含异常向量入口、初始化堆栈的代码等
;** 每个工程应当有独立的这个文件的拷贝,并进行相应的修改
;**--------------历史版本信息----------------------------------------------------------------------------
;** 创建人: 陈明计
;** 版 本: v1.0
;** 日 期: 2004年2月2日
;** 描 述: 原始版本
;**
;**------------------------------------------------------------------------------------------------------
;** 修改人: 陈明计
;** 版 本: v1.01
;** 日 期: 2004年3月3日
;** 描 述: 修改总线配置以适应多数情况
;**
;**------------------------------------------------------------------------------------------------------
;** 修改人: 陈明计
;** 版 本: v1.02
;** 日 期: 2004年3月27日
;** 描 述: 增加代码以支持芯片的加密功能
;**
;**--------------当前版本修订------------------------------------------------------------------------------
;** 修改人:
;** 日 期:
;** 描 述:
;**
;**------------------------------------------------------------------------------------------------------
;********************************************************************************************************/
;定义堆栈的大小
USR_STACK_LEGTH EQU 256 ;USR堆栈大小
SVC_STACK_LEGTH EQU 0
FIQ_STACK_LEGTH EQU 0
IRQ_STACK_LEGTH EQU 256 ;IRQ堆栈大小(32Bits)
ABT_STACK_LEGTH EQU 0
UND_STACK_LEGTH EQU 0
NoInt EQU 0x80
NoFIQ EQU 0x40
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
;引入的外部标号在这声明
IMPORT FIQ_Exception ;快速中断异常处理程序
IMPORT __main ;C语言主程序入口
IMPORT TargetResetInit ;目标板基本初始化
IMPORT StackUsr
IMPORT bottom_of_heap
;给外部使用的标号在这声明
EXPORT Reset
EXPORT __rt_div0
EXPORT __user_initial_stackheap
CODE32
AREA vectors,CODE,READONLY
ENTRY
;中断向量表
Reset
LDR PC, ResetAddr ;0x8000 0000;每个中断入口保留4字节
LDR PC, UndefinedAddr ;0x8000 0004
LDR PC, SWI_Addr ;0x8000 0008
LDR PC, PrefetchAddr ;0x8000 000C
LDR PC, DataAbortAddr ;0x8000 0010
DCD 0xb9205f80 ;0x8000 0014;系统保留
LDR PC, [PC, #-0xff0] ;0x8000 0008
LDR PC, FIQ_Addr ;0x8000 000C
ResetAddr DCD ResetInit ;DCD用于一段字内存单元分配(4个字)
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
;//增加开/关中断处理 Chenxibing-2004-02-09
CMP R0, #4
LDRLO PC, [PC, R0, LSL #2]
MOVS PC, LR
SwiFunction
DCD IRQDisable ;0
DCD IRQEnable ;1
DCD FIQDisable ;2
DCD FIQEnable ;3
IRQDisable
;关IRQ中断
MRS R0, SPSR
ORR R0, R0, #NoInt
MSR SPSR_c, R0
MOVS PC, LR
IRQEnable
;开IRQ中断
MRS R0, SPSR
BIC R0, R0, #NoInt
MSR SPSR_c, R0
MOVS PC, LR
FIQDisable
;关FIQ中断
MRS R0, SPSR
ORR R0, R0, #NoFIQ
MSR SPSR_c, R0
MOVS PC, LR
FIQEnable
;开FIQ中断
MRS R0, SPSR
BIC R0, R0, #NoFIQ
MSR SPSR_c, R0
MOVS PC, LR
;// Changed 2004-12-09
;取指令中止
PrefetchAbort
B PrefetchAbort
;取数据中止
DataAbort
B DataAbort
;快速中断
FIQ_Handler
STMFD SP!, {R0-R3, LR} ;将R0~R3和LR入栈
BL FIQ_Exception ;调用子程序FIQ_Exception
LDMFD SP!, {R0-R3, LR} ;恢复R0~R3和LR
SUBS PC, LR, #4
;/*********************************************************************************************************
;** 函数名称: InitStack
;** 功能描述: 初始化堆栈
;** 输 入: 无
;** 输 出 : 无
;** 全局变量: 无
;** 调用模块: 无
;**
;** 作 者: 陈明计
;** 日 期: 2004年2月2日
;**-------------------------------------------------------------------------------------------------------
;** 修 改: Zeloso
;** 日 期: 2007/09/12
;**-------------------------------------------------------------------------------------------------------
;********************************************************************************************************/
InitStack ;系统复位后进入管理模式
MOV R0, LR ;保存
;设置管理模式堆栈
MSR CPSR_c, #0xd3 ;1101 0011 Bit7=IRQ OFF,Bit6=FIQ OFF,运行ARM状态,管理模式
LDR SP, StackSvc ;定义管理模式堆栈空间
;设置中断模式堆栈
MSR CPSR_c, #0xd2 ;1101 0010 Bit7=IRQ OFF,Bit6=FIQ OFF,运行ARM状态,中断模式
LDR SP, StackIrq
;设置快速中断模式堆栈
MSR CPSR_c, #0xd1 ;1101 0001 Bit7=IRQ OFF,Bit6=FIQ OFF,运行ARM状态,快速中断模式
LDR SP, StackFiq
;设置中止模式堆栈
MSR CPSR_c, #0xd7 ;1101 0111 Bit7=IRQ OFF,Bit6=FIQ OFF,运行ARM状态,中止模式ARM7TDMI无多大用处
LDR SP, StackAbt
;设置未定义模式堆栈
MSR CPSR_c, #0xdb ;1101 1011 Bit7=IRQ OFF,Bit6=FIQ OFF,运行ARM状态,未定义模式,指令异常响应进入
LDR SP, StackUnd
;设置系统模式堆栈
MSR CPSR_c, #0x5f ;1101 1111 Bit7=IRQ ON,Bit6=FIQ OFF,运行ARM状态,系统模式,拥有直接切换到其它模式的特权
LDR SP, =StackUsr
MOV PC, R0 ;子程序返回
;/*********************************************************************************************************
;** 函数名称: ResetInit
;** 功能描述: 复位入口.初始化各个IO配置,符合存储器寻址
;**
;** 输 入: 无
;**
;** 输 出: 无
;**
;** 全局变量: 无
;** 调用模块: 无
;**
;** 作 者: 陈明计
;** 日 期: 2004年2月2日
;**-------------------------------------------------------------------------------------------------------
;** 修改人: Zeloso
;** 日 期: 2007/09/12
;**------------------------------------------------------------------------------------------------------
;********************************************************************************************************/
ResetInit
;初始化外部总线控制器,根据目标板决定配置
LDR R0, =PINSEL2 ;对PINSEL2进行初始化赋值
IF :DEF: EN_CRP
LDR R1, =0x0f814910 ;P1.31~P1.26=GPIO
ELSE
LDR R1, =0x0f814914 ;0000 1111 1000 0001 0100 1001 0001 0100
;31~28 27~24 23~20 19~16 15~12 11~8 7 ~4 3 ~0
;P1.31~P1.26=DBIO,P1.25~P1.16=GPIO
;P2.7~P2.0=D[7:0],
;P1.0=CS0
;P1.1=OE
;P3.31=BLS0
;P2.15~P2.8=D[15:8]
;P3.30=BLS1
;P2.27~P2.16=D[27:16]
;P2.29~P2.28=D[29:28]
;P2.31~P2.30=D[31:30]
;P3.29~P2.28=BLS[2:3]
;P3.29=GPIO
;P3.28=GPIO
;P3.27=WE
;P3.26=CS1
;P3.23=GPIO
;P3.25=CS2
;P3.24=CS3
;P2.29~P2.28=GPIO
;P2.23=GPIO
;P2.31=GPIO
;P3.00=ADLINE
;P3.31=ADLINE
;P3.23,P3.22,P3.02=ADLINE
ENDIF
STR R1, [R0] ;
LDR R0, =BCFG0 ;设定寄存器组0配置
LDR R1, =0x1000ffef ;0001 0000 0000 0000 1111 1111 1110 1111
;31~28 27~24 23~20 19~16 15~12 11~8 7 ~4 3 ~0
;IDCY=16 cclks
;WST1=34 cclks
;RBLE=存储器含有16Bits和32Bits器件组成
;WST2=31 cclks
;BUSERR=0
;WPERR=0
;WP=0
;BM=0 NO BurstROM
;MW=32Bits 数据总线宽度
STR R1, [R0] ;
LDR R0, =BCFG1 ;设定寄存器组1配置
LDR R1, =0x1000ffef ;与BCFG0配置一样
STR R1, [R0]
; LDR R0, =BCFG2
; LDR R1, =0x2000ffef
; STR R1, [R0]
; LDR R0, =BCFG3
; LDR R1, =0x2000ffef
; STR R1, [R0]
BL InitStack ;调用初始化堆栈子程序
BL TargetResetInit ;目标板基本初始化;存储映射,PLL设置
;跳转到c语言入口
B __main
;/*********************************************************************************************************
;** 函数名称: __user_initial_stackheap
;** 功能描述: 库函数初始化堆和栈,不能删除
;**
;** 输 入: 参考库函数手册
;**
;** 输 出: 参考库函数手册
;**
;** 全局变量: 无
;** 调用模块: 无
;**
;** 作 者: 陈明计
;** 日 期: 2004年2月2日
;**-------------------------------------------------------------------------------------------------------
;** 修改人:
;** 日 期:
;**------------------------------------------------------------------------------------------------------
;********************************************************************************************************/
__user_initial_stackheap
LDR r0,=bottom_of_heap
MOV pc,lr
;/*********************************************************************************************************
;** 函数名称: __rt_div0
;** 功能描述: 整数除法除数为0错误处理函数,替代原始的__rt_div0减少目标代码大小
;**
;** 输 入: 参考库函数手册
;**
;** 输 出: 无
;**
;** 全局变量: 无
;** 调用模块: 无
;**
;** 作 者: 陈明计
;** 日 期: 2004年2月2日
;**-------------------------------------------------------------------------------------------------------
;** 修改人: Zeloso
;** 日 期: 2007/09/12
;**------------------------------------------------------------------------------------------------------
;********************************************************************************************************/
__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
;/*********************************************************************************************************
;** 函数名称: CrpData
;** 功能描述: 支持芯片加密功能
;**
;** 输 入: 无
;**
;** 输 出: 无
;**
;** 全局变量: 无
;** 调用模块: 无
;**
;** 作 者: 陈明计
;** 日 期: 2004年3月27日
;**-------------------------------------------------------------------------------------------------------
;** 修改人:
;** 日 期:
;**------------------------------------------------------------------------------------------------------
;;********************************************************************************************************/
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时,用户程序被保护 */
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 ;未定义模式堆栈
END
;/*********************************************************************************************************
;** End Of File
;********************************************************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -