开电复位,程序首先跳转到
b SYS_RST_HANDLER ;跳转到复位处理程序
SYS_RST_HANDLER
mrs r0, cpsr ;enter svc mode and disable irq,fiq
bic r0, r0, #MODEMASK ;将CPSR寄存器低5位(模式控制)清零
orr r0, r0, #(SVCMODE :OR: I_BIT :OR: F_BIT);设置为管理模式,同时禁止IRQ,FIQ
msr cpsr_c, r0 ;cpsr_c为CPSR寄存器低8位,R0->cpsr_c
; IMPORT InitSystem
b InitSystem
InitSystem_exit
其中MODEMASK EQU 0x1F
最后一句b InitSystem
跳转到SysInit.s文件的InitSystem代码段
进行一系列初始化
InitSystem
ldr r0,=WTCON ;watch dog disable
ldr r1,=0x0
str r1,[r0]
ldr r0,=INTMSK
ldr r1,=0xffffffff ;all interrupt disable
str r1,[r0]
ldr r0,=INTSUBMSK
ldr r1,=0x3ff ;all sub interrupt disable
str r1,[r0]
;To reduce PLL lock time, adjust the LOCKTIME register.
ldr r0,=LOCKTIME
ldr r1,=0xffffff
str r1,[r0]
[ PLL_ON_START
;Configure MPLL
ldr r0,=MPLLCON
ldr r1,=((M_MDIV<<12)+(M_PDIV<<4)+M_SDIV) ;Fin=12MHz,Fout=50MHz
str r1,[r0]
]
ldr r0, =CLKCON
ldr r1, =0xffff0
str r1, [r0] ;使能所有功能单元块时钟,复位后缺省为全部使能
;Check if the boot is caused by the wake-up from POWER_OFF mode.
; ldr r1,=GSTATUS2
; ldr r0,[r1]
; tst r0,#0x2
;In case of the wake-up from POWER_OFF mode, go to POWER_OFF_WAKEUP handler.
; bne WAKEUP_POWER_OFF
adr r0, SMRDATA ;can not use ldr r0, =xxxx important!!!
ldr r1, =BWSCON ;BWSCON Address
add r2, r0, #52 ;End address of SMRDATA
0
ldr r3, [r0], #4
str r3, [r1], #4
cmp r2, r0
bne %B0
;ldr r0, =IrqSvcVector
;ldr r1, =IRQ_SERVICE
;str r1, [r0]
ldr r0, =BWSCON
ldr r0, [r0]
ands r0, r0, #6 ;OM[1:0] != 0, NOR FLash boot
bne InitSystem_exit ;do not read nand flash
adr r0, __ENTRY ;OM[1:0] == 0, NAND FLash boot
cmp r0, #0 ;if use Multi-ice,
bne InitSystem_exit ;do not read nand flash for boot
跳转回vector.s文件的InitSystem_exit,禁止了看门狗等
顺序执行接下来的代码
;初始化堆栈
;Do not use DRAM,such as stmfd,ldmfd......
;SVCstack is initialized before
;Under toolkit ver 2.50, 'msr cpsr,r1' can be used instead of 'msr cpsr_cxsf,r1'
mrs r0, cpsr
bic r0, r0, #(MODEMASK|NOINT)
orr r1, r0, #UNDEFMODE|NOINT
msr cpsr_cxsf, r1 ;UndefMode
ldr sp, =UndefStack
orr r1, r0, #ABORTMODE|NOINT
msr cpsr_cxsf, r1 ;AbortMode
ldr sp, =AbortStack
orr r1, r0, #IRQMODE|NOINT
msr cpsr_cxsf, r1 ;IRQMode
ldr sp, =IRQStack
orr r1, r0, #FIQMODE|NOINT
msr cpsr_cxsf, r1 ;FIQMode
ldr sp, =FIQStack
; orr r1, r0, #SVCMODE ;enable irq,fiq
orr r1, r0, #SVCMODE|NOINT ;disable irq, fiq
msr cpsr_cxsf,r1 ;SVCMode
ldr sp, =SVCStack
;USER mode is not initialized.
;未初始化用户模式栈,程序使用SVC模式
以上代码进入各种模式,对相应模式所使用的堆栈进行初始化
顺序执行接下来的代码
adr r0, ResetEntry
ldr r2, BaseOfROM
cmp r0, r2
ldreq r0, TopOfROM
beq InitRam
执行beq InitRam跳转到初始化Ram的程序段
InitRam
ldr r2, BaseOfBSS
ldr r3, BaseOfZero
0
cmp r2, r3
ldrcc r1, [r0], #4
strcc r1, [r2], #4
bcc %B0
mov r0, #0
ldr r3, EndOfBSS
1
cmp r2, r3
strcc r0, [r2], #4
bcc %B1
其中bcc %B0 表示在无符号小于的条件下,跳转到标号0地址代码处
另 注:
IMPORT |Image$$RO$$Base| ; ROM code start
IMPORT |Image$$RO$$Limit| ; RAM data starts after ROM program
IMPORT |Image$$RW$$Base| ; Pre-initialised variables
IMPORT |Image$$ZI$$Base| ; uninitialised variables
IMPORT |Image$$ZI$$Limit| ; End of variable RAM space
BaseOfROM DCD |Image$$RO$$Base|
TopOfROM DCD |Image$$RO$$Limit|
BaseOfBSS DCD |Image$$RW$$Base|
BaseOfZero DCD |Image$$ZI$$Base|
EndOfBSS DCD |Image$$ZI$$Limit|
继续执行
ldr lr, GotoMain
MOV_PC_LR
其中
GBLS MainEntry
MainEntry SETS "Main"
IMPORT $MainEntry
GotoMain DCD $MainEntry
至此程序跳转到void Main(void)
c语言主函数,执行c语言代码。
细节处以后再更新
文章评论(0条评论)
登录后参与讨论