文章目录
- 一、驱动编写
- 1.1 配置GPIO的电气属性
- 1.2 配置GPIO的功能(GDIR寄存器)
- 1.3 设置输出(DR寄存器)
- 1.4 最终代码
- 二、编译程序
- 2.1 编译程序
- 2.2 链接文件
- 2.3 格式转换成BIN文件
- 2.4 反汇编
- 三、烧写bin到SD卡中并运行
- 3.1 准备工作
- 3.2 向SD卡烧写bin文件
- 3.3 插入阿尔法的tf卡槽
- 四、makefile的补充
- 五、其他
一、驱动编写
1.1 配置GPIO的电气属性
Bit0: 0 低速率
bit5:3: 110 R0/6驱动能力
bit7:6: 10 100MHZ速度
bit11: 0 关闭开路输出
bit12: 1 使能pull/keeper
bit13: 0 keeper
bit15:14 00 100K下拉
bit16: 0 关闭迟滞
根据设置换算成十六进制
/*配置GPIO的电气属性
即,设置寄存器:IOMUXC_SW_PAD_CTL_PAD_GPIO1_IO03
地址为:0X020E02F4
Bit0: 0 低速率
bit5:3: 110 R0/6驱动能力
bit7:6: 10 100MHZ速度
bit11: 0 关闭开路输出
bit12: 1 使能pull/keeper
bit13: 0 keeper
bit15:14 00 100K下拉
bit16: 0 关闭迟滞
*/
ldr r0, =0X020E02F4
ldr r1, =0X10B0
str r1, [r0]
1.2 配置GPIO的功能(GDIR寄存器)
GDIR,共32位,每一位控制一个GPIO
/*
设置GPIO1_GDIR寄存器,设置GPIO1_GPIO03为输出
GPIO1_GDIR寄存器地址为209_C004,设置GPIO1_GDIR寄存器bit3为0
也就是设置GPIO1_GPIO03为输出
*/
ldr r0, =0x0209C004
ldr r1, =0x8
str r1, [r0]
1.3 设置输出(DR寄存器)
/*
LED点亮,设置输出为0
也就是设置DR寄存器
*/
ldr r0, =0x0209C000
ldr r1, =0
str r1, [r0]
loop:
b loop @死循环
1.4 最终代码
.global _start @全局标号
_start:
/*使能所有寄存器*/
ldr r0, =0x020C4068 @写入CCGR0的地址
ldr r1, =0xFFFFFFFF @要写入的数据(全部使能)
str r1, [r0] @写入CCGR0
ldr r0, =0x020C406C @写入CCGR1的地址(由于CCGR都是紧挨着的,每个间隔4位)
str r1, [r0] @写入CCGR1
ldr r0, =0x020C4070 @写入CCGR2的地址
str r1, [r0] @写入CCGR2
ldr r0, =0x020C4074 @写入CCGR3的地址
str r1, [r0] @写入CCGR3
ldr r0, =0x020C4078 @写入CCGR4的地址
str r1, [r0] @写入CCGR4
ldr r0, =0x020C407C @写入CCGR5的地址
str r1, [r0] @写入CCGR5
ldr r0, =0x020C4080 @写入CCGR6的地址
str r1, [r0] @写入CCGR6
/*配置GPIO1_3,使复用方式变为GPIO
写入0101,即5
寄存器是IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO03
*/
ldr r0, =0x020E0068 @写入IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO03的地址
ldr r1, =0x5 @要写入的数据
str r1, [r0] @写入
/*配置GPIO的电气属性
即,设置寄存器:IOMUXC_SW_PAD_CTL_PAD_GPIO1_IO03
地址为:0X020E02F4
Bit0: 0 低速率
bit5:3: 110 R0/6驱动能力
bit7:6: 10 100MHZ速度
bit11: 0 关闭开路输出
bit12: 1 使能pull/keeper
bit13: 0 keeper
bit15:14 00 100K下拉
bit16: 0 关闭迟滞
*/
ldr r0, =0x020E02F4
ldr r1, =0x10B0
str r1, [r0]
/*
设置GPIO1_GDIR寄存器,设置GPIO1_GPIO03为输出
GPIO1_GDIR寄存器地址为209_C004,设置GPIO1_GDIR寄存器bit3为0
也就是设置GPIO1_GPIO03为输出
*/
ldr r0, =0x0209C004
ldr r1, =0x8
str r1, [r0]
/*
LED点亮,设置输出为0
也就是设置DR寄存器
*/
ldr r0, =0x0209C000
ldr r1, =0
str r1, [r0]
loop:
b loop @死循环
二、编译程序
2.1 编译程序
- 使用arm-linux-gnueabihf-gcc,将.c.s文件变为.o文件
- 将所有的.o文件连接为elf格式的可执行文件。
- 将elf文件转为bin文件。
- 将elf文件转为汇编,反汇编。
输入指令,编译文件
arm-linux-gnueabihf-gcc -g -c leds.s -o led.o
其中 ““-g”选项是产生调试信息 GDB能够使用这些调试信息进行代码调试。“ “-c”选项是编译源文件,但是不链接。
2.2 链接文件
arm-linux-gnueabihf-ld用来将众多的 .o文件链接到一个指定的链接位置。
链接就是将所有.o文件链接在一起,并且链接到指定的地方。本实验链接的时候要指定链接起始地址。链接起始地址就是代码运行的起始地址。
对于6ULL来说,链接起始地址应该指向RAM地址。RAM分为内部RAM和外部RAM.也就是DDR。6ULL内部RAM地址范围0X900000 ~ 0X91FFFF。也可以放到外部DDR中,对于IMX6U-ALPHA开发板,512MB字节DDR版本的核心板,DDR范围就是0X80000000 ~ 0X9 FFFFFFF。对于256MB的DDR来说,那就是0X80000000~0X8 FFFFFFF。
本系列视频,裸机代码的链接起始地址为0X87800000。要使用DDR,那么必须要初始化DDR,对于IMX来说BIN如文件不能直接运行,需要添加一个头部,这个头部信息包含了DDR的初始化参数,I.MX系列SOC内部boot rom会从SD卡,EMMC等外置存储中读取头部信息,然后初始化DDR,并且将BIN如文件拷贝到指定的地方。BIN的运行地址一定要和链接起始地址一致。位置无关代码除外。
总结,就是I.MX有内部ram但是只有128k,但是外部可用的DDR,足足有512MB,所以放到DDR。
然后初始化,可以从外置存储中获取初始化参数
指令
arm-linux-gnueabihf-ld -Ttext 0X87800000 led.o -o led.elf
上述命令中 -Ttext就是指定链接地址,“-o”选项指定链接生成的 elf文件名
2.3 格式转换成BIN文件
arm-linux-gnueabihf-objcopy更像一个格式转换工具,我们需要用它将 led.elf文件转换为led.bin文件,命令如下:
指令
arm-linux-gnueabihf-objcopy -O binary -S -g led.elf led.bin
上述命令中,“ ,“-O”选项指定以什么格式输出,后面的 binary”表示以二进制格式输出选项“ “-S”表示不要复制源文件中的重定位信息和符号信息 ,“-g”表示不复制源文件中的调试信息。
2.4 反汇编
大多数情况下我们都是用 C语言写试验例程的,有时候需要查看其汇编代码来调试代码,因此就需要进行反汇编,一般可以将 elf文件反汇编
指令
arm-linux-gnueabihf-objdump -D led.elf > led.dis
上述代码中的“ “-D”选项表示反汇编所有的段
三、烧写bin到SD卡中并运行
3.1 准备工作
6U儿L支持SD卡、EMMC、NAND、nor、SPIf1ash等等启动。裸机例程选择烧写到SD卡里面。
在ubuntu下向SD卡烧写裸机bin文件。烧写不是将bin文件拷贝到SD卡中,而是将bin文件烧写到SD卡绝对地址上。而且对于lM仪而言,不能直接烧写bin文件,比如先在bin文件前面添加头部。完成这个工作,需要使用正点原子提供的imxdownload软件。·
首先就是对TF卡进行格式化FAT32
,
最右边这个图标,右键,连接,
此时,TF卡进入了linux系统
再把imdounload放入文件夹
imxdownload使用方法,确定烧写的SD卡,确定是/dev/sdb
3.2 向SD卡烧写bin文件
所以我的指令是:
./imxdownload led.bin /dev/sdb
实际上生成了load.imx文件,里面有头部文件
3.3 插入阿尔法的tf卡槽
使用SD卡时,编码器如下
成功点亮
四、makefile的补充
led.bin : leds.s
arm-linux-gnueabihf-gcc -g -c leds.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,就会执行
输入make clean,就会清空
五、其他
嵌入式开发,不使用JLINK
使用点灯、串口进行调试