文章目录
- 一、I.MX6ULL IO初始化
- 二、编写驱动
- 编译程序
-
- ①编译
- ②连接
- ③转换
- ④反汇编
- ⑤创建Makefile文件
- 四、烧写代码
-
- ①将 imxdownload 拷贝到工程根目录下
- ②给予imxdownload可执行权限
- ③向 SD 卡烧写 bin 文件
- 五、代码验证
-
- ①设置拨码开关为 SD 卡启动
- ②按下复位键
一、I.MX6ULL IO初始化
①使能时钟,CCGR0~CCGR6这7个寄存器控制着6ULL所有外设时钟的使能。设置简单CCGR0~CCGR这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
上述命令是将军 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 链接地址是 0X这样我们就可以统一使用878万元 0X87800000 这个链接地址易记混。
确定链接地址后,即可使用 arm-linux-gnueabihf-ld 前面编译的 led.o 文件链接到 0X87800000 使用以下命令:
arm-linux-gnueabihf-ld -Ttext 0X87800000 led.o -o led.elf
上述命令中-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
在上述命令中,-O选项指定什么格式输出,以下是binary表示以二进制格式输出,选项-S不要复制源文件中的重定位信息和符号信息,-g不复制源文件中的调试信息。
④反汇编
将elf将文件转换为汇编
在大多数情况下,我们都使用它 C 语言写测试例程,有时需要查看汇编代码来调试代码,所以需要反汇编,一般可以 elf 文件反汇编如下:
arm-linux-gnueabihf-objdump -D led.elf > led.dis
上述代码中的-D选项表示所有反汇编段,反汇编完成后,在当前目录中出现一个名称 led.dis 文件
⑤创建Makefile文件
创建 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 0X8780000 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
创建好 Makefile 以后我们就只需要执行一次“make”命令即可完成编译
四、代码烧写
正点原子专门编写了一个软件来将编译出来的.bin 文件烧写到 SD 卡中,这个软件叫做“imxdownload”,Ubuntu 下裸机烧写软件->imxdownload,imxdownlaod 只能在 Ubuntu 下使用
①将 imxdownload 拷贝到工程根目录下
我们要将 imxdownload 拷贝到工程根目录下,也就是和 led.bin 处于同一个文件夹下,要不然烧写会失败
②给予imxdownload可执行权限
我们直接将软件 imxdownload 从 Windows 下复制到 Ubuntu 中以后,imxdownload 默认是没有可执行权限的。我们需要给予 imxdownload 可执行权限,使用命令“chmod”
chmod 777 imxdownload
有可执行权限后imxdownload会变色
③向 SD 卡烧写 bin 文件
使用 imxdownload 向 SD 卡烧写 led.bin 文件,命令格式如下:
./imxdownload <.bin file> <SD Card>
其中.bin 就是要烧写的.bin 文件,SD Card 就是你要烧写的 SD 卡,烧写的过程中可能会让你输入密码,输入你的 Ubuntu 密码即可完成烧写。
五、代码验证
①设置拨码开关为 SD 卡启动
②按下复位键
设置好以后按一下开发板的复位键,如果代码运行正常的话 LED0 就会被点亮 一按下复位键的时候是不亮的,过了几秒之后才亮。