微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > LPC2xxx启动代码分析

LPC2xxx启动代码分析

时间:11-09 来源:互联网 点击:
ARM启动代码分析-philips的LPC2xxx系列12006-7-24 14:30:00

/**********************************************************************************************

*File: startup.s

*Author: Embest w.h.xie 2005.02.21

*Desc: lpc22xx/lpc212x/lpc211x/lpc210x startup code

*History:

* note modify:cui jian jie 2006-4-25

*comment:

**********************************************************************************************/

#处理器的七种工作方式的常量定义

.EQU Mode_USR, 0x10#用户模式

.EQU Mode_FIQ, 0x11 #FIQ模式

.EQU Mode_IRQ, 0x12 #IRQ模式

.EQU Mode_SVC, 0x13#超级用户模式

.EQU Mode_ABT, 0x17#终止模式

.EQU Mode_UND, 0x1B #未定义模式

.EQU Mode_SYS, 0x1F#系统模式

#中断屏蔽位

.EQU I_Bit, 0x80 //IRQ中断控制位,当被置位时,IRQ中断被禁止

.EQU F_Bit, 0x40 //FIQ中断控制位,当被置位时,FIQ中断被禁止

#状态屏蔽位

.EQU T_bit, 0x20//T位,置位时在Thumb模式下运行,清零时在ARM下运行

#定义程序入口点

.globl _start

.code 32

.TEXT

_start:

#中断向量表

Vectors:

LDR PC, Reset_Addr//把Reset_Addr地址处的内容放入PC中

LDR PC, Undef_Addr

LDR PC, SWI_Addr

LDR PC, PAbt_Addr

LDR PC, DAbt_Addr

.long 0xb9205f80@ keep interrupt vectors sum is 0

LDR PC, [PC, #-0xff0] //当前PC值减去0xFF0等于IRQ中断入口地址

LDR PC, FIQ_Addr

#地址表

Reset_Addr: #该地址标号存放Reset_Handler程序段的入口地址

.long Reset_Handler

Undef_Addr: #该地址标号存放Undef_Handler程序段的入口地址

.long Undef_Handler

SWI_Addr: #该地址标号存放SWI_Handler程序段的入口地址

.long SWI_Handler

PAbt_Addr: #该地址标号存放PAbt_Handler程序段的入口地址

.long PAbt_Handler

DAbt_Addr:

.long DAbt_Handler

.long 0

IRQ_Addr: #地址标号处存放一个无效的数据

.long 0

FIQ_Addr: #该地址标号存放FIQ_Handler程序段的入口地址

.long FIQ_Handler

Undef_Handler:

B Undef_Handler

PAbt_Handler:

B PAbt_Handler

DAbt_Handler:

B DAbt_Handler

#软中断的中断服务子程序入口地址

SWI_Handler:

STMFD sp!, {r0-r3, r12, lr}//入栈,现场数据保护

MOV r1, sp //把堆栈指针SP存入R1中

MRS r0, spsr//把SPSR值存入R0,SPSR值为产生软中断时的CPSR

TST r0, #T_bit //判断R0(SPSR)的T位是否为0

#SPSR的T位不为0,工作在Thumb模式下

LDRNEH r0, [lr,#-2] //SPSR的T位不为0,则[lr-2]-〉r0

BICNE r0, r0, #0xFF00// SPSR的T位不为0,清除r0的Bit8~Bit15位

# SPSR的T位为0,工作在ARM模式下

LDREQ r0, [lr,#-4] // SPSR的T位为0,则[lr-4] -〉r0

BICEQ r0, r0, #0xFF000000// SPSR的T位为0,清除r0的Bit24~Bit131位

# R0 is interrupt number //R0是中断号

# R1 is stack point //R1是堆栈指针

BL SWI_Exception //进入软中断处理程序

LDMFD sp!, {r0-r3, r12, pc}^ //出栈,现场数据恢复

#快速响应中断的中断服务自程序的入口地址

FIQ_Handler:

STMFD SP!, {R0-R3, LR} //入栈的现场保护

# BL FIQ_Exception//进入FIQ的中断处理程序

LDMFD SP!, {R0-R3, LR} //出栈,恢复现场

SUBS PC, LR, #4 //返回到主程序

#复位后程序处理的入口地址

Reset_Handler:

BL RemapSRAM//进行存储器映射的操作

#下面几行代码用来判断当前的工作模式

MRS R0, CPSR //读CPSR到寄存器R0

AND R0, R0, #0x1F //R0 = R0 AND 0x1F

CMP R0,#Mode_USR//比较R0和#Mode_USR,二者相减

//如果相等则说明当前处在用户模式下,需要通过产生11号软中断进入系统模式。因为下面的初始化堆栈

//需要在不同的工作模式下切换,而在用户模式下不能直接切换,只有系统模式可以,所以要通过产生11

//号软中断切换到用户模式。

SWIEQ #11

BL InitStack //进行堆栈初始化工作

ARM启动代码分析-philips的LPC2xxx系列32006-7-24 14:33:00

#------------------------------------------------------------------------------

#-初始化C变量

#------------------------

#-下表由连接器自动产生

#- RO:只读=代码区。

#- RW:可读可写=预先初始化的数据(初始化的全局变量)和预先被清零的数据(未初始化的全局变量)。.

#- ZI:预先被清零的数据区(未初始化的全局变量)

#-预先被初始化的数据区定位在代码区之后。

#-预先被清零的数据区定位在预先被初始化的数据区之后。

#-注意数据区的位置:

#- I如果用ARM SDT,当链接器选择no -rw-base时,数据区

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top