S3C2440---点亮第一盏灯

前提:1、开发板已经有了uboot程序,我用的网上的uboot1.1.6

         2、采用DNW方式下载程序到开发板里面

PS:我用的开发板是TQ2440

程序部分源码:

启动代码----crt0.S

@******************************************************************************

@ Filecrt0.S

@ 功能:通过它转入C程序

@******************************************************************************      

 

.text

.global _start

_start:

            ldr     r0, =0x56000010     @ WATCHDOG寄存器地址

            mov     r1, #0x0                    

            str   r1, [r0]              @ 写入0,禁止WATCHDOG,否则CPU会不断重启

           

            ldr     sp, =1024*4         @ 设置堆栈,注意:不能大于4k, 因为现在可用的内存只有4K

                                        @ nand flash中的代码在复位后会移到内部ram中,此ram只有4K

            bl      main                @ 调用C程序中的main函数

halt_loop:

            b       halt_loop

 

接下来是C语言主函数----main.c

/********************************************************8

* @file                main.c

* @autho               wesley.gao

* @date                2012.11.20

* @version             V1.0.0

* @brief               主程序入口

*********************************************************/

 

 

/*@brief  headfile include*/

//#include"S3C24xx.h"

 

 

/*@brief define*/

#define GPBCON               (*(volatile unsigned long *) 0x56000010)

#define GPBDAT               (*(volatile unsigned long *) 0x56000014)

#define GPBUP                (*(volatile unsigned long *) 0x56000018)

 

 

/*@func area*/

int main(void)

{

       //GPBCON &= (0xfffc03ff);   //17 16 15 14 13 12 11 10 = 00

       GPBCON &= (~(unsigned long)(0xff << (5*2)));

       GPBCON |= (unsigned long)(0x55 << (5*2));

       //GPBCON |= (0x00001400);    //pb5  PB6 PB7 PB8 set output

      

       GPBDAT |= (0x00000060);    //LED1/2 OFF LED 3/4 ON

       return 0;

}

大致工作流程为先运行启动代码,然后跳转到mainC中运行,下面是Makefile文件重点

led_on_c.bin : crt0.S  main.c                                                     1

       arm-linux-gcc -g -c -o crt0.o crt0.S                                             2

       arm-linux-gcc -g -c -o led_on_c.o main.c                                        3

       arm-linux-ld -Ttext 0x30000000 -g  crt0.o led_on_c.o -o led_on_c_elf                4

       arm-linux-objcopy -O binary -S led_on_c_elf led_on_c.bin                          5

       arm-linux-objdump -D -m arm  led_on_c_elf > led_on_c.dis                        6

clean:                                                                         7

       rm -f led_on_c.dis led_on_c.bin led_on_c_elf *.o                                  8

我们的目标是生成led_on_c.bin文件,它依赖于crt0.S main.c两个文件

一个可执行文件生成过程包括:预处理编译汇编链接

2—利用gcc命令生成crt0.o文件

由于可执行bin文件生成需要二进制_elf文件,它需要将所有的.o文件链接而成所以,2 3语句是生成各个文件相关的.o文件   4是利用.o输出_elf文件 arm-linux-ld指令为链接所有的.o文件, -Ttext 0x30000000为程序启动时地址为0x30000000?这里参考韦东山教程,但是实际发现用uboot下载无论是到SDRAM还是下载到nandflash 这条语句的地址不起作用?

 

好了完成上面的步骤我们得到了led_on_c.bin文件,现在通过uboot使用DNW下载到SDRAM或者使用‘a’命令下载到NAND FLASH都可以看到LED3/4亮了 LED1/2灭了唯一的区别是如果下载到SDRAM中掉电擦除而下载到NAND FLASH中掉电数据保存。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值