📄 init.s
字号:
;******************************************************************************
;
; 启动代码
; LPC2214
; KEIL's uVision3
; (RealView Microprocessor Developer Kit)
;
; Filename : init.s
;******************************************************************************
PRESERVE8
AREA INIT, CODE, READONLY ; Name this block of code ;
ARM
;******************************************************************************
; 外部函数起始地址
;******************************************************************************
IMPORT __main ;主程序起始地址
IMPORT ||Image$$ARM_LIB_STACK$$ZI$$Limit|| ; 堆栈起始地址Import stack limit from scatter-loading file 执行区中ZI 输出节末尾地址后面的字节地址 ;
;******************************************************************************
; 内部函数起始地址
;******************************************************************************
EXPORT ResetHndlr ;系统引导与存储器映射设置程序
;******************************************************************************
; DEFINITIONS
;******************************************************************************
MODE_BITS EQU 0x1F ; CPSR的位屏蔽方式(模式位被屏蔽)
USR_MODE EQU 0x10 ; 用户模式
FIQ_MODE EQU 0x11 ; 快中断模式
IRQ_MODE EQU 0x12 ; 中断模式
SVC_MODE EQU 0x13 ; 管理模式
ABT_MODE EQU 0x17 ; 中止模式
UND_MODE EQU 0x1B ; 未定义模式
SYS_MODE EQU 0x1F ; 系统模式
I_BIT EQU 0x80 ;用来设置或查询IRQ位
F_BIT EQU 0x40 ;用来设置或查询FIQ位
;定义堆栈大小
IRQ_STK_SIZE EQU 0x00000200 ;中断模式堆栈大小512字节
FIQ_STK_SIZE EQU 0x00000100 ;快中断模式堆栈大小256字节
SVC_STK_SIZE EQU 0x00000200 ;管理模式堆栈大小512字节
ABT_STK_SIZE EQU 0x00000200 ;中止模式堆栈大小512字节
UND_STK_SIZE EQU 0x00000200 ;未定义模式堆栈大小512字节
SYS_STK_SIZE EQU 0x00000200 ;系统模式堆栈大小512字节
MEMMAP EQU 0xE01FC040 ;定义存储器映射控制寄存器地址
; Define stack pointers ;
;******************************************************************************
; PERFORM ROM/RAM REMAPPING
; 系统引导与存储器映射
;******************************************************************************
ENTRY
ResetHndlr
;判断采用了哪种系统引导与存储器映射方式
IF :DEF:REMAP
LDR R0, =MEMMAP
IF :DEF:EXTMEM_MODE ;用户外部存储器模式
MOV R1, #3
ELIF :DEF:RAM_MODE ;用户RAM模式
MOV R1, #2
ELSE ;用户Flash模式
MOV R1, #1
ENDIF
STR R1, [R0]
ENDIF
;******************************************************************************
; SETUP STACK POINTERS 初始化堆栈
;******************************************************************************
ldr r1, =||Image$$ARM_LIB_STACK$$ZI$$Limit||
mrs r0,cpsr ; 取CPSR原始值 ;
bic r0,r0,#MODE_BITS ; 清除模式位 ;
orr r0,r0,#IRQ_MODE ; 设置IRQ模式位 ;
msr cpsr_c,r0 ; 模式改变 ;
mov sp, r1 ; SP指到IRQ堆栈起始处
sub r1, r1, #IRQ_STK_SIZE ; 分配堆栈空间
mrs r0,cpsr ; Original PSR value ;
bic r0,r0,#MODE_BITS ; Clear the mode bits ;
orr r0,r0,#ABT_MODE ; Set IRQ mode bits ;
msr cpsr_c,r0 ; Change the mode ;
mov sp, r1
sub r1, r1, #ABT_STK_SIZE
mrs r0,cpsr ; Original PSR value ;
bic r0,r0,#MODE_BITS ; Clear the mode bits ;
orr r0,r0,#UND_MODE ; Set IRQ mode bits ;
msr cpsr_c,r0 ; Change the mode ;
mov sp, r1
sub r1, r1, #UND_STK_SIZE
mrs r0,cpsr ; Original PSR value ;
bic r0,r0,#MODE_BITS ; Clear the mode bits ;
orr r0,r0,#FIQ_MODE ; Set IRQ mode bits ;
msr cpsr_c,r0 ; Change the mode ;
mov sp, r1
sub r1, r1, #FIQ_STK_SIZE
mrs r0,cpsr ; Original PSR value ;
bic r0,r0,#MODE_BITS ; Clear the mode bits ;
orr r0,r0,#SVC_MODE ; Set IRQ mode bits ;
msr cpsr_c,r0 ; Change the mode ;
mov sp, r1
msr cpsr_c, #SVC_MODE:OR:F_BIT ; 进入管理模式并使能快中断;
;******************************************************************************
; MOVE TO MAIN
; 跳转到main函数
;******************************************************************************
ldr r0, =__main ;
bx r0 ; Save this in register for possible long jump ;
LTORG
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -