LED 实验
1. 开发板介绍
- (1) IMX6ULL-Mini 开发板由正点原子提供,搭载 NXP 生产 i.MX6ULL 的 SOC,主打高性能、低功耗与紧凑体积。
- (2) 整个开发板由核心板与底板组成,核心板通过双列直插方式与底板连接。
- (3) 核心板(六层板):
- CPU:NXP i.MX 6ULL Cortex-A7 单核处理器,主频 528MHz(工业级)或 800MHz(商业级),BGA 封装;
- 内存:512MB DDR3L RAM,支持高速数据存取;
- 存储:8GB eMMC,支持多种启动模式(SD 卡、NAND、eMMC);
- 屏幕:4.3 寸屏 800*480 分辨率。
- (4) 底板(看了 LED 模块):
- 红色 led 灯提供用户可控的 LED 灯;
- 蓝色 led 灯是电源指示灯;
- 510 欧姆限流电阻作用:防止电流过大保护灯珠。
- 关系:Cortex-A7 核心设计:ARM;i.MX6ULL SOC:NXP;IMX6ULL-Mini 开发板:正点原子。
2. 开发工具下载
- (1) 安装 Visual Studio Code,汇编高亮插件:Arm Assembly。
- (2) 创建工程文件夹 D:\IMX6ULL\led_asm。
- (3) 创建启动代码 start.S(注意大写 S 后缀,会进行预处理,后期用到一些宏)。
3. 编写启动代码
- (1)
.global _start;rom:0x8000 0000,size:512M。 - (2) cps 指令:
CPS<effect> <iflags>{, #<mode>}/CPS #<mode>- 示例:
cpsid i(i f a)、cps #0x12、ldr sp, =0x820000000、cps #0x1F、ldr sp, =0x840000000、cpsie i
4. 点亮 LED 灯
- (1)查阅手册(参考文档:IMX6ULL_MINI_V2.2(Mini 底板原理图).pdf、IMX6ULL 参考手册.pdf)
- (1) 初始化:
- ① 复用功能配置:Chapter 32:IOMUX Controller (IOMUXC),IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO03:低四位(0101);
- ② 电气特性:Chapter 32:IOMUX Controller (IOMUXC),IOMUXC_SW_PAD_CTL_PAD_GPIO1_IO03;
- ③ GPIO 方向寄存器:Chapter 28:General Purpose Input/Output (GPIO),GPIOx_GDIR。
- (2) 运行时开关灯:
- GPIO 数据寄存器:Chapter 28:GPIO,GPIOx_DR。
- (1) 初始化:
- (2)修改外设寄存器:
-
LDR 指令格式:
LDR<c> <Rt>, [<Rn>{, #+/-<imm12>}]、LDR<c> <Rt>, [<Rn>], #+/-<imm12>、LDR<c> <Rt>, [<Rn>, #+/-<imm12>]!、LDR<c> <Rt>, <label>、LDR<c> <Rt>, [PC, #-0]、LDR<c> <Rt>, [<Rn>,+/-<Rm>{, <shift>}]{!}、LDR<c> <Rt>, [<Rn>],+/-<Rm>{, <shift>}; -
STR 指令格式:
STR<c> <Rt>, [<Rn>{, #+/-<imm12>}]、STR<c> <Rt>, [<Rn>], #+/-<imm12>、STR<c> <Rt>, [<Rn>, #+/-<imm12>]!、STR<c> <Rt>, [<Rn>,+/-<Rm>{, <shift>}]{!}、STR<c> <Rt>, [<Rn>],+/-<Rm>{, <shift>};STRB:STRB<c> <Rt>, [<Rn>{, #+/-<imm12>}]、STRB<c> <Rt>, [<Rn>], #+/-<imm12>、STRB<c> <Rt>, [<Rn>, #+/-<imm12>]!; -
示例:
ldr r0, =0x020C4068 ldr r1, =0xFFFFFFFF str r1, [r0]
-
4. 编译代码
- (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。
5. led.bin 拷贝到 TFcard
- (1) 连接 SD 卡到 Ubuntu:(1) 可移动设备 (2) 右下角图标;
- (2) 查看 /dev:
ls /dev/sdb; - (3) 拷贝下载工具 imxdownload 到 Ubuntu 工程目录下,修改权限:
chmod +777 imxdownload; - (4) 烧写程序到 SD 卡:
./imxdownload start.bin /dev/sdb;注意烧写速度,如果上M的速度是不成功的,必须拔掉 USB 读卡器,重启 Ubuntu。
6. 测试
- (1) 启动方式选择 SD 卡:原理图 BOOT 模块(USB 启动、SD 卡启动、板载 EMMC 启动、nandflash 启动)→ 通过拨码开关选择;
- (2) 插入 SD 卡:查看开发板图找到 TFcard 插入 SD 卡;
- (3) 开发板上电:保证开关弹起的状态下,插上电源适配器,按下旁边蓝色开关,查看蓝色电源灯;
- (4) 观察红色 Led 灯。
7. Makefile 简化编译过程
-
(1) Makefile 的三要素:目标:start.bin,依赖:start.S,规则:如何产生目标:
start.bin : start.S arm-linux-gnueabihf-gcc -c start.S -o start.o -g arm-linux-gnueabihf-ld -Ttext 0x87800000 start.o -o start.elf arm-linux-gnueabihf-objcopy -O binary -S -g start.elf start.bin arm-linux-gnueabihf-objdump -D start.elf > start.dis -
(2) 伪目标 clean(不加依赖):
rm start.o start.elf start.bin start.dis -f; -
(3) 伪目标 load:
./imxdownload start.bin /dev/sdb; -
(4) 优化(存放变量):
COMPLITER = arm-linux-gnueabihf- CC = $(COMPLITER)gcc LD = $(COMPLITER)ld OBJCOPY = $(COMPLITER)objcopy OBJDUMP = $(COMPLITER)objdump start.bin : start.S $(CC) -c start.S -o start.o -g $(LD) -Ttext 0x87800000 start.o -o start.elf $(OBJCOPY) -O binary -S -g start.elf start.bin $(OBJDUMP) -D start.elf > start.dis clean: rm start.o start.elf start.bin start.dis -f load: ./imxdownload start.bin /dev/sdb