嵌入式学习——ARM(3)

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。
  • (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
相关推荐
gscsded8 小时前
MCUboot裸机移植实战
单片机·嵌入式硬件·arm
想喝奶茶啾啾8 小时前
AMBA CHI架构以及规范中使用的术语 翻译笔记(1)
笔记·arm·chi
susplus1 天前
【IMX6ULL Linux系统移植】内核编译裁剪 + rootfs 构建 + 完整启动流程梳理
linux内核·arm·rootfs·linux启动
susplus3 天前
【IMX6ULL Linux系统移植】SD卡分区 | uboot详解
linux·arm·u-boot
剑指offer.7 天前
ARM裸机开发-SPI
arm开发·嵌入式硬件·嵌入式·arm
susplus10 天前
【ARM 裸机开发 (IMX6ULL-mini)】I2C协议详解
嵌入式·arm·i2c
今年下半年11 天前
【运维】windows虚拟机安装arm(aarch64)服务器
运维·windows·arm·虚拟机·aarch64
额额额对了12 天前
SPI通信
linux·c语言·汇编·单片机·嵌入式硬件·arm
一直C12 天前
【ARM嵌入式开发】LCD液晶屏显示原理、色彩模式与显存地址映射详解
lcd·嵌入式·arm·寄存器·cortex-a7
susplus12 天前
【ARM 裸机开发 (IMX6ULL-mini)】PWM 背光调节与 GT9147 多点触摸驱动
lcd·arm·多点触控·pwm背光调节