您的位置 首页 电路

S3C2410发动代码详解(3)

;================================================================================;ENTRY系统上电后经过一个bRes

;================================================================================

; ENTRY 体系上电后经过一个b ResetHandler就跳转到此处来。在此完结一些相关的软硬件装备作业

1. 屏蔽一切中止,关看门狗。
2. 根据作业频率设置PLL寄存器
3. 初始化存储操控相关寄存器
4. 初始化各形式下的栈指针
5. 设置缺省中止处理函数
6. 将数据段复制到RAM中,将零初始化数据段清零
7. 跳转到C 言语Main进口函数中
;================================================================================
ResetHandler
ldrr0,=WTCON ;watch dog disable关看门狗
ldrr1,=0x0
strr1,[r0]

ldrr0,=INTMSK
ldrr1,=0xffffffff ;all interrupt disable屏蔽一切中止
strr1,[r0]

ldrr0,=INTSUBMSK
ldrr1,=0x3ff ;all sub interrupt disable屏蔽一切子中止
strr1,[r0]

[ {FALSE}//;是得有些表明了,该点点LED灯了,不过被FALSE掉了.
; rGPFDAT = (rGPFDAT & ~(0xf<<4)) | ((~data & 0xf)<<4);
; Led_Display
ldrr0,=GPFCON
ldrr1,=0x5500
strr1,[r0]
ldrr0,=GPFDAT
ldrr1,=0x10
strr1,[r0]
]

;To reduce PLL lock time, adjust the LOCKTIME register. 为了削减PLL的lock time, 调整LOCKTIME寄存器.
ldrr0,=LOCKTIME//LOCKTIME为确定计数定时器,即设置PLL安稳过渡时刻,一般大于150uS
ldrr1,=0xffffff
strr1,[r0]

;=================================================================================

上电复位时的时钟行为。晶振在几毫秒内开端振动。当OSC时钟安稳后,PLL根据默许PLL设置开端收效,可是一般这个时分是不安稳的,因此在软件重新装备PLLCON寄存器之前FCLK直接运用Fin而不是MPLL,即运用户不期望改动PLLCON的默许值,用户也应该履行一边写PLLCON操作。

;这儿介绍一下计算公式
;Fpllo=(m*Fin)/(p*2^s)
;m=MDIV+8,p=PDIV+2,s=SDIV
;Fpllo有必要大于20Mhz小于66Mhz
;Fpllo*2^s有必要小于170Mhz
;如下面的PLLCON设定中的M_DIV P_DIV S_DIV是取自option.h中M_DIV=0x5c=92 P_DIV=0x4 S_DIV=0x2

所以Fpllo=(m*Fin)/(p*2^s)=(92+8)*12M/(4+2)*2^2=50M

;==================================================================================
[ PLL_ON_START
;Configure MPLL
ldrr0,=MPLLCON//M_DIV=0x5c=92 P_DIV=0x4 S_DIV=0x2
ldrr1,=((M_MDIV<<12)+(M_PDIV<<4)+M_SDIV) ;Fin=12MHz,Fout=50MHz
strr1,[r0]
;Configure UPLL
ldrr0,=UPLLCON
ldrr1,=((U_MDIV<<12)+(U_PDIV<<4)+U_SDIV) ;Fin=12MHz,UPLLout=48MHz
strr1,[r0]
]

;Check if the boot is caused by the wake-up from POWER_OFF mode.
ldrr1,=GSTATUS2
ldrr0,[r1]
tstr0,#0x2
;In case of the wake-up from POWER_OFF mode, go to POWER_OFF_WAKEUP handler.
bneWAKEUP_POWER_OFF

EXPORT StartPointAfterPowerOffWakeUp
StartPointAfterPowerOffWakeUp

;====================================================================================

//设置内存操控器等寄存器的值,由于这些寄存器是接连摆放的,所以选用如下方法对这些 ;寄存器进行接连设置.其间用到了SMRDATA的数据,这在代码后边有界说;Set memory control registers

;=====================================================================================

ldrr0,=SMRDATA
ldrr1,=BWSCON ;BWSCON Address
addr2, r0, #52 ;End address of SMRDATA,共13个DCD,52个字节
0
ldrr3, [r0], #4
strr3, [r1], #4
cmpr2, r0
bne%B0 //上面这段小程序将后边界说的数据复制到相关内存操控寄存器

;Initialize stacks
blInitStacks//调用仓库初始化子程序
;==================================================================================

关于反常中止体系:反常中止矢量表(每个表项占4个字节) 下面是中止向量表 一旦体系运转时有中止产生 即便移植了操作体系 如linux 处理器现已把操控权交给了操作体系 一旦产生中止 处理器仍是会跳转到从0x0开端
;中止向量表中某个中止表项(根据中止类型)开端履行;详细中止向量布局请参阅s3c44b0 spec 例如 adc中止向量为 0x000000c0下面对应表中第49项方位 向量地址0x0+4*(49-1)=0x000000c0
2410反常中止体系中有两张中止搬运表,经过二重搬运才跳到中止处理程序。第一张中止向量表由硬件决议,所在区域为ROM(flash),地址空间从0X00开端,其间0X00-0X1C为反常向量进口地址。另一张中止向量表在RAM 中,能够随意改,其方位在程序衔接后才定。ARM7的内核实际上只要8个(1个保存)反常向量,关于其他一切很多的中止源,ARM7 的内核是经过IRQ或FRQ的软件查询中止状况寄存器的位来取得ISR的开端地址。
;===================================================================================
; Setup IRQ handler //;设置缺省中止处理函数
ldrr0,=HandleIRQ //;This routine is needed;//运用ldr伪指令装载HandleIRQ的地址到r0中
ldrr1,=IsrIRQ //If there isnt subs pc,lr,#4 at 0x18, 0x1c;//运用ldr伪指令装载IsrIRQ的地址到r1中
strr1,[r0] //把r1的值写到r0指向的存储地址中,把IsrIRQ这个函数的地址写入到HandleIRQ存储单元里边

;======================================================================================

;Copy and paste RW data/zero initialized data

//以下程序段将加载哉中的数据段RW复制到运转域的ram中 将ZI段中的零初始化数据段清零

//跳入C言语的main函数履行到这步完毕bootloader开端引导完毕

程序先把 ROM 里|Image$$RO$$Limt|开端的 RW 初始数据复制到 RAM 里边|Image$$RW$$Base|开端的地址,当RAM这边的方针地址抵达|Image$$ZI$$Base|后就表明RW区的完毕和ZI区的开端,接下去就对这片ZI区进行清零操作,直到遇到完毕地址|Image$$ZI$$Limit|。

;======================================================================================
ldrr0, =|Image$$RO$$Limit| //Get pointer to ROM data,rom中的RW数据源的开端地址
ldrr1, =|Image$$RW$$Base| //and RAM copyRW区在RAM里的履行区开端地址
ldrr3, =|Image$$ZI$$Base|//ZI区在RAM里边的开端地址

;Zero init base => top of initialised data查看装载地址和履行地址是否相同
cmpr0, r1 ; Check that they are different
beq%F2 ;//若持平则跳转到2,相同,则不复制该区间,初始化零数据区
1
cmpr1, r3 ; Copy init data;//假如r0不等于r1,r1和r3比较,Copy init data,不相同,将装载区复制到履行区
ldrccr2, [r0], #4 ;–> LDRCC r2, [r0] + ADD r0, r0, #4当无符号数r1strccr2, [r1], #4 ;–> STRCC r2, [r1] + ADD r1, r1, #4
bcc%B1 ;//若持平则跳转到1,相同,则不复制该区间,初始化零数据区

2
ldrr1, =|Image$$ZI$$Limit| ; Top of zero init segment,ZI区在RAM里边的完毕地址后边的一个地址
movr2, #0
3
cmpr3, r1 ; Zero init
strccr2, [r3], #4 //当ZI区的开端地址未达等于完毕地址时,持续清0
bcc%B3 ;//当无符号数r3

[ :LNOT:THUMBCODE
blMain ;Dont usemain()because……跳到Main()主函数,留意大小写
b.
]

[ THUMBCODE ;for start-up code for Thumb mode
orrlr,pc,#1
bxlr
CODE16
blMain ;Dont use main() because ……
b.
CODE32
]

;function initializing stacks
InitStacks
;Dont use DRAM,such as stmfd,ldmfd……
;SVCstack is initialized before
;Under toolkit ver 2.5, msr cpsr,r1 can be used instead of msr cpsr_cxsf,r1
mrsr0,cpsr;//读取CPSR的值,R0=CPSR,CPSR为当时程序状况寄存器
bicr0,r0,#MODEMASK;//R0=R0&(~MODEMASK),MODEMASK=0X1F,也便是低五位清0
orrr1,r0,#UNDEFMODE|NOINT;//R1=R0|(MODEMASK|NONINT),R1为未界说形式,也便是低八位为11X11011
msrcpsr_cxsf,r1;UndefMode;//写把R1的值写到状况寄存器cpsr_cxsf(也便是CPSR),UndefMode
ldrsp,=UndefStack;//设置未界说形式下的仓库指针

orrr1,r0,#ABORTMODE|NOINT
msrcpsr_cxsf,r1;AbortMode
ldrsp,=AbortStack

orrr1,r0,#IRQMODE|NOINT
msrcpsr_cxsf,r1;IRQMode
ldrsp,=IRQStack

orrr1,r0,#FIQMODE|NOINT
msrcpsr_cxsf,r1;FIQMode
ldrsp,=FIQStack

bicr0,r0,#MODEMASK|NOINT
orrr1,r0,#SVCMODE
msrcpsr_cxsf,r1;SVCMode
ldrsp,=SVCStack

//USER mode has not be initialized.留意:不要切换到User形式进行User形式的仓库设置,由于进入User形式后就

//不能再操作CPSR回到其他形式了,或许会对接下去的程序履行形成影响

movpc,lr //仓库初始化完结回来
;The LR register wont be valid if the current mode is not SVC mode.

;以下是上面说到的对存储寄存器初始化的数据map,共13个DCD

LTORG

SMRDATA DATA
; Memory configuration should be optimized for best performance
; The following parameter is not optimized.
; Memory access cycle parameter strategy
; 1) The memory settings is safe parameters even at HCLK=75Mhz.
; 2) SDRAM refresh period is for HCLK=75Mhz.

DCD (0+(B1_BWSCON<<4)+(B2_BWSCON<<8)+(B3_BWSCON<<12)+(B4_BWSCON<<16)+(B5_BWSCON<<20)+(B6_BWSCON<<24)+(B7_BWSCON<<28))//BAN1,6,7为32位数据完,其他除0外为16
DCD ((B0_Tacs<<13)+(B0_Tcos<<11)+(B0_Tacc<<8)+(B0_Tcoh<<6)+(B0_Tah<<4)+(B0_Tacp<<2)+(B0_PMC));GCS0;BANK0的相关拜访形式及各拜访周期设置, 各位界说可参阅memcfg.inc文件
DCD ((B1_Tacs<<13)+(B1_Tcos<<11)+(B1_Tacc<<8)+(B1_Tcoh<<6)+(B1_Tah<<4)+(B1_Tacp<<2)+(B1_PMC)) ;GCS1
DCD ((B2_Tacs<<13)+(B2_Tcos<<11)+(B2_Tacc<<8)+(B2_Tcoh<<6)+(B2_Tah<<4)+(B2_Tacp<<2)+(B2_PMC)) ;GCS2
DCD ((B3_Tacs<<13)+(B3_Tcos<<11)+(B3_Tacc<<8)+(B3_Tcoh<<6)+(B3_Tah<<4)+(B3_Tacp<<2)+(B3_PMC)) ;GCS3
DCD ((B4_Tacs<<13)+(B4_Tcos<<11)+(B4_Tacc<<8)+(B4_Tcoh<<6)+(B4_Tah<<4)+(B4_Tacp<<2)+(B4_PMC)) ;GCS4
DCD ((B5_Tacs<<13)+(B5_Tcos<<11)+(B5_Tacc<<8)+(B5_Tcoh<<6)+(B5_Tah<<4)+(B5_Tacp<<2)+(B5_PMC)) ;GCS5
DCD ((B6_MT<<15)+(B6_Trcd<<2)+(B6_SCAN)) ;GCS6
DCD ((B7_MT<<15)+(B7_Trcd<<2)+(B7_SCAN)) ;GCS7
DCD ((REFEN<<23)+(TREFMD<<22)+(Trp<<20)+(Trc<<18)+(Tchr<<16)+REFCNT)//;设置刷新周期

DCD 0x32 ; ;SCLK power saving mode, ARM core burst disable, BANKSIZE 128M/128M

DCD 0x30 ;MRSR6 CL=3clk CL:CAS latency
DCD 0x30 ;MRSR7
; DCD 0x20 ;MRSR6 CL=2clk
; DCD 0x20 ;MRSR7

//下面是对ram区域map的界说;这儿界说了处理器作业于各形式的仓库区在ram中map.

ALIGN//字对齐
AREA RamData, DATA, READWRITE

^ _ISR_STARTADDRESS //^=map
HandleReset # 4 //#=field
HandleUndef # 4
HandleSWI # 4
HandlePabort # 4
HandleDabort # 4
HandleReserved # 4
HandleIRQ # 4
HandleFIQ # 4

;Dont use the label IntVectorTable,
;The value of IntVectorTable is different with the address you think it may be.
;IntVectorTable
HandleEINT0 # 4
HandleEINT1 # 4
HandleEINT2 # 4
HandleEINT3 # 4
HandleEINT4_7# 4
HandleEINT8_23# 4
HandleRSV6# 4
HandleBATFLT # 4
HandleTICK # 4
HandleWDT# 4
HandleTIMER0 # 4
HandleTIMER1 # 4
HandleTIMER2 # 4
HandleTIMER3 # 4
HandleTIMER4 # 4
HandleUART2 # 4
HandleLCD # 4
HandleDMA0# 4
HandleDMA1# 4
HandleDMA2# 4
HandleDMA3# 4
HandleMMC# 4
HandleSPI0# 4
HandleUART1# 4
HandleRSV24# 4
HandleUSBD# 4
HandleUSBH# 4
HandleIIC # 4
HandleUART0 # 4
HandleSPI1 # 4
HandleRTC # 4
HandleADC # 4

END

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/fangan/dianlu/274382.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部