赞
踩
①使能时钟,CCGR0~CCGR6这7个寄存器控制着6ULL所有外设时钟的使能。为了简单,设置CCGR0~CCGR6这7个寄存器全部为0XFFFFFFFF,相当于使能所有外设时钟。
②IO复用,将寄存器IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO03的bit3~0设置为0101=5,这样GPIO1_IO03就复用为GPIO。
③寄存器IOMUXC_SW_PAD_CTL_PAD_GPIO1_IO03是设置GPIO1_IO03的电气属性。包括压摆率、速度、驱动能力、开漏、上下拉等。
④配置GPIO功能,设置输入输出。设置GPIO1_DR寄存器bit3为1,也就是设置为输出模式。设置GPIO1_DR寄存器的bit3,为1表示输出高电平,为0表示输出低电平。
创建汇编文件,输入代码实现I.MX6ULL IO的初始化
.global _start @全局标号 _start: /*使能所有外设时钟*/ ldr r0, =0x020c4068 @CCGR0 ldr r1, =0xffffffff @要向CCGR0写入的数据 str r1, [r0] @将0xffffffff写入CCGR0中 ldr r0, =0x020c406c @CCGR1 str r1, [r0] ldr r0, =0x020c4070 @CCGR2 str r1, [r0] ldr r0, =0x020c4074 @CCGR3 str r1, [r0] ldr r0, =0x020c4078 @CCGR4 str r1, [r0] ldr r0, =0x020c407c @CCGR5 str r1, [r0] ldr r0, =0x020c4080 @CCGR6 str r1, [r0] /*配置 GPIO1_IO03 PIN的复用为GPIO,也就是设置 *IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO03=5 */ ldr r0, =0x020e0068 @IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO03 ldr r1, =0x5 str r1, [r0] /*配置GPIO1_IO03的电器属性*/ ldr r0, = 0x020e02f4 @IOMUXC_SW_PAD_CTL_PAD_GPIO1_IO03 ldr r1, = 0x10b0 str r1, [r0] /*配置 GPIO*/ ldr r0, =0x0209c004 @GPIO1_GDIR ldr r1, =0x8 str r1, [r0] /*打开LED,设置GPIO1_IO03为0 */ ldr r0, =0x0209c000 @GPIO1_DR ldr r1, =0 str r1, [r0] loop: b loop
使用arm-linux-gnueabihf-gcc,将.c .s文件变为.o
我们是要编译出在 ARM 开发板上运行的可执行文件,所以要使用交叉编译器 arm-linux-gnueabihf-gcc 来编译。因为本试验就一个 led.s 源文件,所以编译比较简单。先将 led.s 编译为对应的.o 文件,在终端中输入如下命令:
arm-linux-gnueabihf-gcc -g -c led.s -o led.o
- 1
上述命令就是将 led.s 编译为 led.o,其中“-g”选项是产生调试信息,GDB 能够使用这些调试信息进行代码调试。“-c”选项是编译源文件,但是不链接。“-o”选项是指定编译产生的文件名字,这里我们指定 led.s 编译完成以后的文件名字为 led.o。执行上述命令以后就会编译生成一个 led.o 文件
将所有的.o文件连接为elf格式的可执行文件
本教程所有的裸机例程都是烧写到 SD 卡中,上电以后 I.MX6U 的内部 boot rom 程序会将可执行文件拷贝到链接地址处,这个链接地址可以在 I.MX6U 的内部 128KB RAM 中 (0X900000~0X91FFFF),也可以在外部的 DDR 中。本教程所有裸机例程的链接地址都在 DDR中,链接起始地址为 0X87800000。I.MX6U-ALPHA 开发板的 DDR 容量有两种:512MB 和256MB,起始地址都为 0X80000000,只不过 512MB 的终止地址为 0X9FFFFFFF,而 256MB 容量的终止地址为 0X8FFFFFFF。之所以选择 0X87800000 这个地址是因为后面要讲的 Uboot 其链接地址就是 0X87800000,这样我们统一使用 0X87800000 这个链接地址,不容易记混。
确定了链接地址以后就可以使用 arm-linux-gnueabihf-ld 来将前面编译出来的 led.o 文件链接到 0X87800000 这个地址,使用如下命令:
arm-linux-gnueabihf-ld -Ttext 0X87800000 led.o -o led.elf
- 1
上述命令中-Ttext 就是指定链接地址,“-o”选项指定链接生成的 elf 文件名,这里我们命名为 led.elf。上述命令执行完以后就会在工程目录下多一个 led.elf 文件
将elf文件转为bin文件
arm-linux-gnueabihf-objcopy 更像一个格式转换工具,我们需要用它将 led.elf 文件转换为led.bin 文件,命令如下:
arm-linux-gnueabihf-objcopy -O binary -S -g led.elf led.bin
- 1
上述命令中,“-O”选项指定以什么格式输出,后面的“binary”表示以二进制格式输出,选项“-S”表示不要复制源文件中的重定位信息和符号信息,“-g”表示不复制源文件中的调试信息。
将elf文件转为汇编
大多数情况下我们都是用 C 语言写试验例程的,有时候需要查看其汇编代码来调试代码,因此就需要进行反汇编,一般可以将 elf 文件反汇编,比如如下命令:
arm-linux-gnueabihf-objdump -D led.elf > led.dis
- 1
上述代码中的“-D”选项表示反汇编所有的段,反汇编完成以后就会在当前目录下出现一个名为 led.dis 文件
创建 Makefile 文件
是用“touch”命令在工程根目录下创建一个名为“Makefile”的文件,创建好 Makefile 文件以后就需要根据 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 clean: rm -rf *.o led.bin led.elf led.dis
- 1
- 2
- 3
- 4
- 5
- 6
- 7
创建好 Makefile 以后我们就只需要执行一次“make”命令即可完成编译
正点原子专门编写了一个软件来将编译出来的.bin 文件烧写到 SD 卡中,这个软件叫做“imxdownload”,Ubuntu 下裸机烧写软件->imxdownload,imxdownlaod 只能在 Ubuntu 下使用
我们要将 imxdownload 拷贝到工程根目录下,也就是和 led.bin 处于同一个文件夹下,要不然烧写会失败
我们直接将软件 imxdownload 从 Windows 下复制到 Ubuntu 中以后,imxdownload 默认是没有可执行权限的。我们需要给予 imxdownload 可执行权限,使用命令“chmod”
chmod 777 imxdownload
- 1
有可执行权限后imxdownload会变色
使用 imxdownload 向 SD 卡烧写 led.bin 文件,命令格式如下:
./imxdownload <.bin file> <SD Card>
- 1
其中.bin 就是要烧写的.bin 文件,SD Card 就是你要烧写的 SD 卡,烧写的过程中可能会让你输入密码,输入你的 Ubuntu 密码即可完成烧写。
设置好以后按一下开发板的复位键,如果代码运行正常的话 LED0 就会被点亮
一按下复位键的时候是不亮的,过了几秒之后才亮。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。