;/*******************************************************************************************************
;* 文件名:Startup.s
;* 功 能:开发板启动代码。包含异常向量表,当异常(包括复位)发生时,程序将从异常向量表取指进行跳转。还包
;* 含对各模式系统堆栈的初始化代码,接着调用开发板初始化代码,最后跳转到C语言main()函数入口处。
;* 另外,开/关IRQ中断和FIQ中断采用SWI的方式实现,处理程序也在本文件中。
;* 作 者:POWER
;* 日 期:2006年5月25号
;* 斯凯科技主页:www.armsky.net
;* 斯凯科技论坛:www.armsky.net/bbs
;********************************************************************************************************/
;/*定义堆栈的大小*/
SVC_STACK_LEGTH EQU 0
FIQ_STACK_LEGTH EQU 0
IRQ_STACK_LEGTH EQU 256
ABT_STACK_LEGTH EQU 0
UND_STACK_LEGTH EQU 0
NoInt EQU 0x80 ;// Bit7,I位
NoFIQ EQU 0x40 ;// Bit6,F位
USR32Mode EQU 0x10 ;// M[4:0]=10000,用户模式
SVC32Mode EQU 0x13 ;// M[4:0]=10011,管理模式
SYS32Mode EQU 0x1f ;// M[4:0]=11111,系统模式
IRQ32Mode EQU 0x12 ;// M[4:0]=10010,IRQ中断
FIQ32Mode EQU 0x11 ;// M[4:0]=10001,快速中断
IMPORT __use_no_semihosting_swi
;/* 引入的外部标号在这声明 */
IMPORT FIQ_Exception ;// 快速中断异常处理程序
IMPORT __main ;// C语言主程序入口
IMPORT TargetResetInit ;// 开发板基本初始化
;/* 给外部使用的标号在这声明 */
EXPORT bottom_of_heap
EXPORT StackUsr
EXPORT Reset
EXPORT __user_initial_stackheap
CODE32
AREA vectors,CODE,READONLY
ENTRY
;/* 中断向量表 */
Reset
LDR PC, ResetAddr ;// 0x00000000,复位
LDR PC, UndefinedAddr ;// 0x00000004,未定义地址
LDR PC, SWI_Addr ;// 0x00000008,软件中断
LDR PC, PrefetchAddr ;// 0x0000000c,预取指中止
LDR PC, DataAbortAddr ;// 0x00000010,数据中止
DCD 0xb9205f80 ;// 0x00000014,保留
LDR PC, [PC, #-0xff0] ;// 0x00000018,IRQ中断
LDR PC, FIQ_Addr ;// 0x0000001c,FIQ中断
ResetAddr DCD ResetInit ;// 复位初始化处理程序地址
UndefinedAddr DCD Undefined ;// 未定义指令处理程序地址
SWI_Addr DCD SoftwareInterrupt ;// 软件中断处理程序地址
PrefetchAddr DCD PrefetchAbort ;// 预取指中止处理程序地址
DataAbortAddr DCD DataAbort ;// 数据中止处理程序地址
Nouse DCD 0 ;// 未使用
IRQ_Addr DCD 0 ;// IRQ中断,已在"LDR PC,[PC,#-0xff0]"中处理
FIQ_Addr DCD FIQ_Handler ;// FIQ中断处理程序地址
;/* 未定义指令 */
Undefined
B Undefined ;// 死循环
;/* 软中断,中断号0~3已经占用 */
SoftwareInterrupt
CMP R0, #4 ;// 判断传过来的参数是否大于4
LDRLO PC, [PC, R0, LSL #2] ;// 小于4(参数正确),进行查表
MOVS PC, LR ;// 大于或等于4(参数出错),则返回
SwiFunction
DCD IRQDisable ;// 0号调用,禁止IRQ中断
DCD IRQEnable ;// 1号调用,使能IRQ中断
DCD FIQDisable ;// 2号调用,禁止FIQ中断
DCD FIQEnable ;// 3号调用,使能FIQ中断
IRQDisable
;/* 禁止IRQ中断 */
MRS R0, SPSR ;// 读取SPSR的值
ORR R0, R0, #NoInt ;// 置位I位,设置关IRQ中断
MSR SPSR_c, R0 ;// 回写SPSR
MOVS PC, LR ;// 返回
IRQEnable
;/* 使能IRQ中断 */
MRS R0, SPSR ;// 读取SPSR的值
BIC R0, R0, #NoInt ;// 清零I位,设置开IRQ中断
MSR SPSR_c, R0 ;// 回写SPSR
MOVS PC, LR ;// 返回
FIQDisable
;/* 禁止FIQ中断 */
MRS R0, SPSR ;// 读取SPSR的值
ORR R0, R0, #NoFIQ ;// 置位F位,设置关FIQ中断
MSR SPSR_c, R0 ;// 回写SPSR
MOVS PC, LR ;// 返回
FIQEnable
;/* 使能FIQ中断 */
MRS R0, SPSR ;// 读取SPSR的值
BIC R0, R0, #NoFIQ ;// 清零F位,设置开FIQ中断
MSR SPSR_c, R0 ;// 回写SPSR
MOVS PC, LR ;// 返回
;/* 取指令中止 */
PrefetchAbort
B PrefetchAbort ;// 死循环
;/* 取数据中止 */
DataAbort
B DataAbort ;// 死循环
;/* 快速中断 */
FIQ_Handler
STMFD SP!, {R0-R3, LR} ;// 寄存器R0~R3,LR入栈
BL FIQ_Exception ;// 调用FIQ处理程序(在target.c中)
LDMFD SP!, {R0-R3, LR} ;// 寄存器R0~R3,LR出栈
SUBS PC, LR, #4 ;// 计算返回地址
;/*********************************************************************************************************
;* 函数名称:InitStack
;* 功能描述:初始化堆栈
;* 入口参数:无
;* 出口参数:无
;* 注 意:当进行初始化堆栈时,处理器状态为ARM状态(T=0