我的第一个led实验--基于arm6410

来源:互联网 发布:张爱玲一生 知乎 编辑:程序博客网 时间:2024/05/20 13:19

花了一天的时间,终于成功把我的led给点亮了。程序参考《嵌入式linux完全开发手册》

本程序是由crt0.Sled_on_c.cMakefile三个文件组成 。其中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开发板,共有4LED,连接在GPM0GPM1GPM2GPM3因此对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亮起来了!