开发环境

Ubuntu虚拟机
正点原子Linux-mini开发板
芯片I.MX6UL
内核Cortex-A7

参考手册

《 I.MX6UL参考手册》

开发流程

新建

  1. 新建leds文件夹
  2. 新建Vscode工程
  3. 新建led.s汇编文件

    编写

  4. 编写汇编文件 ```css .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 ```

    编译

  1. 将led.s编译为.o文件 arm-linux-gnueabihf-gcc -g -c led.s -o led.o

    链接

  2. 链接文件,将众多的.o文件链接到一个指定的链接位置,即指定生成的可执行文件的运行起始地址

  3. IMX6U支持SD卡、EMMC、NAND启动,因此代码可以存储到SD卡、EMMC、NAND中,但是运行的话,必须将代码从SD卡、EMMC、NAND中拷贝到运行地址(链接地址),这个链接地址可以是芯片内的RAM中,也可以是外部的DDR中
  4. 链接命令 arm-linux-gnueabihf-ld -Ttext 0X87800000 led.o -o led.elf
  5. 这里-Ttext指定地址0X87800000,-o指定链接生成名

    转换

  6. 烧录还需要将.elf文件转换为.bin文件

  7. arm-linux-gnueabihf-objcopy -O binary -S -g led.elf led.bin
  8. -O指定以二进制binary格式输出,-S不复制源文件的重定位信息和符号信息,-g不复制源文件调试信息

    反汇编

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

  10. -D反汇编所有段
  11. 可以方便调试

    Makefile

    自动流程
  • touch新建Makefile文件
  • 编写Makefile

    1. led.bin:led.s
    2. arm-linux-gnueabihf-gcc -g -c led.s -o led.o
    3. arm-linux-gnueabihf-ld -Ttext 0X87800000 led.o -o led.elf
    4. arm-linux-gnueabihf-objcopy -O binary -S -g led.elf led.bin
    5. arm-linux-gnueabihf-objdump -D led.elf > led.dis
    6. clean:
    7. rm -rf *.o led.bin led.elf led.dis
  • 执行make完成编译

  • make clean清理工程

    代码烧录

    使用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卡插入开发板卡槽

  • 通电,复位