58、IMX6ULL 裸机开发实战:从汇编启动代码到 LED 闪烁(Ubuntu 篇)

IMX6ULL 裸机开发实战:从汇编启动代码到 LED 闪烁(Ubuntu 篇)


一、 开发平台与硬件信息

1.1 核心参数

  • 开发板:正点原子 i.MX6ULL-Mini(核心板 + 底板模式)。
  • CPU:NXP i.MX6ULL (Cortex-A7),主频达 800MHz。
  • 内存/存储:512MB DDR3L + 8GB eMMC。
  • 启动方式:支持 SD 卡、eMMC、NAND 等多种模式。

1.2 LED 硬件电路

  • 控制目标:底板上的红色 LED 灯。

  • 引脚连接:GPIO1_IO03。

  • 控制逻辑:共阳极接法。

  • 寄存器输出0(低电平):LED 点亮。

  • 寄存器输出1(高电平):LED 熄灭。

  • 限流电阻:510 欧姆,防止电流过大。


二、 编写汇编启动代码(start.S)

启动代码是系统上电后运行的第一段程序,负责初始化处理器状态、设置堆栈和异常向量表。

2.1 完整汇编逻辑

在 VS Code 中创建start.S,代码如下:

.global _start @ 定义程序入口点 _start: /* 1. 配置异常向量表 */ ldr pc, = _start_handler @ 复位中断 ldr pc, = _undefined_handler @ 未定义指令 ldr pc, = _supervisor_handler @ 软件中断 SWI ldr pc, = _prefetch_handler @ 指令预取中断 ldr pc, = _data_abort_handler @ 数据访问中断 ldr pc, = _not_use_handler @ 未使用 ldr pc, = _irq_handler @ IRQ 中断 ldr pc, = _fiq_handler @ FIQ 中断 /* 异常处理死循环 */ _undefined_handler: b _undefined_handler _supervisor_handler: b _supervisor_handler _prefetch_handler: b _prefetch_handler _data_abort_handler: b _data_abort_handler _not_use_handler: b _not_use_handler _irq_handler: b _irq_handler _fiq_handler: b _fiq_handler _start_handler: /* 2. 中断配置与模式切换 */ cpsid i @ 关闭所有 IRQ 中断 /* 切换到 IRQ 模式并设置栈指针 */ cps #0x12 ldr sp, = 0x82000000 /* 切换到系统(SYS)/用户模式并设置栈指针 */ cps #0x1F ldr sp, = 0x84000000 cpsie i @ 使能中断 /* 3. 跳转到 LED 初始化逻辑 */ bl led_init b finish finish: bl led_on bl led_delay bl led_off bl led_delay b finish /* --- LED 硬件操作函数 --- */ led_init: /* A. 配置引脚复用为 GPIO1_IO03 (MUX 寄存器地址: 0x020E0068) */ ldr r0, = 0x020E0068 ldr r1, = 0x05 @ 模式 5 即 GPIO 功能 str r1, [r0] /* B. 配置电气特性 (PAD 寄存器地址: 0x020E02F4) */ ldr r0, = 0x020E02F4 ldr r1, = 0x10B0 @ 设置上拉、驱动能力等 str r1, [r0] /* C. 配置 GPIO 方向为输出 (GDIR 寄存器) */ ldr r0, = 0x0209C004 ldr r1, [r0] orr r1, r1, #(1 << 3) @ 第 3 位置 1 str r1, [r0] bx lr led_on: /* 操作数据寄存器 DR: 第 3 位写 0 */ ldr r0, = 0x0209C000 ldr r1, [r0] bic r1, r1, #(1 << 3) str r1, [r0] bx lr led_off: /* 操作数据寄存器 DR: 第 3 位写 1 */ ldr r0, = 0x0209C000 ldr r1, [r0] orr r1, r1, #(1 << 3) str r1, [r0] bx lr led_delay: ldr r0, =0x7FFFF loop: sub r0, r0, #1 cmp r0, #0 bgt loop bx lr

三、 硬件初始化原理详解

配置 i.MX6ULL 的外设通常遵循以下三个核心步骤:

  1. 复用功能配置 (IOMUX):芯片引脚很多,一个引脚可以做 GPIO,也可以做 UART 或 I2C。我们需要通过IOMUXC_SW_MUX_CTL_PAD寄存器将其选定为 GPIO。
  2. 电气特性配置 (PAD):通过IOMUXC_SW_PAD_CTL_PAD设置引脚的压摆率、驱动能力、开漏输出以及上下拉电阻。
  3. GPIO 控制器配置
  • GDIR:设置方向。1 为输出,0 为输入。
  • DR:数据寄存器。写 1 输出高电平,写 0 输出低电平。

四、 编译与烧录流程

在 Ubuntu 终端中,我们需要使用 ARM 交叉编译工具链(arm-linux-gnueabihf-)。

4.1 代码编译四部曲

步骤指令作用
1. 编译arm-linux-gnueabihf-gcc -c start.S -o start.o -g生成目标文件.o
2. 链接arm-linux-gnueabihf-ld -Ttext 0x87800000 start.o -o start.elf链接并指定内存起始地址
3. 转换arm-linux-gnueabihf-objcopy -O binary -S -g start.elf start.bin提取可运行的纯二进制文件
4. 反汇编arm-linux-gnueabihf-objdump -D start.elf > start.dis生成反汇编文件用于调试

4.2 程序烧录(写入 SD 卡)

  1. 准备环境:将 SD 卡插入电脑,连接至虚拟机。
  2. 查找设备:使用ls /dev/sd*确认 SD 卡设备节点(通常为/dev/sdb/dev/sdc)。
  3. 赋予工具权限chmod +777 imxdownload
  4. 执行烧录
./imxdownload start.bin /dev/sdb

注意:若烧录速度极快且显示“上M”,通常是卡未挂载成功或节点选错,需重新插拔。


五、 使用 Makefile 简化开发

手动输入命令非常繁琐,我们编写一个 Makefile 来自动化处理。

# 1. 定义变量 CROSS_COMPILE ?= arm-linux-gnueabihf- CC := $(CROSS_COMPILE)gcc LD := $(CROSS_COMPILE)ld OBJCOPY := $(CROSS_COMPILE)objcopy OBJDUMP := $(CROSS_COMPILE)objdump # 2. 默认目标生成 start.bin 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 # 3. 清理中间文件 clean: rm -f start.o start.elf start.bin start.dis # 4. 烧录 load: ./imxdownload start.bin /dev/sdb

使用方法:

  • 输入make:自动完成编译。
  • 输入make load:直接烧录到 SD 卡。
  • 输入make clean:清除冗余文件。

六、 开发板测试

  1. 设置启动拨码:根据底板原理图,将拨码开关调整至SD 卡启动模式(通常是 1-8 位有特定的上下组合)。
  2. 上电:插入 SD 卡,连接电源,按下蓝色电源开关。
  3. 结果:电源指示灯(蓝色)常量,用户指示灯(红色)开始按照设定的延时周期闪烁。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1190802.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【完整版代码】含分布式电源的配电网日前两阶段优化调度模型Matlab代码

✅作者简介&#xff1a;热爱数据处理、建模、算法设计的Matlab仿真开发者。&#x1f34e;更多Matlab代码及仿真咨询内容点击 &#x1f517;&#xff1a;Matlab科研工作室&#x1f34a;个人信条&#xff1a;格物致知,完整Matlab代码获取及仿真咨询内容私信。&#x1f447; 关注我…

如何自动化检查服务器的高危端口

现在属于互联网时代&#xff0c;很多服务器都暴露在互联网的世界里&#xff0c;如果有高危端口开放&#xff0c;服务器非常容易被黑客攻击&#xff0c;严重威胁服务器的数据安全。下面介绍一个使用shell脚本检查服务器漏洞的案例。只要启动脚本&#xff0c;会扫描出高危端口&am…

‌如何测试AI的“长上下文记忆”?

长上下文记忆测试的本质是“信息持久性验证”‌ AI的“长上下文记忆”并非真正记忆&#xff0c;而是模型在单次推理中对输入序列的‌上下文窗口内信息的保持与推理能力‌。测试目标不是验证“记住”&#xff0c;而是验证‌关键信息在超长对话链中是否可被准确召回、正确引用、…

Flutter---Scrollable

概念Scrollable是Flutter中处理滚动的抽象类abstract class Scrollable extends StatefulWidget {final AxisDirection axisDirection;final ScrollController? controller;final ScrollPhysics? physics;final ViewportBuilder viewportBuilder; }层次结构Scrollable├── …

基于蒙特卡洛的风电功率/光伏功率场景生成方法Matlab代码

✅作者简介&#xff1a;热爱数据处理、建模、算法设计的Matlab仿真开发者。&#x1f34e;更多Matlab代码及仿真咨询内容点击 &#x1f517;&#xff1a;Matlab科研工作室&#x1f34a;个人信条&#xff1a;格物致知,完整Matlab代码获取及仿真咨询内容私信。&#x1f447; 关注我…

大数据毕设项目:基于django的蔬菜销售分析与预测可视化系统(源码+文档,讲解、调试运行,定制等)

java毕业设计-基于springboot的(源码LW部署文档全bao远程调试代码讲解等) 博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、…

告别GPU依赖:深度剖析AI推理芯片市场,谁将主宰终端智能?

导言&#xff1a;推理之战&#xff0c;为何是终端的主战场&#xff1f; "部署于云端的大模型&#xff0c;其推理成本约占总运营成本的70%-90%。"——这一触目惊心的数据并非推测&#xff0c;而是Amazon AWS 2023年官方技术报告对大模型服务&#xff08;如Claude、Ti…

Python 实战:将 HTML 表格一键导出为 Excel(xlsx)

在数据采集、网页解析或自动化报表场景中&#xff0c;我们经常会遇到这样一个需求&#xff1a; 从 HTML 页面中提取表格数据&#xff0c;并导出为 Excel 文件 本文将使用 BeautifulSoup Pandas OpenPyXL&#xff0c;实现一个通用、简单、可复用的工具函数&#xff0c;把 HTML…

Python毕设项目推荐-基于Python的网络小说分析系统设计与实现【附源码+文档,调试定制服务】

java毕业设计-基于springboot的(源码LW部署文档全bao远程调试代码讲解等) 博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、…

2026必备!10个AI论文工具,专科生轻松搞定论文写作!

2026必备&#xff01;10个AI论文工具&#xff0c;专科生轻松搞定论文写作&#xff01; AI 工具助力论文写作&#xff0c;专科生也能轻松应对 随着人工智能技术的不断进步&#xff0c;越来越多的 AI 工具被引入到学术写作领域&#xff0c;帮助学生和研究人员提高效率、降低重复率…

REST 不仅仅是 CRUD:从 Roy Fielding 六大原则重识 API 设计的“灵魂”

引言&#xff1a;当“RESTful”沦为标签&#xff0c;我们失去了什么&#xff1f;在当今的软件工程实践中&#xff0c;“RESTful API”几乎成了现代 Web 接口开发的默认代名词。然而&#xff0c;一个令人不安的事实是&#xff1a;大多数自称“RESTful”的接口&#xff0c;实际上…

【课程设计/毕业设计】基于大数据+django+mysql的学习资源推送系统的设计与实现基于Django+大数据的学习资源推送系统【附源码、数据库、万字文档】

java毕业设计-基于springboot的(源码LW部署文档全bao远程调试代码讲解等) 博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、…

数字化做完却没有价值?问题可能不在技术,而在架构

从安托&#xff08;ATOZ&#xff09;30余年实践&#xff0c;看架构驱动与知识资本化的真正含义&#xff0c;以下内容源自《制造业数字化转型架构设计&#xff08;APA&#xff08;ATOZ Process Approach&#xff09;&#xff09;白皮书》在复杂制造业中&#xff0c;数字化转型失…

【滤波跟踪】基于拓展卡尔曼滤波的移动机器人 2D 定位系统融合里程计和 GPS数据实时估计机器人的位姿附matlab代码

✅作者简介&#xff1a;热爱数据处理、建模、算法设计的Matlab仿真开发者。&#x1f34e;更多Matlab代码及仿真咨询内容点击 &#x1f517;&#xff1a;Matlab科研工作室&#x1f34a;个人信条&#xff1a;格物致知,完整Matlab代码获取及仿真咨询内容私信。&#x1f447; 关注我…

学霸同款8个AI论文网站,本科生搞定毕业论文!

学霸同款8个AI论文网站&#xff0c;本科生搞定毕业论文&#xff01; 论文写作的“学霸同款”神器&#xff0c;你真的不能错过 对于大多数本科生来说&#xff0c;撰写毕业论文是一段既紧张又充满挑战的过程。从选题到开题&#xff0c;再到撰写和降重&#xff0c;每一个环节都需要…

【毕业设计】基于Django+大数据的学习资源推送系统(源码+文档+远程调试,全bao定制等)

java毕业设计-基于springboot的(源码LW部署文档全bao远程调试代码讲解等) 博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、…

大数据毕设项目推荐-基于Django+大数据的学习资源推送系统课程视频、电子书籍【附源码+文档,调试定制服务】

java毕业设计-基于springboot的(源码LW部署文档全bao远程调试代码讲解等) 博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、…

优雅的分组贪心|线段树二分

许多优化 都是边遍历 边更新维护可以借助各种数据结构(轮子bush来减少循环次数 即时间复杂度 更快的拿到retlc3480维护每个数字对应的最小、次小冲突值&#xff0c;计算无冲突子数组的最大数量&#xff0c;最终结合额外可扩展的子数组数量得到结果。class Solution { public:lo…

【课程设计/毕业设计】基于Django的蔬菜销售分析与预测可视化系统基于django的蔬菜销售分析与预测可视化系统【附源码、数据库、万字文档】

java毕业设计-基于springboot的(源码LW部署文档全bao远程调试代码讲解等) 博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、…

大数据毕设项目:基于Django+大数据的学习资源推送系统(源码+文档,讲解、调试运行,定制等)

java毕业设计-基于springboot的(源码LW部署文档全bao远程调试代码讲解等) 博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、…