今天!是万里长征第一步。在原子哥的资料自学下终于完成了在I.MX6ULL下的第一个裸机点灯。写这个是总结一下点灯的步骤(当然以后所有的裸机开发基本步骤都差不多)。

在I.MX6ULL上点灯其实和STM32差不多。初始化就连步骤都一摸一样。我总结了一下初始化步骤:

1、使能GPIO时钟。

2、设置IO复用,将其复用为GPIO(通用复用输入输出)

3、配置GPIO的电气属性。

4、配置GPIO功能。

当然也有一点点不同,STM32可以用C语言来编写,而ARM上得用汇编语言来编写驱动。

一、编写驱动

了解完基本配置之后,就可以开始编写驱动了。

​
.global _start _start:
@使能所有外设时钟ldr r0, =0x020c4068 @CCGR0ldr r1, =0xffffffff @要像CCGR0写入的数据str r1, [r0]        @将0xffffffff写入到CCGR0中ldr r0, =0x020c406cstr r1, [r0]ldr r0, =0x020c4070str r1, [r0]ldr r0, =0x020c4074str r1, [r0]ldr r0, =0x020c4078str r1, [r0]ldr r0, =0x020c407cstr r1, [r0]ldr r0, =0x020c4080str r1, [r0]@配置GPIO_IO03 PIN的复用为GPIO@IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO03=0101@寄存器地址为0x020E_0068ldr r0, =0x020E0068 @GPIO_IO03ldr r1, =0x5        @要写入的数据str r1, [r0]        @将0xffffffff写入到CCGR0中@配置电气属性@IOMUXC_SW_PAD_CTL_PAD_GPIO1_IO03@地址为0x020E02F4@bit0:     0    低速率@bit5,3:  110   R0/6驱动能力@bit7,6:  10   100MHz速度@bit11:   0    关闭开漏输出@bit12:   1    使能pull/kepper@bit13:   0    kepper@bit14,15:00   100K下拉@bit16:   0    关闭HYSldr r0, =0x020e02f4ldr r1, =0x10b0str r1, [r0]@设置GPIO@设置GPIO_GDIR寄存器,设置GPIO_GPIO03为输出@GPIO_GDIR寄存器地址为0x0209c004设置GPIO_GDIR寄存器bit3为1@也就是设置GPIO_IO03为输出ldr r0, =0x0209c004ldr r1, =0x8str r1, [r0]@打开LED,也就是设置GPIO1_IO03为0@GPIOx_DR寄存器地址为0x0209c000ldr r0, =0x0209c000ldr r1, =0str r1, [r0]loop:b loop@ b 表示跳转 到loop 一直死循环​

二、编译程序

步骤如下:

1、使用arm-linux-gnueabihf-gcc将.c .s文件变为.o

2、将所有的.o文件连接为elf格式的可执行文件。

3、将elf文件转为bin文件。

4、将elf文件转为汇编,反汇编。

因为我是在Ubuntu上编程且编译出在 ARM 开发板上运行的可执行文件,所以我需要在交叉编译器上编译。先在终端输入 arm-linux-gnueabihf-gcc -g -c led.s -o led.o,上述命令就是将 led.s 编译为 led.o,其中“-g”选项是产生调试信息,GDB 能够使用这些调试信息进行代码调试。“-c”选项是编译源文件,但是不链接。“-o”选项是指定编译产生的文件名字。

        形成了.o文件以后,我们需要将这.o 文件链接起来组合成可执行文件。arm-linux-gnueabihf-ld 用来将众多的.o 文件链接到一个指定的链接位置。使用指令arm-linux-gnueabihf-ld -Ttext 0X87800000 led.o -o led.elf。上述命令中-Ttext 就是指定链接地址,“-o”选项指定链接生成的 elf 文件名,这里我们命名为 led.elf。上述命令执行完以后就会在工程目录下多一个 led.elf 文件。

为什么要选择0X87800000呢?上电以后 I.MX6U 的内部 boot rom 程序会将可执行文件拷贝到链接地址处,这个链接地址可以在 I.MX6U 的内部 128KB RAM 中(0X900000~0X91FFFF),也可以在外部的 DDR 中。我选择放在外部DDR中,链接起始地址为 0X87800000。为什么要选择这里呢?因为Uboot起始地址也在这里,为以后做准备。

led.elf 文件也不是我们最终烧写到 SD 卡中的可执行文件,我们要烧写的.bin 文件,因此还
需要将 led.elf 文件转换为.bin 文件,这里就需要用到 arm-linux-gnueabihf-objcopy 这个工具。

使用指令 arm-linux-gnueabihf-objcopy -O binary -S -g led.elf led.bin
上述命令中,“-O”选项指定以什么格式输出,后面的“binary”表示以二进制格式输出,
选项“-S”表示不要复制源文件中的重定位信息和符号信息,“-g”表示不复制源文件中的调试
信息。

至此我们所需要的.bin文件就已经准备好了。当然可以再添加一步,反汇编。

arm-linux-gnueabihf-objdump 
大多数情况下我们都是用 C 语言写试验例程的,有时候需要查看其汇编代码来调试代码,
因此就需要进行反汇编,一般可以将 elf 文件反汇编。

总结一下我们为了编译 ARM 开发板上运行的 led.o 这个文件使用了如下命令:

arm-linux-gnueabihf-gcc -g -c led.s -o led.o
arm-linux-gnueabihf-ld -Ttext 0X87800000 led.o -o led.elf
arm-linux-gnueabihf-objcopy -O binary -S -g led.elf led.bin
arm-linux-gnueabihf-objdump -D led.elf > led.dis

三、烧写程序

这部分我也不懂,只能跟着原子哥的步骤来。正点原子有一个专门的软件(imxdownload)来将bin文件烧写到SD卡中,先用FileZillaClient将这个软件复制到你想要烧录的文件的同一个路径下,给予他可执行权限。然后,将SD卡插入到Linux系统中。查看SD卡所在位置。使用命令./imxdownload led.bin /dev/sdb  然后将SD卡取下插入到开发板上就成功了!

四、优化程序

我觉得这么多文件链接在一起下次如果修改一部分代码会不会很困难。所以我查阅资料,果然发现原子哥说可以使用Makefile来方便下次修改和移植。

先在当前文件夹建立一个Makefile,然后在其中使用Makefile语法来编程。

led.bin:led.s
        arm-linux-gnueabihf-gcc -g -c led.s -o led.o
        arm-linux-gnueabihf-ld -Ttext 0X87800000 led.o -o led.elf
        arm-linux-gnueabihf-objcopy -O binary -S -g led.elf led.bin
        arm-linux-gnueabihf-objdump -D led.elf > led.dis

download:

./imxdownload led.bin /dev/sdb

clean:

rm -rf  *.o  led.elf  led.bin  led.dis

这样一来下次修改就只需要修改一部分了。而且我还自己加了一段烧写代码,更加轻快简洁。

五、总结

作为一名小白,今天是万里长征的第一步,自己写一篇博客来讲今天自学的内容梳理一遍,我觉得效果很好。可能程序还有很多可以优化的地方,但是现在自己一字字敲出来过程真的很爽!前路漫漫,希望将学习变成习惯。

一灯大师--关于如何进行裸机开发的学习心得相关推荐

  1. 一灯大师之点亮OK6410开发板上4个LED裸机程序---嵌入式回归第十篇

    接着上一篇关闭mmu和cache后,这一篇来点亮开发板上的一盏LED小灯,前面所作的初始化工作基本看不到效果,其实这一段也是最麻烦的!如果有问题调试很麻烦!点亮了LED之后就可以用LED来看程序是否如 ...

  2. JEPF软件快速开发平台学习心得之请假单功能的完成(一)

    首先我也是点一次接触这个软件快速开发平台,我在学习这个平台的同时简单记录下我对这个平台是如何一步步熟悉或者是上手的,也有简单的一点总结和学习心得,希望对你们有用,同时也可以让我对知识点更快速的查缺补漏 ...

  3. python revit二次开发_BIM学习心得3-简单讲讲Revit二次开发学习方法

    好久没更新了,差点以为自己要断更了,临近要毕业,一直在忙着找工作,没有对口的,苦啊- 不倒苦水了,上一次说到BIM学习的四个步骤之一,建模,这个主要在于熟练度,如果软件熟练了,基本上什么都能画了,公路 ...

  4. tc275单片机的内核_TC275开发板学习心得(一)

    1.刚拿到TC27T开发板时,是比较兴奋的,开发板是一块红色的正方形板卡,板子布局简洁干净.感觉板卡上遗憾的地方,按键和指示灯放在了板卡背面,给操作和指示带来些不便,还有板卡上封装丝印没有明显印在板卡 ...

  5. 百度dueros人工智能-RDA5981(R01开发板)-学习心得-入门及硬件连接

    一.入门及硬件连接 自从2017年12月10号收到在深圳比特跳动技术有限公司的淘宝网上购买的百度dueros人工智能-R01开发板,当拆开快递包裹的时候,我本以为可以到手就玩,结果当场就懵了,配件如下 ...

  6. 百度dueros人工智能-RDA5981(R01开发板)-学习心得-安装SDK(dueros的MbedOS系统)

    R01开发板的代码及功能测试需要安装SDK才能正常测试,我们需要了解一点MbedOS系统的基本知识及R01开放板的硬件知识才能开始安装SDK的工作. 1.Mbed OS基础知识 Mbed OS是一个开 ...

  7. 百度dueros人工智能-RDA5981(R01开发板)-学习心得-电脑软件环境配置及调试

    R01开发板在WIindows开发环境下需要预先安装以下环境软件: 1.Keil MDK 安装 Keil MDK是美国Keil软件公司推出的微控制器开发工具,这里我们需要使用5.17以上的版本就行. ...

  8. 车载多媒体Android开发平台学习心得

    Android平台工具学习 一.Android平台 Eclipse+ ADT+SDK 1.1.准备工作 进行开发前的安装配置: ①Java:先安装java,配置JDK环境变量: ②Eclipse:使用 ...

  9. JEPLUS学习心得之请假单功能的完成——JEPLUS软件快速开发平台

    为什么80%的码农都做不了架构师?>>>    JEPF软件快速开发平台学习心得之请假单功能的完成(一) 首先我也是点一次接触这个软件快速开发平台,我在学习这个平台的同时简单记录下我 ...

最新文章

  1. MySQL性能优化、故障排查及最佳实践秘籍,阿里云数据库专家玄惭的“武功”全记录...
  2. 简单套路发高分文章--杨树内生和根际微生物组结构
  3. mysql数据记录更新版本问题_MySQL版本升级遇到的问题小结
  4. java正则表达式 引用_java – 正则表达式检索引用的字符串和引用字符
  5. 动态T-SQL语句常見問題與解決方案
  6. apache2.2.15与PHP5.3.3安装设置完成后,apache启动失败
  7. 干货 | 设计大佬用的UI手机样机,你要么?
  8. 双十一要来了,如何设计出那些牛X的促销页面?
  9. ssh-copy-id配置rsync免密访问并rsync同步
  10. VSCode配置jupyter逐行语句运行python
  11. Varnish 503错误
  12. C++获取当前时间及计算当前时间距某个时间点的时间段
  13. 强化学习(二)--动态规划寻找最优策略
  14. switch语句的ns图怎么画_ns结构流程图是什么?ns流程图怎么画?
  15. # python # # 分形 # Sierpinski Carpet 谢尔宾斯基地毯
  16. 磁共振线圈分类_磁共振线圈的发展历程
  17. LOJ #3049. 「十二省联考 2019」字符串问题
  18. 关于烂代码的那些事(下)
  19. 致Emacs初学者+Emacs初学者必知必会
  20. Python 语言中的骚操作

热门文章

  1. win10,win11微软输入法如何导入搜狗词库的方法-词库转换
  2. C++中必须用初始化列表的四种情况
  3. 学习笔记之Android调用系统相册选择图片
  4. 使用BlockingQueue实现包饺子( 生产者做面皮,消费者拿面皮包饺子)简单使用
  5. 数据仓库2_数据建模_维度建模
  6. JS/CSS判断是不是iphoneX?
  7. RK3399Pro/AR9201对比
  8. 移动互联网的“约炮经济学”
  9. 大数据计算模式有哪些
  10. CentOS7.5环境下搭建禅道