ldr r0,=UPLLCON
ldr r1,=((U_MDIV<<12)+(U_PDIV<<4)+U_SDIV)
str r1,[r0]
(配置UPLL,一般UPLL的值设置为48MHZ,或者96MHZ,因为一般较难找到一个合适的PLL值,所以手册上推荐了一些。本程序中有如下宏定义:#define UCLK 48000000(在option.h文件中),则对应手册上的推荐值,MDIV=56,PDIV=2,SDIV=2)
(在option.inc文件中又有如下代码,通过这段代码已经确定了U_MDIV,U_PDIV ,U_SDIV值,那么上面的代码就是将相应分频值写入到UPLLCON。详细的内容去看数据手册的第7章,时钟与电源管理部分。)
[ UCLK = 48000000
U_MDIV EQU 56 ;Fin=12.0MHz Fout=48MHz
U_PDIV EQU 2
[ CPU_SEL = 32440001
U_SDIV EQU 2 ; 2440A(我们设置的是这个值,因为用的芯片是S3C2440A)
|
U_SDIV EQU 1 ; 2440X
]
]
程序继续执行:
nop
nop
nop
nop
nop
nop
nop
这里面插入了7个nop,在设置完UPLLCON寄存器后,需要至少延时7-clocks,等待硬件的配置完成。
;Configure MPLL
ldr r0,=MPLLCON
ldr r1,=((M_MDIV<<12)+(M_PDIV<<4)+M_SDIV) ;Fin=16.9344MHz
str r1,[r0]
接下来配置MPLLCON寄存器,与UPLLCON部分相同,优龙2440的板子主频是400MHZ。
[ FCLK = 400000000
CLKDIV_VAL EQU 5 ;1:4:8
M_MDIV EQU 92 ;Fin=12.0MHz Fout=400MHz
M_PDIV EQU 1
[ CPU_SEL = 32440001
M_SDIV EQU 1 ; 2440A
|
M_SDIV EQU 0 ; 2440X
]
]
则M_MDIV=92,M_PDIV=1,M_SDIV=1.本程序段将这几个值写入到了MPLLCON寄存器。
;Check if the boot is caused by the wake-up from SLEEP mode.
ldr r1,=GSTATUS2
ldr r0,[r1]
tst r0,#0x2
;In case of the wake-up from SLEEP mode, go to SLEEP_WAKEUP handler.
bne WAKEUP_SLEEP
检查引导程序是否是从休眠模式被唤醒的,如果是的话,就跳转到相应的程序段进行处理。
这里面用到了一个tst指令。首先了解一下这个指令。
tst是位测试指令,根据测试结果更新CPSR中的相应条件标志位,以便后面的指令根据相应的条件标志来判断是否执行。
再来看GSTATUS2这个寄存器,查询芯片手册,GSTATUS2是复位状态寄存器,本程序测试的是它的第1位(0010),“Boot is caused by wakeup reset in sleep mode”,这个标志代表引导程序是从休眠模式被唤醒的。由于我这里并不是从休眠模式唤醒的,所以程序没有跳转,继续顺序执行。
;Set memory control registers
;ldr r0,=SMRDATA
adrl r0, SMRDATA ;be careful!, hzh
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
mov r0, #&1000
1
subs r0, r0, #1
bne %B1
这里是设置存储器控制寄存器。首先还是了解一下adrl指令,它是中等范围的地址读取指令,比ADR伪指令可以读取更大范围的地址。SMRDATA是一个标号,将这个标号处的地址加载到了r0。BWSCON是总线宽度与等待控制寄存器,将这个寄存器的地址加载到了r1。然后将SMRDATA+52地址值加载到r2,这个地址是SMRDATA的尾地址。在SMRDATA地址处存放的是用DCD指令分配的一定大小的字内存单元,这段内存存放的就是与存储器相关的控制寄存器的配置参数。再来看BWSCON的地址是0x48000000,然后是BANKCON0(Bank0 控制寄存器)的地址是0x48000004,BANKCON1(Bank0 控制寄存器)的地址是0x48000008,以此类推,一直到BANKCON7的地址是0x48000020。接着是REFRESH(SDRAM 刷新控制寄存)地址是:0x48000024,BANKSIZE(可调的bank 大小寄存器)地址是:0x48000028,MRSRB6(模式寄存器集寄存器bank6)地址是:0x4800002C,MRSRB7(模式寄存器集寄存器bank7)地址是:0x48000030。上面这些寄存器都是存储器控制的相关寄存器,地址全部连续,相差0x04. 那么现在知道了为什么ldr r3, [r0], #4,str r3, [r1], #4,这两段代码,先将SMRDATA
本文详细介绍了S3C2440A芯片的时钟配置过程,包括UPLL和MPLL的设置方法及注意事项。解析了相关寄存器的含义及其配置参数,并解释了配置时的延时原因。
2518

被折叠的 条评论
为什么被折叠?



