ALPHA开发板LED原理图
而LED0是接在GPIO1_3,下面一个LED灯是电源指示灯
IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO03
。这个寄存器的0-3位是复用位,将这4位设置为0101,这样就是复用为GPIOIOMUXC_SW_PAD_CTL_PAD_GPIO1_IO03
是设置电气属性,包括压摆率、速度、驱动能力、开漏、上下拉等。mov R0, R1 @将寄存器R1中的数据传递给R0
mov R0, #0x12 @将立即数0x12传递给R0寄存器
mrs R0, CPSR
msr CPSR, R0
ARM不能直接访问存储器,比如RAM中的数据。I.MX6UL中的寄存器就是RAM类型的,我们用汇编来配置时许哟啊借助寄存器访问指令,一般先要将要配置的值写入到Rx(x=0~12)寄存器中,然后借助存储器访问指令将Rx中的数据写入到I.MX6UL寄存器中,读取也是一样的。
.global _start @全局标号,_start是程序的入口
_start:
/* 使能所有外设时钟 */
ldr r0, =0x020c4068 @CCGR0的地址
ldr r1, =0xffffffff @要向CCGR0写入的数据
str r1, [r0] @将r1写入到r0中
ldr r0, =0x020c406c
str r1, [r0]
ldr r0, =0x020c4070
str r1, [r0]
ldr r0, =0x020c4074
str r1, [r0]
ldr r0, =0x020c4078
str r1, [r0]
ldr r0, =0x020c407c
str r1, [r0]
ldr r0, =0x020c4080
str r1, [r0]
ldr r0, =0x020c4084
str r1, [r0]
/* 配置GPIO1_IO03的复用为GPIO,也就是设置为5 */
ldr r0, =0x020e0068 @地址
ldr r1, =0x05
str r1, [r0]
/* 配置GPIO1_IO03的电器属性,地址是0x020e02f4
*bit0: 0低速率
*bit5:3: 110 R0/6驱动能力
*bit7:6: 10 100MHz速度
*bit11: 0关闭开路输出
*bit12: 1 使能pull/kepper
*bit13: 0 kepper
*bit15:14: 00 100k下拉
*bit16: 0 关闭hys
*/
ldr r0, =0x020e02f4 @地址
ldr r1, =0x10b0
str r1, [r0]
/* 设置GPIO1_GDIR寄存器,设置GPIO_GPIO03为输出 */
ldr r0, =0x0209c004
ldr r1, =0x08
str r1, [r0]
/* 打开LED,也就是设置GPIO_IO03为低电平
*GPIO_DR的地址为0x0209c000
*/
ldr r0, =0x0209c000
ldr r1, =0x00
str r1, [r0]
loop:
b loop @死循环,防止程序结束
arm-linux-gnueabihf-gcc -g -c led.s led.o
将.c 和.s 文件变为.oarm-linux-gnueabihf-ld -Ttext 0X87800000 led.o -o led.elf
将.o文件链接为elf格式的可执行文件,链接时需要指定链接的起始地址。对于6ULL,链接其实地址应该指向RAM地址,而不是存在内部flash。RAM分为内部0x900000~0x91ffff,也可以是外部DDR,对于ALPHA,选择0x87800000。要使用DDR,必须要初始化DDR。对于IMX,bin文件不能直接烧写到SD卡、EMMC、NAND等外置存储中,然后从这些外置存储中启动运行,需要添加一个头部,这个头部包含了DDR的初始化参数arm-linux-gnueabihf-objcopy -O binary -S -g led.elf led.bin
将elf文件转为bin文件arm-linux-gnueabihf-objdump -D led.elf > led.dis
将elf文件转为汇编、反汇编文件可以直接编写makefile文件,直接通过make指令编译,这里就不详细说明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
烧写不是将bin文件拷贝到SD卡中,而是将bin文件烧写到SD卡的绝对路径下。而且对于IMX,不能直接烧写bin问价,需要使用imxdownload软件。使用方法:确定要烧写的SD卡文件,给予imxdownload可执行权限chmod 777 imxdownload
。然后就./imxdownload led.bin /dev/sdf
。会向led.bin添加一个头部,并且生成一个新的imx文件,将新的文件烧写到SD卡中