马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?注册
x
AREA Startup,CODE,READONLY
; /* 异常向量表 */
Vectors
LDR PC, ResetAddr
LDR PC, UndefinedAddr
LDR PC, SWI_Addr
LDR PC, PrefetchAddr
LDR PC, DataAbortAddr
DCD 0
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_Exception
FIQ_Addr DCD FIQ_Handler
; /* 未定义指令 */
Undefined
B Undefined
; /* 软中断 */
SoftwareInterrupt
CMP R0, #4
LDRLO PC, [PC, R0, LSL #2]
MOVS PC, LR
SwiFunction
DCD IRQDisable ;0
DCD IRQEnable ;1
DCD FIQDisable ;2
DCD FIQEnable ;3
IRQDisable
; 关IRQ中断
MRS R0, SPSR
ORR R0, R0, #I_BIT
MSR SPSR_c, R0
MOVS PC, LR
IRQEnable
; 开IRQ中断
MRS R0, SPSR
BIC R0, R0, #I_BIT
MSR SPSR_c, R0
MOVS PC, LR
FIQDisable
; 关FIQ中断
MRS R0, SPSR
ORR R0, R0, #F_BIT
MSR SPSR_c, R0
MOVS PC, LR
FIQEnable
; 开FIQ中断
MRS R0, SPSR
BIC R0, R0, #F_BIT
MSR SPSR_c, R0
MOVS PC, LR
; /* 取指中止 */
PrefetchAbort
B PrefetchAbort
; /* 取数据中止 */
////////////////////////////////////////////
DataAbort
B DataAbort
////////////////////////////////////////////
ResetInit
BL InitStack ; 初始化堆栈
BL TargetBusInit ; 总线系统初始化 (函数中不允许堆栈操作)
BL TargetResetInit ; 针对目标板的系统初始化 ///////////////////////
;在执行TargetResetInit 的时候会DataAbort
MRC p15,0,R1,c1,c0,0 ; (MMU设置,异步总线模式) 读控制寄存器
ORR R1,R1,#0xC0000000 ; 当HDIVN=1时操作有效
MRC p15,0,R1,c1,c0,0
B __main ; 跳转到c语言入口
end
void TargetResetInit(void)
{
int i;
volatile uint32 *cp1, *cp2;
cp1 = cp2 = NULL; // 防止编译报警
rWTCON = 0x0000; // 关闭WDT ////////////此时 DataAbort 是为什么??给点建议!!!
rINTMSK = 0xFFFFFFFF; // 禁止所有中断 (中断控制器)
rINTSUBMSK = 0x07FF;
rSRCPND = 0xFFFFFFFF; // 清除中断(源)标志
rINTPND = 0xFFFFFFFF; // 清除IRQ中断标志 |