花了一天的时间,终于成功把我的led给点亮了。程序参考《嵌入式linux完全开发手册》
本程序是由crt0.S,led_on_c.c,Makefile三个文件组成 。其中crt0.S文件是程序入口,完成设置指针功能,然后程序就设置到led_on_c.c文件中的main函数运行。
以下为crt0.S程序
@*************************************************************************** ***
2 @ File:crt0.S
3 @ 功能:通过它转入C程序
4 @*************************************************************************** ***
5
6 .text
7 .global _start
8 _start:
9 ldr r0, =0x7E004000 @ WATCHDOG寄存器地址
10 mov r1, #0x0
11 str r1, [r0] @ 写入0,禁止WATCHDOG,否则CPU会不断
重启
12
13 ldr sp, =4*1024 @ 设置堆栈,注意:不能大于4k, 因为现> 在可用的内存只有4K
14 @ nand flash中的代码在复位后会移到内
部ram中,此ram只有4K
15 bl main @ 调用C程序中的main函数
16 halt_loop:
17 b halt_loop
~
程序注释:
1、我的WATCHDOG寄存器地址是WTCON地址,参照S3C6410手册,得知其地址为0x7E004000;
2、在设置堆栈的时候,我完全是参照书上的,本来想写自己的SDRAM地址+1024*4的,但是不明白,俺是菜鸟,就囫囵吞枣吧。
希望能懂的朋友不吝赐教。
以下为led_on_c.c程序:
#define GPMCON (*(volatile unsigned long *)0x7F008820)
2 #define GPMDAT (*(volatile unsigned long *)0x7F008824)
3
4 int main()
5 {
6 GPMCON = 0x00000001; // 设置GPM0为输出口, 位[3:0]=0b0001
7 GPMDAT = 0x00000000; // GPM输出0,LED1点亮
8
9 return 0;
10 }
11
程序注释:
1、TE6410开发板,共有4个LED,连接在GPM0、GPM1、GPM2、GPM3因此对GPM操纵即可实现控制LED。
参考S3C6410手册,得知GPMCON的地址为0x7F008820,GPMDAT 地址为0x7F008824;
2、GPMCON = 0x00000001; // 设置GPM0为输出口,也就是控制该GM0口为输出口;
3、GPMDAT = 0x00000000; // GPM输出0,LED0点亮。实际上我的是低电平熄灭,高电平点亮。但是led一开始就亮着的。。。
以下为Makefile:
1 led_on_c.bin : crt0.S led_on_c.c
2 arm-linux-gcc -g -c -o crt0.o crt0.S
3 arm-linux-gcc -g -c -o led_on_c.o led_on_c.c
4 arm-linux-ld -Ttext 0x0000000 -g crt0.o led_on_c.o -o led_on_c_elf
5 arm-linux-objcopy -O binary -S led_on_c_elf led_on_c.bin
6 arm-linux-objdump -D -m arm led_on_c_elf > led_on_c.dis
7 clean:
8 rm -f led_on_c.dis led_on_c.bin led_on_c_elf *.o
程序注释:
1、led_on_c.bin : crt0.S led_on_c.c//此行意义为 目标(led_on_c.bin ):依赖(crt0.S led_on_c.c)
那么就要产生这两个依赖文件
2、arm-linux-gcc -g -c -o crt0.o crt0.S //命令,产生crt0.o文件
3、arm-linux-gcc -g -c -o led_on_c.o led_on_c.c//命令,产生led_on_c.o文件
4、arm-linux-ld -Ttext 0x0000000 -g crt0.o led_on_c.o -o led_on_c_elf//命令,产生led_on_c_elf文件
5、arm-linux-objcopy -O binary -S led_on_c_elf led_on_c.bin//命令,产生led_on_c.bin文件
6 arm-linux-objdump -D -m arm led_on_c_elf > led_on_c.dis//将结果转换为汇编码,放入led_on_c.dis文件中
7 clean:
8 rm -f led_on_c.dis led_on_c.bin led_on_c_elf *.o //没有依赖,当输入make clean时,强制执行8行命令
最后make,就产生了所需要的led_on_c.bin文件。
好,下面是关键。
1、启动DNW,进入uboot状态。(如何进入?就是在开发板以上电的2~3秒内按下空格键,即可看到DNW进入uboot。当然前提是你安装了uboot)
2、敲入命令:DNW c0008000 然后就是回车,
3、会提示你输入data,于是选择USB Port---》transmit---》led_on_c.bin
4、等10秒左右,不管它有没有反应,敲回车键,即可进入uboot minglhang
5、敲入命令:go c0008000
好了,这个时候你就可以看到你的led亮起来了!