汇编点亮LED I.MX6U-ALPHA

Posted 等不到星光等时光呀

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了汇编点亮LED I.MX6U-ALPHA相关的知识,希望对你有一定的参考价值。

汇编点亮LED I.MX6U-ALPHA

硬件所使用的是正点原子的I.MX6U-ALPHA开发板

创建led.s文件,将以下代码写入:

.global _start  /* 全局标号 */

/*
 * 描述:	_start函数,程序从此函数开始执行此函数完成时钟使能、
 *		  GPIO初始化、最终控制GPIO输出低电平来点亮LED灯。
 */
_start:
	/* 例程代码 */
	/* 1、使能所有时钟 */
	ldr r0, =0X020C4068 	/* CCGR0 */
	ldr r1, =0XFFFFFFFF  
	str r1, [r0]		
	
	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]
	

	/* 2、设置GPIO1_IO03复用为GPIO1_IO03 */
	ldr r0, =0X020E0068	/* 将寄存器SW_MUX_GPIO1_IO03_BASE加载到r0中 */
	ldr r1, =0X5		/* 设置寄存器SW_MUX_GPIO1_IO03_BASE的MUX_MODE为5 */
	str r1,[r0]

	/* 3、配置GPIO1_IO03的IO属性	
	 *bit 16:0 HYS关闭
	 *bit [15:14]: 00 默认下拉
     *bit [13]: 0 kepper功能
     *bit [12]: 1 pull/keeper使能
     *bit [11]: 0 关闭开路输出
     *bit [7:6]: 10 速度100Mhz
     *bit [5:3]: 110 R0/6驱动能力
     *bit [0]: 0 低转换率
     */
    ldr r0, =0X020E02F4	/*寄存器SW_PAD_GPIO1_IO03_BASE */
    ldr r1, =0X10B0
    str r1,[r0]

	/* 4、设置GPIO1_IO03为输出 */
    ldr r0, =0X0209C004	/*寄存器GPIO1_GDIR */
    ldr r1, =0X0000008		
    str r1,[r0]

	/* 5、打开LED0
	 * 设置GPIO1_IO03输出低电平
	 */
	ldr r0, =0X0209C000	/*寄存器GPIO1_DR */
   ldr r1, =0		
   str r1,[r0]

/*
 * 描述:	loop死循环
 */
loop:
	b loop 			

一、编译代码(arm-linux-gnueabihf 交叉编译器的使用)

  1. arm-linux-gnueabihf-gcc 编译文件

    先将 led.s 编译为对应的.o 文件,在终端中输入如下命令:

arm-linux-gnueabihf-gcc -g -c led.s -o led.o

其中“-g”选项是产生调试信息,“-c”选项是编译源文件,但是不链接。

执行上述命令以后就会编译生成一个 led.o 文件。

  1. arm-linux-gnueabihf-ld 链接文件

    arm-linux-gnueabihf-ld 用来将众多的.o 文件链接到一个指定的链接位置。

arm-linux-gnueabihf-ld -Ttext 0X87800000 led.o -o led.elf

“-o”选项指定链接生成的 elf 文件名,这里我们命名为 led.elf。上述命令执行完以后就会在工程目录下多一个 led.elf 文件。

我们要烧写的.bin 文件,因此还需要将 led.elf 文件转换为.bin 文件。

  1. arm-linux-gnueabihf-objcopy 格式转换

    我们需要用它将 led.elf 文件转换为led.bin 文件,命令如下:

arm-linux-gnueabihf-objcopy -O binary -S -g led.elf led.bin

“-O”选项指定以什么格式输出,后面的“binary”表示以二进制格式输出,选项“-S”表示不要复制源文件中的重定位信息和符号信息,“-g”表示不复制源文件中的调试信息。上述命令执行完成以后,会产生一个led.bin文件。

  1. arm-linux-gnueabihf-objdump 反汇编

    反汇编(Disassembly):把目标代码转为汇编代码的过程。

    一般可以将 elf 文件反汇编,比如如下命令:

    arm-linux-gnueabihf-objdump -D led.elf > led.dis

    “-D”选项表示反汇编所有的段,反汇编完成以后就会在当前目录下出现一个名为 led.dis 文件。

    led.dis 里面是汇编代码,而且还可以看到内存分配情况。

总结一下我们为了编译 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

如果我们修改了 led.s 文件,那么就需要在重复一次上面的这些命令,太麻烦了,这个时候

我们就可以使用 Makefile 文件了。

二、创建 Makefile 文件

使用“touch”命令在工程根目录下创建一个名为“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中的代码前面的空格必须要用Tab

创建好 Makefile 以后我们就只需要执行一次“make”命令即可完成编译,如果我们要清理工程的话执行“make clean”即可。

三、代码烧写

imxdownload软件

  1. 将 imxdownload 拷贝到工程根目录下

    我们要将 imxdownload 拷贝到工程根目录下,也就是和 led.bin 处于同一个文件夹下。

  2. 给予 imxdownload 可执行权限

    我们直接将软件 imxdownload 从 Windows 下复制到 Ubuntu 中以后,imxdownload 默认是没有可执行权限的。我们需要给予 imxdownload 可执行权限,使用命令“chmod”,命令如下:

    chmod 777 imxdownload

    当给予 imxdownload 可执行权限以后其名字变成了绿色的,如果没有可执行权限的话其名字颜色是白色的。

  3. 确定要烧写的SD卡

    Ubuntu 下所有的设备文件都在目录“/dev”里面,所以插上 SD 卡以后也会出现在“/dev”里面,其中存储设备都是以“/dev/sd”开头的。

    我的是/dev/sdb

  4. 向SD卡烧写bin文件

    使用 imxdownload 向 SD 卡烧写 led.bin 文件,命令格式如下:

    ./imxdownload <.bin file>

    其中.bin 就是要烧写的.bin 文件,SD Card 就是你要烧写的 SD 卡,比如我的电脑使用如下

    命令烧写 led.bin 到/dev/sdb 中:

    ./imxdownload led.bin /dev/sdb //不能烧写到/dev/sda 或 sda1 设备里面!那是系统磁盘

  5. 代码验证

    然后设置拨码开关为 SD 卡启动,拨码开关如图所示:

之后DS0将会被点亮。

以上是关于汇编点亮LED I.MX6U-ALPHA的主要内容,如果未能解决你的问题,请参考以下文章

C语言版本LED灯实验

C语言版本LED灯实验

ARM裸机开发:C语言点亮LED

使用汇编按照GPIO操作流程点亮LED灯

STM32点亮小灯的程序和方法

用汇编语言点亮LED(基于STC大学计划实验箱)