IMX6ULL开发板即正点原子的阿尔法(ALPHA)开发板,采用恩智浦芯片,cortex-A7架构的。
对于IMX6ULL芯片,一个IO对应两个寄存器,第一个寄存器负责配置其复用功能,第二个寄存器负责配置其电器特性。
如下命名方式:
IOMUXC_SNVS_SW_ MUX _CTL_PAD_BOOT_MODE0 //配置其复用功能IOMUXC_SNVS_SW_ PAD _CTL_PAD_BOOT_MODE0 //配置电器特性
查找IO 复用功能的方法:
(1) 打开IMX6ULL芯片的参数手册。
(2) 第32章IO复用章节。
(3) 查找对应的管脚。
为什么要学习Cortex-A汇编?
(1) 需要用汇编初始化一些SOC外设。
(2) 使用汇编初始化DDR,I.MX6U不需要。
(3) 设置 sp 指针,一般指向 DDR,配置好 C 语言运行环境。
(1) 使能时钟。
CCGR0~CCGR6这7个寄存器控制着6ULL所有外设时钟的使能。
为了简单,设置 CCGR0~CCGR6 这7个寄存器全部为0XFFFFFFFF,相当于使能所有外设时钟。
(2) 设置GPIO复用 。
将寄存器IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO03的bit3~0设置为0101,这样GPIO1_IO03就复用为GPIO。
(3) 设置GPIO的电器属性。
寄存器IOMUXC_SW_PAD_CTL_PAD_GPIO1_IO03是设置GPIO1_IO03的电气属性。包括压摆率、速度、驱动能力、开漏、上下拉等。
(4) 配置GPIO为输入/输出功能。
设置 GPIO1_GDR 寄存器 bit3 为1,即设置为输出模式。为 0 则设置为输入模式(由电路原理图可知)。
最后,以上初始化操作结束之后,即可设置LED的亮灭。
设置 GPIO1_DR 寄存器的 bit 3位。为 0 则 LED灯亮,为1则 LED灯灭(由底板LED 电路原理图可知)。
(1) 使用 arm-linux-gnueabihf-gcc,将.c 文件或 .s 文件变为 .o文件。
(2) 将所有的.o文件链接为elf格式的可执行文件。
(3) 将elf 文件转为 bin 文件。
链接就是将所有.o文件链接在一起,并且链接到指定的地方。本实验链接的时候要指定链接起始地址。链接起始地址就是代码运行的起始地址。
对于IMX6ULL来说,链接起始地址应该指向RAM地址。RAM分为内部RAM和外部RAM,也就是 DDR。IMX6ULL内部RAM地址范围0X900000~0X91FFFF。也可以放到外部DDR中。
对于I.MX6U-ALPHA开发板,512MB字节DDR版本的核心板,DDR范围就是0X80000000~0X9FFFFFFF。对于256MB的DDR来说,那就是0X80000000~0X8FFFFFFF。
arm-linux-gnueabihf -g -c leds.s -o led.o
arm-linux-gnueabihf-ld -Ttext 0X87800000 led.o -o led.elf
注意:Bin 的运行地址一定要和链接起始地址一致。位置无关代码除外。
arm-linux-gnueabihf-objcopy -O binary -S -g led.elf led.bin
以上的编译工作也可以直接写 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
以上是 Makefile 文件内容,可以终端直接输入 "make" 命令进行编译。