在看完尚观的S3C2440嵌入式bootloader视频后,想做有关DRAM的实验,但是发现DRAM配置和Tiny 6410相差甚远,很多方面也无法契合,于是开始在网上找新的讲解有关S3C6410裸机开发的例子,有幸找到了韦东山老师的视频,跟着他讲的开始先做简单的LED实验,在做第三个时候发现一个很明显的问题,就是在提供的源码中调用了delay函数,而却并没有进行相应的时钟设置,所以试了很多次都是只能点亮LED,但却不能实现亮灭控制。
修改的方法如下:
1.增加时钟配置模块:clock.S
#define APLL_LOCK 0x7e00f000
#define MPLL_LOCK 0x7e00f004
#define EPLL_LOCK 0x7e00f008
#define LOCK_TIME 0xffff
#define OTHERS 0x7e00f900
#define CLK_DIV0 0x7e00f020
#define CLK_SRC 0x7e00f01c
.text
.global clock_init
clock_init:
@ set the lock time to max
ldr r0, =LOCK_TIME
ldr r1, =APLL_LOCK
str r0, [r1]
ldr r1, =MPLL_LOCK
str r0, [r1]
ldr r1, =EPLL_LOCK
str r0, [r1]
@ set async mode
ldr r0, =OTHERS
ldr r1, [r0]
bic r1, r1, #0xc0
str r1, [r0]
loop1:
ldr r0, =OTHERS
ldr r1, [r0]
and r1, r1, #0xf00
cmp r1, #0
bne loop1
@ set the divider
#define DIV_VAL ( (0)|(1<<4)|(1<<8)|(1<<9)|(3<<12) )
ldr r0, =CLK_DIV0
ldr r1, =DIV_VAL
str r1, [r0]
@ set APLL, MPLL, EPLL
#define SDIV 1
#define PDIV 3
#define MDIV 266
#define PLL_ENABLE ( 1 << 31 )
#define APLL_VAL ( (SDIV<<0)|(PDIV<<8)|(MDIV<<16)|(PLL_ENABLE) )
#define MPLL_VAL APLL_VAL
#define EPLL0_VAL ( (2<<0)|(1<<8)|(32<<16)|PLL_ENABLE)
#define EPLL1_VAL ( 0 )
#define APLL_CON 0x7e00f00c
#define MPLL_CON 0x7e00f010
#define EPLL_CON0 0x7e00f014
#define EPLL_CON1 0x7e00f018
ldr r0, =APLL_CON
ldr r1, =APLL_VAL
str r1, [r0]
ldr r0, =MPLL_CON
ldr r1, =MPLL_VAL
str r1, [r0]
ldr r0, =EPLL_CON0
ldr r1, =EPLL0_VAL
str r1, [r0]
ldr r0, =EPLL_CON1
ldr r1, =EPLL1_VAL
str r1, [r0]
@ select the source
ldr r0, =CLK_SRC
mov r1, #7
str r1, [r0]
mov pc, lr
2.在start.S中调用时钟初始化函数
.globl _start
_start:
/* 硬件相关的设置 : 把外设的基地址告诉CPU */
/* Peri port setup */
ldr r0, =0x70000000
orr r0, r0, #0x13
mcr p15,0,r0,c15,c2,4 @ 256M(0x70000000-0x7fffffff)
/* 关看门狗 */
/* 往WTCON(0x7E004000)写0 */
ldr r0, =0x7E004000
mov r1, #0
str r1, [r0]
bl clock_init/*在此进行时钟初始化*/
/* 设置栈 */
ldr sp, =8*1024
bl xxxxx /* 调用C函数 */
halt:
b halt
3.修改Makefile文件如下:
led.bin: start.o led.o clock.o
arm-linux-ld -Ttext 0 -o led.elf start.o clock.o led.o
arm-linux-objcopy -O binary led.elf led.bin
arm-linux-objdump -D led.elf > led.dis
start.o : start.S
arm-linux-gcc -o start.o start.S -c
clock.o: clock.S
arm-linux-gcc -o clock.o clock.S -c
led.o : led.c
arm-linux-gcc -o led.o led.c -c
clean:
rm *.o led.elf led.bin led.dis
4.make clean;make
下载led.bin后执行,可以发现此次实现隔一段时间后LED1~LED4亮灭。