📄 startup.s
字号:
;/***********************************************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 + -