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

来源:互联网 发布:淘宝u站怎么加入 编辑:程序博客网 时间:2024/06/06 09:04

在看完尚观的S3C2440嵌入式bootloader视频后,想做有关DRAM的实验,但是发现DRAM配置和Tiny 6410相差甚远,很多方面也无法契合,于是开始在网上找新的讲解有关S3C6410裸机开发的例子,有幸找到了韦东山老师的视频,跟着他讲的开始先做简单的LED实验,在做第三个时候发现一个很明显的问题,就是在提供的源码中调用了delay函数,而却并没有进行相应的时钟设置,所以试了很多次都是只能点亮LED,但却不能实现亮灭控制。

修改的方法如下:

1.增加时钟配置模块:clock.S

#define APLL_LOCK0x7e00f000#define MPLL_LOCK0x7e00f004#define EPLL_LOCK0x7e00f008#define LOCK_TIME0xffff#define OTHERS0x7e00f900#define CLK_DIV00x7e00f020#define CLK_SRC0x7e00f01c.text.global clock_initclock_init:@ set the lock time to maxldr r0, =LOCK_TIMEldr r1, =APLL_LOCKstr r0, [r1]ldr r1, =MPLL_LOCKstr r0, [r1]ldr r1, =EPLL_LOCKstr r0, [r1]@ set async modeldr r0, =OTHERSldr r1, [r0]bic r1, r1, #0xc0str r1, [r0]loop1:ldr r0, =OTHERSldr r1, [r0]and r1, r1, #0xf00cmp r1, #0bne loop1@ set the divider#define DIV_VAL( (0)|(1<<4)|(1<<8)|(1<<9)|(3<<12) )ldr r0, =CLK_DIV0ldr r1, =DIV_VALstr r1, [r0]@ set APLL, MPLL, EPLL#define SDIV1#define PDIV3#define MDIV266#define PLL_ENABLE( 1 << 31 )#define APLL_VAL( (SDIV<<0)|(PDIV<<8)|(MDIV<<16)|(PLL_ENABLE) )#define MPLL_VALAPLL_VAL#define EPLL0_VAL( (2<<0)|(1<<8)|(32<<16)|PLL_ENABLE)#define EPLL1_VAL( 0 )#define APLL_CON0x7e00f00c#define MPLL_CON0x7e00f010#define EPLL_CON00x7e00f014#define EPLL_CON10x7e00f018ldr r0, =APLL_CONldr r1, =APLL_VALstr r1, [r0]ldr r0, =MPLL_CONldr r1, =MPLL_VALstr r1, [r0]ldr r0, =EPLL_CON0ldr r1, =EPLL0_VALstr r1, [r0]ldr r0, =EPLL_CON1ldr r1, =EPLL1_VALstr r1, [r0]@ select the source ldr r0, =CLK_SRCmov r1, #7str 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, =0x7E004000mov r1, #0str r1, [r0]bl clock_init/*在此进行时钟初始化*//* 设置栈 */ldr sp, =8*1024bl xxxxx   /* 调用C函数 */halt:b halt

3.修改Makefile文件如下:

led.bin: start.o led.o clock.oarm-linux-ld -Ttext 0 -o led.elf start.o clock.o led.oarm-linux-objcopy -O binary led.elf led.binarm-linux-objdump -D led.elf > led.disstart.o : start.Sarm-linux-gcc -o start.o start.S -cclock.o: clock.Sarm-linux-gcc -o clock.o clock.S -cled.o : led.carm-linux-gcc -o led.o led.c -cclean:rm *.o led.elf led.bin led.dis
4.make clean;make

下载led.bin后执行,可以发现此次实现隔一段时间后LED1~LED4亮灭。

原创粉丝点击