wangcong02345的专栏

没有经过实践的东西是不会被真正理解的

bootloader---9.点亮led

刚开始学习arm开发的时候看的是《S3c2410完全开发流程》,是非常不错的开发入门教程,表达一下对作者的崇高够意,但美中不足的是书中有些寄存器只是针对于2410的,而现在我手中的板子是2440的。虽然道理是相通的,但是如果能有2440的就更好了,谁让咱是新手呢?(什么是新手?新手就是板子必须是一样的,例子完全是一样的才能学习)

一、环境搭建:

1.1 windows XP:

       DNW : 下载编写好的u-boot

       SecureCRT: 显示串口打印消息

       vmware + ubuntu 10.10

    硬件: tq2440 + 电源

           双母头串口线 + usb转串口

        usb下载线   

       虚拟机中,<span times="" new="" roman";="" mso-hansi-font-family:"times="" roman";mso-bidi-font-family:"times="" mso-font-kerning:1.0pt;mso-ansi-language:en-us;mso-fareast-language:zh-cn;="" mso-bidi-language:ar-sa"="" style="word-wrap: break-word; font-size: 10.5pt; font-family: 宋体;">直接解压EABI-4.3.3_EmbedSky_20091210.tar.bz2/目录下,不用设置环境变量。在Makefile中把编译工具链的路径写死就行了。

二、汇编写的点亮LED

2.1 start.S

点击(此处)折叠或打开

  1. .text
  2. .global _start
  3. _start:
  4. ldr r0, =0x56000010
  5. ldr r1, =0x00015400
  6. str r1, [r0]

  7. ldr r0, =0x56000014
  8. mov r1, #0
  9. str r1, [r0]

  10. loop:
  11. b loop
2.2 Makefile

点击(此处)折叠或打开

  1. CROSS_COMPILE = /opt/EmbedSky/crosstools_3.4.5_softfloat/gcc-3.4.5-glibc-2.3.6/arm-linux/bin/ arm-linux-

  2. AS = $(CROSS_COMPILE)as
  3. LD = $(CROSS_COMPILE)ld
  4. CC = $(CROSS_COMPILE)gcc
  5. CPP = $(CC) -E
  6. AR = $(CROSS_COMPILE)ar
  7. NM = $(CROSS_COMPILE)nm
  8. STRIP = $(CROSS_COMPILE)strip
  9. OBJCOPY = $(CROSS_COMPILE)objcopy
  10. OBJDUMP = $(CROSS_COMPILE)objdump RANLIB = $(CROSS_COMPILE)RANLIB

  11. led_on:start.S
  12. $(CC) -g -c -o led_on.o start.S
  13. $(LD) -Ttext 0x0000000 -g led_on.o -o led_on_tmp.o
  14. $(OBJCOPY) -O binary -S led_on_tmp.o led_on
  15. clean:
  16. rm -f led_on
  17. rm -f led_on.o
  18. rm -f led_on_tmp.o

三、c语言写的点亮LED
3.1 start.S

点击(此处)折叠或打开

  1. .text
  2. .global _start
  3. _start:
  4. ldr sp, =1024*4
  5. bl main

  6. loop:
  7. b loop
3.2 main.c

点击(此处)折叠或打开

  1. #define GPBCON (*(volatile unsigned int *) 0x56000000)
  2. #define GPBDAT (*(volatile unsigned int *) 0x56000004)

  3. void main()
  4. {
  5.     GPBCON = 0x15400;
  6.     GPBDAT = 0x0;
  7.     return ;
  8. }
3.3 Makefile

点击(此处)折叠或打开

  1. CROSS_COMPILE = /opt/EmbedSky/crosstools_3.4.5_softfloat/gcc-3.4.5-glibc-2.3.6/arm-linux/bin/ arm-linux-
  2. LD = $(CROSS_COMPILE)ld
  3. CC = $(CROSS_COMPILE)gcc
  4. OBJCOPY = $(CROSS_COMPILE)objcopy

  5. led_on:start.S
  6. $(CC) -g -c -o led_on.o start.S
  7. $(CC) -g -c -o main.o main.c
  8. $(LD) -Ttext 0x0000000 start.o main.o -o led_on_tmp.o
  9. $(OBJCOPY) -O binary -S led_on_tmp.o led_on
  10. clean:
  11. rm -f led_on
  12. rm -f led_on.o
  13. rm -f led_on_tmp.o
四、 c语言写的流水灯
4.1 start.S

点击(此处)折叠或打开

  1. .text
  2. .global _start
  3. _start:
  4. ldr r0, =0x53000000
  5. mov r1, #0x0
  6. str r1, [r0]

  7. ldr sp, =1024*4
  8. bl main

  9. loop:
  10. b loop
4.2 main.c

点击(此处)折叠或打开

  1. #define GPBCON (*(volatile unsigned int *) 0x56000010)
  2. #define GPBDAT (*(volatile unsigned int *) 0x56000014)

  3. static inline void delay (unsigned long loops)
  4. {
  5.     __asm__ volatile ("1:\n"
  6.             "subs %0, %1, #1\n"
  7.             "bne 1b":"=r" (loops):"0" (loops));
  8. }

  9. void main()
  10. {
  11.     int i = 1;
  12.     GPBCON = 0x15400;
  13.     while(1)
  14.     { 
  15.         GPBDAT = 0x7FF&(~i<<5);
  16.         i *= 2;
  17.         if(16==i)
  18.             i = 1;
  19.         delay(400000);
  20.     } 
  21.     return ;
  22. }
要注意的是,s3c2440默认情况下是开启了watchdog,所以当运行这个程序时突然灯亮的顺序不对了,要考虑关闭watchdog。
delay(400000); 很接近1s,400000这个数值是凑出来的,具体这个延时是怎么算的,还不太清楚,但是肯定和51“一个机器周期=12个时钟周期”的计算方法不一样。
阅读更多
版权声明:本文为博主原创文章,转载请注明出处。 https://blog.csdn.net/wangcong02345/article/details/52352503
个人分类: linux开发
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭