资讯详情

I.MX6U-ALPHA开发板(汇编 LED 灯实验)

文章目录

  • 一、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 就会被点亮 一按下复位键的时候是不亮的,过了几秒之后才亮。

标签: 4080连接器

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台