汇编点亮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 交叉编译器的使用)
-  arm-linux-gnueabihf-gcc 编译文件 先将 led.s 编译为对应的.o 文件,在终端中输入如下命令: 
arm-linux-gnueabihf-gcc -g -c led.s -o led.o其中“-g”选项是产生调试信息,“-c”选项是编译源文件,但是不链接。
执行上述命令以后就会编译生成一个 led.o 文件。
-  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 文件。
-  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文件。
-  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软件
-  将 imxdownload 拷贝到工程根目录下 我们要将 imxdownload 拷贝到工程根目录下,也就是和 led.bin 处于同一个文件夹下。 
-  给予 imxdownload 可执行权限 我们直接将软件 imxdownload 从 Windows 下复制到 Ubuntu 中以后,imxdownload 默认是没有可执行权限的。我们需要给予 imxdownload 可执行权限,使用命令“chmod”,命令如下: chmod 777 imxdownload当给予 imxdownload 可执行权限以后其名字变成了绿色的,如果没有可执行权限的话其名字颜色是白色的。 
-  确定要烧写的SD卡 Ubuntu 下所有的设备文件都在目录“/dev”里面,所以插上 SD 卡以后也会出现在“/dev”里面,其中存储设备都是以“/dev/sd”开头的。  我的是/dev/sdb 
-  向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 设备里面!那是系统磁盘
-  代码验证 然后设置拨码开关为 SD 卡启动,拨码开关如图所示:  
之后DS0将会被点亮。