Tiny6410_SD卡启动_闪烁的led裸机程序

来源:互联网 发布:淘宝助理怎么发货 编辑:程序博客网 时间:2024/05/01 02:33

Tiny6410_闪烁的led裸机程序(怀着成功的喜悦,记下这兴奋的瞬间)

       一直想弄个裸机程序,试验一下开发板,也为了练习怎么下载程序,因为友善送的dnw不能很好的支持win7 64位,又因为不想老是格式化Nandflash(2G)再重写,裸机程序太小了,为了一个小程序格Nand觉得划不来,就想从SD卡启动试试(但老是插拔也不方便,但还是先这样试着用用吧)。

       一、我的应用环境:win7旗舰版64位 虚拟机下运行debian 6 (全是D版,不知道微软是不是要起诉我)

       二、写SD卡用的是linux的 dd命令

      原理如下:从SD卡启动时,会把SD卡总容量-18的扇区开始的8K空间加载到0x0C000000处运行,所以把我们的裸机程序bin文件写到总容量-18扇区即可。

     烧写方法:

       (1)查看我们SD在系统中的节点以及大小信息:sudo fdisk -l

        root@archermind-desktop:/# sudofdisk -l

       Disk /dev/sda: 500.1 GB, 500107862016 bytes
       255 heads, 63 sectors/track, 60801cylinders
       Units = cylinders of 16065 * 512 =8225280 bytes
       Sector size (logical/physical): 512bytes / 512 bytes
       I/O size (minimum/optimal): 512 bytes/ 512 bytes
       Disk identifier: 0xc74ff3f5

       Device Boot     Start        End      Blocks   Id  System
        /dev/sda1  *          1       12749  102406311    7  HPFS/NTFS
       /dev/sda2          12750       25498  102406342+   7  HPFS/NTFS
       /dev/sda3          25499       60802  283573249    5  Extended
       /dev/sda5          25499       37656   97655808   83  Linux
       /dev/sda6          37656       38143    3905536   82  Linux swap / Solaris
       /dev/sda7           38143      60802   182009856   83  Linux

         Disk /dev/sdb: 3980 MB, 3980394496 bytesSD卡,大小为3980394496
         9heads, 8 sectors/track, 107975 cylinders
         Units = cylinders of 72 * 512= 36864 bytes
        Sector size (logical/physical): 512bytes / 512 bytes
        I/O size (minimum/optimal): 512bytes / 512 bytes
        Disk identifier: 0x00000000

       Device Boot     Start        End      Blocks   Id  System
       /dev/sdb1            114      107976    3883008    b  W95 FAT32
        /dev/sdb3            346         346          0    0  Empty
        Partition 3 does not end on cylinderboundary.

        (2)烧写裸机程序bin文件到/dev/sdb:

         使用dd命令,dd if="bin文件" of=dev/sdb seek=3980385280(3980394496-18*512)bs=1

          注意of中是sdb,不带数字,带数字的是分区。

 

        三、开始从网上找的程序如下(网上原名:tiny6410_1111版的流水灯程序).ARM_tiny6410开发板_裸机之完整的流水灯程序:

 

主程序如下:

 

.globl _start

_start:

 

/* 硬件相关的设置 */

   /* 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]

/* 设置GPKCON让GPK4/5/6/7作为输出引脚 */

       ldr r1, =0x7F008800

       ldr r0, =0x11110000

       str r0, [r1]

 

/* 设置GPKDAT让GPK3输出0 */

       ldr r1, =0x7F008808

       ldr r0, =0xFFEF

       mov r3, #0

 

loop:     

       str r0, [r1]

       lsl r0, r0, #1

       add r3, r3,#1

       cmp r3, #3

       bleq lop1

       bl delay

       b loop

      

lop1:

       ldr r0, =0xFFEF

       mov r3, #0

 

delay:

       mov r2, #0x10000

delay_loop:

       sub r2, r2, #1

       cmp r2, #0

       bne delay_loop          

       mov pc, lr

 

halt:

       b halt    

 

Makefile文件内容:

 

led.bin: start.o

       arm-linux-ld-Ttext 0 -o led.elf start.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

 

clean:

       rm*.o led.elf led.bin led.dis

 

编译情况:

 

不知道是我笨还是有些地方弄错,在我的板子就是不运行。没办法,我就想简单点,就是弄个全闪烁的Led吧。想到就自己琢磨着改程序(呵呵,我对汇编还不是太熟悉,只是略知一二)。改为如下:

 

.globl _start

_start:

 

/* 硬件相关的设置 */

   /* 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]

/* 设置GPKCON让GPK4/5/6/7作为输出引脚 */

       ldr r1, =0x7F008800

       ldr r0, =0x11112222

       str r0, [r1]

 

/* 设置GPKDAT让GPK3输出0 */

       ldr r1, =0x7F008808

       ldr r0, =0x00000000

       str r0, [r1]

 

cycle:

       mvn r0, r0

 

delay:

       ldr r2,=0x004fffff

 

delay_loop:

       sub r2, r2, #1

       cmp r2, #0

       bne delay_loop          

       b cycle

 

编译后运行,四个灯倒是全亮了,但不会闪,于是又找原因,发现在cycle循环中只是对r0取反,但没更新r1,也就是GPKDAT的值。赶紧在mvn r0,r0下行加上一句str r0, [r1]再试一试 OK,四盏绿色的Led齐刷刷地闪着,兴奋呀,终于第一个裸机程序成功了。但是请高手赐教,如何通过Tiny6410(好像没有dd命令)直接把裸机程序写入SD卡,省得老是插拔??

最后还是把完整的程序记述如下:

 

将如下代码保存为:start.S

.globl _start

_start:

 

/* 硬件相关的设置 */

   /* 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]

/* 设置GPKCON让GPK4/5/6/7作为输出引脚 */

       ldr r1, =0x7F008800

       ldr r0, =0x11112222

       str r0, [r1]

 

/* 设置GPKDAT让GPK3输出0 */

       ldr r1, =0x7F008808

       ldr r0, =0x00000000

       str r0, [r1]

 

cycle:

       mvn r0, r0

       str r0, [r1]

 

delay:

       ldr r2,=0x004fffff

 

delay_loop:

       sub r2, r2, #1

       cmp r2, #0

       bne delay_loop          

       b cycle

 

将以下代码保存为:Makefile

 

led.bin: start.o

       arm-linux-ld-Ttext 0 -o led.elf start.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

 

clean:

       rm*.o led.elf led.bin led.dis

 

将以上两个文件放在同一个目录,进入此目录,在linux环境下执行make,生成led.bin。然后如上图执行dd命令(先把SD卡插入机器哟,并让linux识别,我用的一个TF卡加一个SD卡套,也行的。TF卡就是手机卡)。 好了,把SD卡插在Tiny6410卡槽里,从SD卡启动吧,尽情闪吧!