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

📄 startup.s

📁 philips arm7 lpc2103的常用功能的库函数第二部分
💻 S
📖 第 1 页 / 共 2 页
字号:
;/***********************************************Copyright (c)********************************************
;**                                Guangzou ZLG-MCU Development Co.,LTD.
;**                                     
;**                                       http://www.zlgmcu.com
;**
;**--------------File Info--------------------------------------------------------------------------------
;** File name:			        startup.s
;** Last modified Date:         2007-09-20
;** Last Version:		        1.05
;** Descriptions:		        LPC22XX系列启动代码
;**
;**-------------------------------------------------------------------------------------------------------
;** Created by:	                chengmingji		    
;** Created date:               2004-9-17		    
;** Version:				    1.04
;** Descriptions:		        The start up codes for LPC2200, including the initializing codes for the 
;**                             entry point of exceptions and the stacks of user tasks.Every project 
;**		                        should have a independent copy of this file for related modifications		
;**-------------------------------------------------------------------------------------------------------
;** Modified by:			    lixiaocheng
;** Modified Date:		        2007-09-20
;** Version:				    1.05
;** Descriptions:		        添加了中断管理部分代码,优化了IRQ中断入口的代码,修改了栈顶名称
;**                             其余与原启动代码保持一样 
;**
;**-------------------------------------------------------------------------------------------------------
;** Modified by:			    lixiaocheng
;** Modified Date:		        2007-09-20
;** Version:				    1.06
;** Descriptions:		        添加了ClrVic部分函数,用来初始化中断向量管理器,加入该函数可以方便调试 
;**
;**-------------------------------------------------------------------------------------------------------
;** Modified by:			    lixiaocheng
;** Modified Date:		        2007-09-26
;** Version:				    1.07
;** Descriptions:		        修改了IRQ中断入口,对中断进入和返回做了处理,中断服务程序是在SYS态下执行的
;**                             不占用IRQ堆栈,用户不需要修改IRQ堆栈了,用户中断服务不需要使用__irq来修饰 
;**
;********************************************************************************************************/


;/********************************************************************************************************
;   引入的外部标号在这声明
;********************************************************************************************************/
    IMPORT __use_no_semihosting_swi
    IMPORT __use_two_region_memory
    
    IMPORT  FIQ_Exception                                              ;/* 快速中断异常处理程序         */ 
    IMPORT  __main                                                     ;/* c语言程序入口                */ 
    IMPORT  TargetResetInit                                            ;/* 目标板初始化                 */ 

;/********************************************************************************************************
;   给外部使用的标号在这声明
;********************************************************************************************************/
    EXPORT  bottom_of_heap
    EXPORT  StackUsr
    
    EXPORT  Reset
    EXPORT __user_initial_stackheap

;/********************************************************************************************************
;   定义堆栈的大小
;********************************************************************************************************/
SVC_STACK_LEGTH     EQU         0
FIQ_STACK_LEGTH     EQU         8
IRQ_STACK_LEGTH     EQU         64
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

;/********************************************************************************************************
;   定义总线控制寄存器的地址
;********************************************************************************************************/
BCFG0               EQU         0xFFE00000
BCFG1               EQU         0xFFE00004
BCFG2               EQU         0xFFE00008
BCFG3               EQU         0xFFE0000C

;/********************************************************************************************************
;   定义测试THUMB代码的常量
;********************************************************************************************************/
T_bit               EQU         0x20

;/********************************************************************************************************
;   定义管脚连接模块的地址和中断向量管理的寄存器地址
;********************************************************************************************************/
PINSEL2             EQU         0xE002C014
VICIntSelect		EQU			0xFFFFF00C
VICIntEnable		EQU		    0xFFFFF010
VICIntEnClr			EQU			0xFFFFF014	
VICVectAddr0		EQU			0xFFFFF100
VICVectCntl0		EQU			0xFFFFF200
VICDefVectAddr      EQU         0xFFFFF034
VICVectAddr         EQU         0xFFFFF030

;/********************************************************************************************************
;   定义一个记录IRQ关中断的次数变量
;********************************************************************************************************/
    AREA    IRQCout, DATA, NOINIT, ALIGN=2
IRQ_EnterSum        SPACE       4           

;/********************************************************************************************************
;   异常向量表,也即程序入口
;********************************************************************************************************/
    CODE32

    AREA    vectors,CODE,READONLY
        ENTRY

;interrupt vectors
;中断向量表
Reset
        LDR     PC, ResetAddr
        LDR     PC, UndefinedAddr
        LDR     PC, SWI_Addr
        LDR     PC, PrefetchAddr
        LDR     PC, DataAbortAddr
        DCD     0xB8A06F58
        LDR     PC, IRQ_Addr
        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     IRQ_Handler
FIQ_Addr            DCD     FIQ_Handler

;/********************************************************************************************************
;   优化IRQ中断的一个宏
;********************************************************************************************************/
	MACRO
    ISR_HANDLER
; 调用c语言的中断处理程序
        LDR     R2, =0xFFFFF030		                                   ;/* 读取Addr地址                 */
        LDR     R3, [R2]
        MOV     LR, PC
        BX      R3
    MEND
    
;/********************************************************************************************************
;   引入一个汇编头文件,该头文件里定义了处理中断入口的宏
;********************************************************************************************************/
     INCLUDE		irq.inc			

;/********************************************************************************************************
;   异常向量表的跳转目标
;********************************************************************************************************/
IRQ_Handler  HANDLER                                                   ;/* IRQ                          */

Undefined                                                              ;/* 未定义                       */
        B       Undefined

FIQ_Handler                                                            ;/* 快速中断                     */
        STMFD   SP!, {R0-R3, LR}
        MSR     CPSR_c,#(SYS32Mode | NoInt | NoFIQ )
        STMFD   SP!,{LR}                                               ;/* 保护用户态下LR               */
        BL      FIQ_Exception
        LDMFD   SP!,{LR}
        MSR     CPSR_c,#(FIQ32Mode | NoInt | NoFIQ )
        LDMFD   SP!, {R0-R3, LR}
        SUBS    PC,  LR,  #4
 
PrefetchAbort                                                          ;/* 取指令中止                   */
        B       PrefetchAbort

DataAbort                                                              ;/* 取数据中止                   */
        B       DataAbort
        
;/********************************************************************************************************
;** Function name:           CrpData
;** Descriptions:            增加加密功能
;** Input parameters:        NONE
;** Output parameters:       NONE
;** Returned value:          NONE
;********************************************************************************************************/
    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                                                              ;/* EN_CRP                       */


;/********************************************************************************************************
;   软中断入口,
;********************************************************************************************************/
SoftwareInterrupt
   	    MSR     CPSR_c,#(SYS32Mode | NoInt | NoFIQ )
 	    STMFD   SP!,{R4-R6} 
 	    MSR     CPSR_c,#(SVC32Mode | NoInt | NoFIQ )
        CMP		R0, #11
        LDRLO   PC, [PC, R0, LSL #2]
        B		RESULTFALSE
		    
SwiFunction
        DCD     SYSIRQDisable      	;0
        DCD     SYSIRQEnable       	;1
        DCD		SYSFIQDisable	 	;2
        DCD		SYSFIQEnable	 	;3
        DCD		SYSIRQVicSet		;4
        DCD		SYSIRQVicGet		;5
        DCD     SYSIRQVicClr		;6
        DCD		SYSIRQVicDefSet		;7
        DCD     SYSIRQVicDefClr		;8
        DCD     SYSFIQSet			;9
        DCD		SYSFIQClr			;10

SYSIRQDisable                                                          ;/* 关闭IRQ中断总开关            */
        LDR     R4,=IRQ_EnterSum
        LDR     R5,[R4]
        ADD     R5,R5,#1
        STR     R5,[R4]
        MRS     R0, SPSR
        ORR     R0, R0, #NoInt
        MSR     SPSR_c, R0
        B		RESULTTRUE

SYSIRQEnable                                                           ;/* 打开IRQ中断总开关            */
        LDR     R4,=IRQ_EnterSum
        LDR     R5,[R4]
        CMP     R5,#0
        SUBNE   R5,R5,#1
        STR     R5,[R4]
        CMP     R5,#0
        MRS     R0, SPSR
        BICEQ   R0, R0, #NoInt
        MSR     SPSR_c, R0
        B	    RESULTTRUE
        
SYSFIQDisable                                                          ;/* 关闭FIQ中断总开关            */
        MRS     R0, SPSR
        ORR     R0, R0, #NoFIQ
        MSR     SPSR_c, R0
        B		RESULTTRUE

SYSFIQEnable                                                           ;/* 打开FIQ中断总开关            */
        ;开FIQ中断
        MRS   R0, SPSR
        BIC   R0, R0, #NoFIQ
        MSR   SPSR_c, R0
        B	  RESULTTRUE
        
;/*
; * 以下是中断管理函数的原形,函数调用请参见IRQManage.h
; */
SYSIRQVicSet                                                           ;/* IRQ中断设置                  */
	   CMP    R1, #32						                           ;/* if(通道号 >=32) return FALSE */
 	   BCS	  RESULTFALSE
       CMP    R2, #16
       BCS    RESULTFALSE                                              ;/* if(优先级 >=16) return FALSE */
 
	   LDR    R0,=VICVectCntl0				                           ;/* 优先级被设置过了,返回错误   */
	   LDR	  R0,[R0,R2,LSL #2]
	   CMP	  R0,#0
	   BNE	  RESULTFALSE
	   
	   ORR    R6,R1,#0X20
	   MOV    R4,#0
FINDLOOP	   
	   LDR    R0,=VICVectCntl0				                           ;/* 部件已设置,返回错误          */
	   LDR    R5,[R0,R4]
	   CMP    R5,R6

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -