ARM 嵌入式开发学习笔记:从内核到外设

一、开发板介绍

1. IMX6ULL-Mini开发板概述

IMX6ULL-Mini开发板是由正点原子提供的嵌入式开发平台,搭载NXP生产的i.MX6ULL系统级芯片(SoC),具有高性能、低功耗和紧凑体积的特点。

2. 硬件组成

(1)核心板
  • 六层PCB设计

  • CPU:NXP i.MX 6ULL Cortex-A7单核处理器

    • 主频:528MHz(工业级)或 800MHz(商业级)

    • 封装:467引脚BGA

  • 内存:512MB DDR3L RAM,支持高速数据存取

  • 存储:8GB eMMC,支持多种启动模式(SD卡、NAND、eMMC)

  • 显示屏:支持4.3寸屏,800×480分辨率

(2)底板
  • 通过双列直插方式与核心板连接

  • LED模块

    • 红色LED:用户可控指示灯

    • 蓝色LED:电源指示灯

    • 510Ω限流电阻:防止电流过大,保护LED灯珠

3. 相关术语

  • Cortex-A7:ARM公司设计的处理器核心架构

  • i.MX6ULL:NXP公司生产的系统级芯片(SoC)

  • IMX6ULL-Mini:正点原子基于i.MX6ULL设计的开发板

二、开发环境搭建

1. 软件工具安装

(1)Visual Studio Code
  • 安装Arm Assembly插件,支持汇编语法高亮

(2)创建工程目录
D:\IMX6ULL\led_asm
(3)创建启动文件
  • 文件名:start.S(注意大写S后缀,会进行预处理)

2. 为什么需要交叉编译?

场景 原因 比喻
Windows开发 电脑是x86架构 中国人写英文文章
ARM运行 开发板是ARM架构 美国人读英文文章
交叉编译 在x86上编译ARM程序 中国人用翻译器写英文文章

3. 工具链组件功能说明

(1)编译器(arm-linux-gnueabihf-gcc)
  • 作用:翻译官,把人类写的代码翻译成机器代码

  • 输入.c文件(C语言)或.S文件(汇编语言)

  • 输出.o文件(目标文件)

  • 比喻:把中文小说翻译成英文草稿

  • 作用:装订员,把所有章节装订成书

  • 作用:格式转换专家

  • 转换elf → bin

  • 区别

    • ELF格式:包含地址、调试信息(像带目录的书)

    • BIN格式:纯二进制指令(像直接的文章内容)

  • 比喻:把带目录的书去掉封面目录,只留正文

  • 作用:逆向翻译官

  • 功能:把机器码翻译回汇编语言

  • 用途:调试、学习、分析

  • 比喻:把英文书翻译回中文,方便理解

  • 任务

    1. 收集所有.o文件

    2. 分配内存地址

    3. 解决"谁调用谁"的问题

  • 输出.elf文件(完整的书)

  • 比喻:把各章草稿装订成完整书籍

4. 交叉编译工具链安装

(1)工具链文件
  • 文件:gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf.tar.xz

(2)安装步骤
  1. 拷贝到 /usr/local/arm

  2. 解压:sudo tar -xvf gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf.tar.xz

  3. 删除压缩包:sudo rm gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf.tar.xz

  4. 配置环境变量:

    export PATH=$PATH:/usr/local/arm/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/bin/
  5. 重启虚拟机:reboot

  6. 验证安装:arm-linux-gnueabihf-gcc -v

三、ARM架构基础理论

1. ARM工作模式(简单理解)

模式 用途 比喻
系统模式 正常程序运行 正常办公状态
IRQ模式 处理中断 接电话状态
FIQ模式 处理快速中断 紧急呼叫状态
用户模式 用户程序运行 访客权限状态

2. 寄存器 - CPU的工作台

(1)通用寄存器
  • R0-R12:普通工作台,放临时数据

  • 比喻:桌子上的草稿纸

(2)特殊寄存器
  • R13(SP):栈指针,标记数据堆叠位置

  • R14(LR):链接寄存器,记住返回地址

  • R15(PC):程序计数器,记录执行到哪一行

  • 比喻

    • SP:书签,标记看到哪一页

    • LR:便签,标记要回到哪一页

    • PC:手指,指着当前读的哪一行

3. 内存地址空间

0x80000000 - 0x9FFFFFFF:DDR内存(512MB)
   像:房间号80000000到9FFFFFFF的大房间

0x020C4000 - 0x020CFFFF:GPIO控制器
   像:专门控制灯的开关房间

4. GPIO控制原理

引脚控制的三个步骤:

第一步:设置引脚功能(我是谁?)

问:这个引脚是干嘛的?
答:我是控制LED灯的引脚(不是串口,不是I2C)
配置:设置成GPIO功能

第二步:设置引脚方向(我能干什么?)

问:这个引脚是输入还是输出?
答:输出(要控制LED亮灭)
配置:设置为输出模式

第三步:设置引脚状态(我现在要干什么?)

问:输出高电平还是低电平?
答:高电平 → LED亮
    低电平 → LED灭
配置:设置对应电平

四、外设控制理论

1. 寄存器操作基本概念

(1)什么是寄存器?
  • 定义:CPU内部的小存储单元

  • 大小:通常32位(4字节)

  • 特点:每个位都有特定含义

(2)寄存器操作三板斧
// 1. 读-改-写模式(最常用)
value = 读寄存器();
value = value | 0x01;  // 设置某位
写寄存器(value);

// 2. 直接赋值
写寄存器(0xFFFFFFFF);

// 3. 位清除
value = 读寄存器();
value = value & ~0x01;  // 清除某位
写寄存器(value);

2. IOMUXC(引脚复用控制器)

为什么要引脚复用?
  • 问题:芯片引脚有限,功能很多

  • 解决方案:一个引脚多种功能,需要时切换

  • 比喻:多功能厅,可以开会、吃饭、跳舞

配置方法:
设置IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO03的[3:0]位
0001:GPIO功能
0101:另一个功能
1001:又一个功能

3. 延时函数原理

软件延时
for(int i=0; i<1000000; i++) {
    // 空循环,消耗时间
}
延时精度问题
  • 影响因素

    1. CPU主频

    2. 编译器优化

    3. 内存速度

  • 改进:使用硬件定时器


五、开发流程理论总结

1. 完整开发流程

写代码 → 交叉编译 → 生成二进制 → 烧录 → 上电运行
    ↑          ↑         ↑         ↑         ↑
   编辑器    编译器    转换器    烧录器    开发板

2. 地址空间映射

地址范围 内容 加载时机
0x80000000 DDR起始 上电后
0x87800000 程序加载地址 链接时指定
0x020C4000 GPIO寄存器 硬件固定

3. 启动方式选择原理

BOOT模式拨码开关
拨码开关 → 选择启动介质 → CPU从该介质加载程序
   ↓            ↓              ↓
物理开关     SD卡/eMMC     读取第一个程序

4. 调试理论

常用调试方法:
  1. LED调试法:用LED灯显示状态

  2. 串口打印法:通过串口输出信息

  3. 仿真器调试:硬件单步执行

问题诊断流程:
现象 → 假设 → 验证 → 结论
LED不亮 → 程序没运行 → 检查SD卡 → 启动方式错误

六、重要概念对照表

新手理解 专业术语 实际含义
大脑 CPU 中央处理器
短期记忆 RAM 随机存取存储器
长期记忆 eMMC 嵌入式多媒体卡
开关 GPIO 通用输入输出
多功能厅 IOMUXC 输入输出复用控制器
翻译官 编译器 代码转换工具
装订员 链接器 目标文件合并工具
房间号 内存地址 存储位置标识

Logo

助力广东及东莞地区开发者,代码托管、在线学习与竞赛、技术交流与分享、资源共享、职业发展,成为松山湖开发者首选的工作与学习平台

更多推荐