微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > 嵌入式系统设计讨论 > -BL1启动实验之点亮第一个LED(裸机)

-BL1启动实验之点亮第一个LED(裸机)

时间:10-02 整理:3721RD 点击:

因为小编第一次用TI的板子 作为新手表示很不淡定,所以只能从裸机上来了解 arm 335x 的使用。不过在开发过程中,裸机上的开发是没用的。本次学习内容如下:
1.linux下的基础指令(百度一下很多)
2.makefile命令《参见:跟我一起学Makefile.pdf》
3.大概了解汇编语言(了解了其中的30种,当然估计果断时间就忘记了,不过应该能记住一点,具体的百度一下)
4.交叉编译链(toolchains)的必要性,以及如何安装交叉编译工具链及配置linux环境(用户目录下的.bashrc/ export $PATH=/XXXX:$PAHT)。
5.u-boot 的工作机制,以及如何使用mkimage 生成MLO(MLO其实是TI给u-boot的SPL起了个别名而已,我们称之为BL1,MLO其实是mkimage工具给u-boot-spl.bin添加了头信息后得到的(就行uImage和zImage的关系)。BL2自然就是U-boot.bin了,但是MLO不是直接加载U-boot.bin文件,而是加载u-boot.img文件,img文件其实是用mkimage工具给u-boot.bin添加头信息后得到的)

// 好现在开始上代码。
开发板上:USER_LED:GPIO3_16;高电平使三极管导通。LED 亮
1.makefile:

  1. led.bin: led.o                                                                 //目标 &&依赖
  2.         arm-linux-gnueabihf-ld -Ttext 0x00000000 -o led.elf $^   //只编辑不链接
  3.         arm-linux-gnueabihf-objcopy -O binary led.elf led.bin    //生成linux下的可执行文件 elf及.bin
  4.         mkimage -T omapimage -a 0x402F0400 -d led.bin     //335x 的uboot中,启动只认识image文件
  5.                                                                                //0x402f0400 是SRAM的地址
  6. %.o : %.s
  7.         arm-linux-gnueabihf-gcc -o $@ [        DISCUZ_CODE_172        ]lt; -c
  8. %.o : %.c
  9.         arm-linux-gnueabihf-gcc -o $@ [        DISCUZ_CODE_172        ]lt; -c
  10. clean:
  11.         rm *.o *.elf *.bin *.dis MLO -f

复制代码

2.
start.s



  1. /*

  2. .global _start

  3. _start:

  4.         bl led_flash

  5.         b .

  6. */        

  7. .global _start

  8. _start:

  9.         ldr r0, =0x44E10998                         // GPIO3_16 CONFING

  10.         ldr r1, =0x0000001F

  11.         str r1, [r0]

  12.         ldr r0, =0x481AE134                      //GPIO3_16 OE

  13.         ldr r1, =0x00000000

  14.         str r1, [r0]


  15.         ldr r0, =0x481AE13C                  //GPIO3_16 DATAOUT

  16.         ldr r1, =0x00010000

  17.         str r1, [r0]

  18. flag:

  19.         b flag                                       //死循环 防止程序跑飞

复制代码



led.c:

  1. #define led_conf 0x44E10998
  2. #define led_oe 0x481AE134
  3. #define led_data 0x481AE13C

  4. void delay(void);

  5. void led_flash(void)
  6. {
  7.         unsigned int *p = (unsigned int *)led_conf;
  8.         *p = 0x0000001f;
  9.         unsigned int *p1 = (unsigned int *)led_oe;
  10.         *p1 = 0x00000000;
  11.         unsigned int *p2 = (unsigned int *)led_data;

  12.         while(1)
  13.         {
  14.                 *p2 = 0x00010000;
  15.                 delay();
  16.                 *p2 = 0x00000000;
  17.                 delay();                                
  18.         }
  19. }

  20. void delay(void)
  21. {
  22.         unsigned int i = 100000;
  23.         while(i--);        
  24. }

复制代码


因为是初学所以没用现成的函数配置。顺便了解下了 uboot工作方式,而下面小编将对wiki进行解读,下面将脱离裸机部分,进行实战开发,请大家期待

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top