
Makefile
步骤
(1)使用arm-linux-gnueabihf-gcc只汇编不链接
arm-linux-gnueabihf-gcc -c start.S -o start.o -g
(2)使用arm-linux-gnueabihf-ld链接代码到特定地址(得到可执行,可连接程序linux executable linkable file)
arm-linux-gnueabihf-ld -Ttext 0x87800000 start.o -o start.elf
(3)使用arm-linux-gnueabihf-objcopy 格式转换
arm-linux-gnueabihf-objcopy -O binary -S -g start.elf start.bin
(4)使用arm-linux-gnueabihf-objdump 反汇编(此处只是为了阅读代码,非必要步骤)
arm-linux-gnueabihf-objdump -D start.elf > start.dis
-c:只汇编不连接
-g:去掉调试信息
-Ttext:指定安装位置
-O:指定输出文件格式
-S:去掉符号信息
-D:反汇编
>:重定向
代码

在makefile中,引用变量需要用$(变量名)
冒号左侧为目标文件,右侧为依赖文件
LED
原理图


右侧为网络标号,左侧为SOC引脚的物理名称
所需引脚GPIO
General Purpose Input/Output,通用输入输出


注:PAD为物理引脚,梯形为IOMUX
对于复杂SOC,对于一个引脚,需要进行交叉复用功能设置,对于一个引脚。可能有多种功能,同一时刻只能使用一种,需要提前配置。图中的IOMUXC输入输出复用控制器就是来控制所有外设,类似于单刀多置开关,多个输入一个输出。
所需寄存器



其中Reserved表示保留,即不做任何改动


代码
基本写法


汇编调用C语言

由于GPIO中状态寄存器的地址连续,所以定义类型指针,这种类型偏移量为4,定义总的结构体把这些类型放里面,所以可以改成下图


时钟配置


Makefile
然而在最开始中的makefile中没有C文件,只有S文件,所以要对makefile再次配置

%:通配符,表示任意字符序列
$@:目标生成文件
$^:所有依赖文件
手册写法
在手册中,对于引脚等配置有专属的函数

注意:复用函数的0是填充无实际功能的寄存器保留位,而电气函数的非0值是配置GPIO 正常工作必需的硬件特性(如上拉、驱动能力),因此一个为0一个不为0
BSP板级支持包工程管理
到目前,我们将所有的源码文件都放到工程根目录下,即使这个工程只是完成了一个简单的流水灯的功能,但是其工程根目录下的源码文件就已经不少了。如果在添加一些其他的功能文件,那么文档就会更大,显得很混乱,所以我们需要对这个工程进行整理,将源码文件分模块、分功能整理。
这里我们把这些文件分为4类,并保存到4个不同的文件夹里。首先在新的工程文件夹里创建一个名为bsp文件夹,之后我们编写的类似led驱动,clk驱动等等外设驱动程序都放在这个文件夹里面;再创建一个project文件夹,存放 start.s和 main.c 文件,也就是应用文件; 一个imx6ul文件夹,用来保存NXP提供的相关库,如cc.h、fsl_common.h、fsl_iomuxc.h 和 MCIMX6Y2.h 这四个文件;最后再创建一个obj文件夹 用来存放编译生成的.o 文件。
文件夹建立好之后,就可以把我们之前写的代码重构一下了。在bsp文件夹中创建led.c和led.h,将有关led的函数分别放在这两个文件里定义和声明;再bsp文件夹中创建clk.c和clk.h,CCM初始化函数放在这两个文件中定义和声明。最后把之前写好的链接脚本文件imx6ul.lds和Makefile文件考本到工程根目录下。由于我们的程序文件现在分散在多个不同的目录中,因此Makefile必须能够找到这些文件。
优化Makefile
