⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 startup.s

📁 arm22xx模板程序 调试通过
💻 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 + -