原创 蓝海微新2410开发板启动代码流程与分析

2009-9-16 15:41 2859 7 7 分类: MCU/ 嵌入式

开电复位,程序首先跳转到
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

 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语言代码。
细节处以后再更新


 



  

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
我要评论
0
7
关闭 站长推荐上一条 /4 下一条