嵌入式bootloader开发之十-------裸机程序LED开发(Tiny 6410)

在看完尚观的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亮灭。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值