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

一、I.MX6ULL IO初始化

​ ①使能时钟,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

​ 上述命令就是将 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

​ 上述命令中-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 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

创建好 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 就会被点亮
一按下复位键的时候是不亮的,过了几秒之后才亮。在这里插入图片描述在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值