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格式:纯二进制指令(像直接的文章内容)
-
-
比喻:把带目录的书去掉封面目录,只留正文
-
作用:逆向翻译官
-
功能:把机器码翻译回汇编语言
-
用途:调试、学习、分析
-
比喻:把英文书翻译回中文,方便理解
-
任务:
-
收集所有
.o文件 -
分配内存地址
-
解决"谁调用谁"的问题
-
-
输出 :
.elf文件(完整的书) -
比喻:把各章草稿装订成完整书籍
4. 交叉编译工具链安装
(1)工具链文件
- 文件:
gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf.tar.xz
(2)安装步骤
-
拷贝到
/usr/local/arm -
解压:
sudo tar -xvf gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf.tar.xz -
删除压缩包:
sudo rm gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf.tar.xz -
配置环境变量:
export PATH=$PATH:/usr/local/arm/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/bin/ -
重启虚拟机:
reboot -
验证安装:
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++) {
// 空循环,消耗时间
}
延时精度问题
-
影响因素:
-
CPU主频
-
编译器优化
-
内存速度
-
-
改进:使用硬件定时器
五、开发流程理论总结
1. 完整开发流程
写代码 → 交叉编译 → 生成二进制 → 烧录 → 上电运行
↑ ↑ ↑ ↑ ↑
编辑器 编译器 转换器 烧录器 开发板
2. 地址空间映射
| 地址范围 | 内容 | 加载时机 |
|---|---|---|
| 0x80000000 | DDR起始 | 上电后 |
| 0x87800000 | 程序加载地址 | 链接时指定 |
| 0x020C4000 | GPIO寄存器 | 硬件固定 |
3. 启动方式选择原理
BOOT模式拨码开关
拨码开关 → 选择启动介质 → CPU从该介质加载程序
↓ ↓ ↓
物理开关 SD卡/eMMC 读取第一个程序
4. 调试理论
常用调试方法:
-
LED调试法:用LED灯显示状态
-
串口打印法:通过串口输出信息
-
仿真器调试:硬件单步执行
问题诊断流程:
现象 → 假设 → 验证 → 结论
LED不亮 → 程序没运行 → 检查SD卡 → 启动方式错误
六、重要概念对照表
| 新手理解 | 专业术语 | 实际含义 |
|---|---|---|
| 大脑 | CPU | 中央处理器 |
| 短期记忆 | RAM | 随机存取存储器 |
| 长期记忆 | eMMC | 嵌入式多媒体卡 |
| 开关 | GPIO | 通用输入输出 |
| 多功能厅 | IOMUXC | 输入输出复用控制器 |
| 翻译官 | 编译器 | 代码转换工具 |
| 装订员 | 链接器 | 目标文件合并工具 |
| 房间号 | 内存地址 | 存储位置标识 |