嵌入式学习——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 #0x12ldr sp, =0x820000000cps #0x1Fldr sp, =0x840000000cpsie 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
相关推荐
学linux的QQ蛋2 小时前
i.MX6ULL GIC 中断整体知识点总结和ARM时钟重点总结
arm·时钟·中断
G.E.M.小白4 小时前
【IMX6ULL ARM内核启动与时钟系统超详解】PLL/PFD/分频/根时钟配置
嵌入式·arm·时钟·imx6ull
koi77u18 小时前
嵌入式学习——ARM(1)
arm
myy-learn1 天前
ARM-点亮第一颗LED
arm
zbyyd1 天前
i.MX6ULL 裸机开发进阶|C 驱动、SDK、BSP 工程、链接脚本
arm
一直C1 天前
ARM裸机开发|IMX6ULL GIC中断详解,中断流程、GIC版本分类、CP15协处理器
arm·imx6ull·寄存器
myy-learn1 天前
ARM-复用寄存器以及电气寄存器深化-蜂鸣器
arm
祖力551 天前
ARM中断(IMX6ULL中断、GIC通用中断控制器)
嵌入式硬件·arm·imx6ull·中断·gic·通用中断控制器
susplus2 天前
【ARM 裸机开发 (IMX6ULL-mini)】GNU工具、Makefile 工程构建、链接脚本详解|C 语言点灯 + 蜂鸣器驱动
linux·arm·makefile·imx6ull