微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > S3C2410启动代码详解(3)

S3C2410启动代码详解(3)

时间:11-11 来源:互联网 点击:
;================================================================================

; 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存储单元里面

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top