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 bytes(SD卡,大小为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卡启动吧,尽情闪吧!
- Tiny6410_SD卡启动_闪烁的led裸机程序
- Tiny6410按键轮询方式控制LED的SD卡启动裸机程序
- 2440裸机程序——定时器控制LED灯闪烁
- tiny6410的led裸机程序源代码
- s3c2440的LED点灯裸机C程序
- LED裸机程序(IAR)
- mini2440裸机程序LED
- OK6410裸机程序 ----led
- ARM裸机实现led循环闪烁
- 【单片机】[LED]:LED 不用频率闪烁的程序
- s3c2440裸机程序之----LED
- 中断控制LED裸机程序
- 裸机程序-led流水灯
- mini 2440裸机 LED程序
- TX2440裸机程序之-LED
- S3C6410 LED裸机程序分析
- 【OK6410裸机程序】点亮LED
- 基于mini2440的裸机led程序及其链接脚本分析
- 【引用】〔原创〕Ubuntu Linux 新手入门级基础知识须知
- 开启windows 7的隐藏功能让电脑变成无线路由器
- VMware6安装使用教程
- windows 7使用vmware不能上网问题解决
- VirtualBox使用教程图解
- Tiny6410_SD卡启动_闪烁的led裸机程序
- 解决vs2010无法找到System.Data.OracleClient的引用问题
- 把TextView中的文字添加阴影效果及Style的使用
- 从输入网址到显示网页的过程分析
- linux-1.2.13内核的编译生成和引导
- 在操作系统的右键菜单项中增加项
- <Android入门笔记>第一章 搭建Android开发环境
- Ubuntu 12.04安装教程(图文)
- weak 智能指针