开发环境
Ubuntu虚拟机
正点原子Linux-mini开发板
芯片I.MX6UL
内核Cortex-A7
参考手册
开发流程
新建
/*
- 描述: _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]
/*
将led.s编译为.o文件 arm-linux-gnueabihf-gcc -g -c led.s -o led.o
链接
链接文件,将众多的.o文件链接到一个指定的链接位置,即指定生成的可执行文件的运行起始地址
- IMX6U支持SD卡、EMMC、NAND启动,因此代码可以存储到SD卡、EMMC、NAND中,但是运行的话,必须将代码从SD卡、EMMC、NAND中拷贝到运行地址(链接地址),这个链接地址可以是芯片内的RAM中,也可以是外部的DDR中
- 链接命令 arm-linux-gnueabihf-ld -Ttext 0X87800000 led.o -o led.elf
这里-Ttext指定地址0X87800000,-o指定链接生成名
转换
烧录还需要将.elf文件转换为.bin文件
- arm-linux-gnueabihf-objcopy -O binary -S -g led.elf led.bin
-O指定以二进制binary格式输出,-S不复制源文件的重定位信息和符号信息,-g不复制源文件调试信息
反汇编
arm-linux-gnueabihf-objdump -D led.elf > led.dis
- -D反汇编所有段
- 可以方便调试
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
执行make完成编译
-
代码烧录
使用SD卡
NXP严格规定SD卡存放位置和存放方式
使用imxdownload烧写.bin到SD卡
imxdownload.rar 传输到工程根目录下,和.bin同一级
- 给予imxdownload可执行权限仅需一次即可
- chmod 777 imxdownload
- 此时imxdownload文件颜色从白色变为绿色
- 空SD卡
- 插入前 ls /dev/sd* 查看已有SD设备
- 插入后 选择虚拟机读取SD卡 ls /dev/sd* 有新SD设备添加(选用USB口,不要用电脑内置SD卡槽)
- ./imxdownload <.bin file>
- 例如:./imxdownload led.bin /dev/sdd
- 输入密码
- 烧写速度为几百k为正常速度,否则烧写失败,失败原因检查设备名称是否错误,或者重启Ubuntu尝试
生成load.imx文件,这个文件就是已经烧写到SD卡中的程序
代码运行
SD卡插入开发板卡槽
- 通电,复位