ARM架构——用汇编语言点亮 LED

目录

一、开发环境与硬件基础

1.1 IMX6ULL-Mini 开发板介绍

1.2.1 编译工具:gcc-linaro 交叉编译器

1.2.2 代码编辑:Visual Studio Code

1.2.3 辅助工具

二、LED 点亮的底层逻辑

2.1 引脚配置三步骤

2.1.1 复用功能配置(IOMUXC)

2.1.2 电气特性配置(IOMUXC)

2.1.3 引脚方向配置(GPIO)

2.2 LED 开关逻辑

2.3 LDR 与 STR 详解

三、汇编代码实现 LED 闪烁

四、编译与烧写

4.1 手动编译步骤

4.2 Makefile 简化编译

4.3 程序烧写与测试

4.3.1 SD 卡烧写

4.3.2 开发板测试

五、核心概念解答


一、开发环境与硬件基础

1.1 IMX6ULL-Mini 开发板介绍

IMX6ULL-Mini 开发板是由正点原子提供的, 搭载NXP生产i.MX6ULL的SOC, 主打高性能、低功耗与紧凑体积。整个开发板由核心板与底板组成,核心板通过双列直插方式与底板连接。

IMX6ULL-Mini 开发板
  • 核心板:六层板
    • CPU:NXP i.MX 6ULL Cortex-A7 单核处理器,主频 528MHz(工业级) 或 800MHz(商业级)467, BGA 封装
    • 内存:512MB DDR3L RAM,支持高速数据存取。
    • 存储:8GB eMMC,支持多种启动模式(SD卡、NAND、eMMC)
    • 屏幕:4.3寸屏 800*480分辨率
  • 底板
    • 红色 led 灯提供用户可控的的 led 灯
    • 蓝色 led 灯是电源指示灯
    • 510 欧姆限流电阻作用防止电流过大保护灯珠。

1.2.1 编译工具:gcc-linaro 交叉编译器

  • 拷贝 gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf.tar.xz 到 /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
  • 配置回家目录, 修改环境变量配置文件 vi .bashrc
    • 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

1.2.2 代码编辑:Visual Studio Code

  • 安装Visual Studio Code
    • 汇编高亮插件:Arm Assembly
  • 创建工程文件夹 \IMX6ULL\led_asm
  • 创建启动代码 start.S(注意大写S后缀,会进行预处理,后期用到一些宏)

1.2.3 辅助工具

  • 烧写工具:imxdownload(IMX6ULL 专用 SD 卡烧写工具)
  • 串口工具(可选):用于调试输出,本次实验暂不涉及

二、LED 点亮的底层逻辑

IMX6ULL 的 LED 控制本质是GPIO 外设寄存器操作,需完成 3 步初始化 + 1 步运行时控制,核心依赖汇编的 LDR(读取寄存器)和 STR(写入寄存器)指令。

2.1 引脚配置三步骤

参考 IMX6ULL 参考手册和底板原理图,本次控制GPIO1_IO03 引脚(对应红色 LED):

2.1.1 复用功能配置(IOMUXC)

GPIO 引脚默认可能不是 GPIO 功能,需通过复用寄存器配置为 GPIO 模式:

  • 寄存器地址:IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO03 = 0x020C4068
  • 配置值:低 4 位设为 0101(对应 GPIO 功能)

2.1.2 电气特性配置(IOMUXC)

设置引脚的驱动能力、上下拉等电气参数,避免信号不稳定:

  • 寄存器地址:IOMUXC_SW_PAD_CTL_PAD_GPIO1_IO03(需查阅手册确认具体地址)
  • 核心配置:根据 LED 驱动需求设置(如默认配置可满足基础点灯)

2.1.3 引脚方向配置(GPIO)

设置 GPIO 为输出模式(LED 需要主动输出高低电平):

  • 寄存器地址:GPIO1_GDIR(GPIO1 端口方向寄存器)
  • 配置逻辑:对应位设为 1(输出),0 为输入;GPIO1_IO03 对应第 3 位,故设置GPIO1_GDIR |= (1<<3)

2.2 LED 开关逻辑

LED 灯珠采用低电平点亮(原理图设计),通过 GPIO 数据寄存器控制:

  • 寄存器地址:GPIO1_DR(GPIO1 端口数据寄存器)
  • 点亮:对应位设为 0(GPIO1_DR &= ~(1<<3))
  • 熄灭:对应位设为 1(GPIO1_DR |= (1<<3))

2.3 LDR 与 STR 详解

指令功能示例
LDR <Rt>, =<addr>将寄存器地址加载到目标寄存器 Rtldr r0, =0x020C4068(r0 = 复用寄存器地址)
STR <Rt>, [<Rn>]将 Rt 的值写入 Rn 指向的内存地址(寄存器)str r1, [r0](将 r1 的值写入 r0 指向的复用寄存器)

三、汇编代码实现 LED 闪烁

要实现闪烁,需在 "点亮 - 延时 - 熄灭 - 延时" 之间循环,延时通过汇编空指令实现(利用 CPU 执行指令的时间差):

.global _start ; ============================================== ; ARM异常向量表 (Exception Vector Table) ; ARM架构规定从0x00000000开始的32字节为异常向量表 ; 每个异常占4字节,依次对应8种异常类型 ; ============================================== _start: ldr pc, =_reset_handler ldr pc, =_undef_handler ldr pc, =_software_handler ldr pc, =_prefect_handler ldr pc, =_data_abort_handler nop ldr pc, =_irq_handler ldr pc, =_fiq_handler ; ============================================== ; 异常处理函数(默认原地死循环,防止异常逃逸) ; 新手阶段暂不处理具体异常,仅做兜底 ; ============================================== _undef_handler: b _undef_handler _software_handler: b _software_handler _prefect_handler: b _prefect_handler _data_abort_handler: b _data_abort_handler _irq_handler: b _irq_handler _fiq_handler: b _fiq_handler ; ============================================== ; 复位处理函数(系统上电/复位后第一个执行的核心函数) ; ============================================== _reset_handler: cpsid i ; 失能irq cps #0x12 ldr sp, =0x82000000 cps #0x1F ldr sp, =0x84000000 cpsie i ; 使能irq bl led_init ; ============================================== ; 主循环:LED闪烁逻辑 ; ============================================== finish: bl led_on bl led_delay bl led_off bl led_delay b finish ; ============================================== ; LED初始化函数:配置GPIO引脚(以IMX6ULL为例) ; 步骤:1.复用功能 2.配置电气特性 3.设置引脚为输出 ; ============================================== led_init: ; 复用功能 ldr r0, =0x020E0068 ldr r1, [r0] bic r1, r1, #0x1F orr r1, r1, #0x05 str r1, [r0] ; 电气特性 ldr r0, =0x020E02F4 ldr r2, =0x10B0 str r2, [r0] ; 引脚方向 ldr r0, =0x0209C004 ldr r1, [r0] orr r1, r1, #(1 << 3) str r1, [r0] bx lr ; ============================================== ; LED点亮函数:拉低GPIO1_IO03引脚(低电平点亮) ; ============================================== led_on: ldr r0, =0x0209C000 ldr r1, [r0] bic r1, r1, #(1 << 3) str r1, [r0] bx lr ; ============================================== ; LED熄灭函数:拉高GPIO1_IO03引脚(高电平熄灭) ; ============================================== led_off: ldr r0, =0x0209C000 ldr r1, [r0] orr r1, r1, #(1 << 3) str r1, [r0] bx lr ; ============================================== ; 简单延时函数:通过循环递减实现延时 ; ============================================== led_delay: ldr r0, =0x7FFFF loop: cmp r0, #0 ble fin sub r0, r0, #1 b loop fin: bx lr

四、编译与烧写

4.1 手动编译步骤

执行以下命令:

(1)汇编:将.S 文件转为目标文件(.o)

arm-linux-gnueabihf-gcc -c start.S -o start.o -g
  • -c:只汇编不链接
  • -o:指定输出文件
  • -g:保留调试信息

(2)链接:将目标文件链接到指定地址(IMX6ULL 的 SD 卡启动地址为 0x87800000)

arm-linux-gnueabihf-ld -Ttext 0x87800000 start.o -o start.elf
  • -Ttext:指定代码段起始地址

(3)格式转换:将 ELF 文件转为开发板可执行的二进制文件(.bin)

arm-linux-gnueabihf-objcopy -O binary -S -g start.elf start.bin
  • -O binary:输出二进制格式
  • -S:去除符号信息
  • -g:去除调试信息

(4)反汇编(可选):将 ELF 文件转为汇编代码(用于调试)

arm-linux-gnueabihf-objdump -D start.elf > start.dis

4.2 Makefile 简化编译

# 定义工具链变量,简化后续命令 COMPILER = arm-linux-gnueabihf- CC = $(COMPILER)gcc LD = $(COMPILER)ld OBJCOPY = $(COMPILER)objcopy OBJDUMP = $(COMPILER)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 -f start.o start.elf start.bin start.dis # 伪目标:烧写程序到SD卡 load: ./imxdownload start.bin /dev/sdb

使用方法:

  • 编译:make(一键生成 start.bin)
  • 清理:make clean(删除所有编译产物)
  • 烧写:make load(需提前将 imxdownload 工具拷贝到工程目录并添加执行权限:chmod +777 imxdownload)

4.3 程序烧写与测试

4.3.1 SD 卡烧写

  1. 将 SD 卡插入 Ubuntu 虚拟机(通过 USB 读卡器)
  2. 查看 SD 卡设备名:ls /dev/sdb(通常为 sdb,需确认无其他存储设备冲突)
  3. 执行烧写命令:./imxdownload start.bin /dev/sdb

注意:烧写速率需为 KB 级,若显示 MB 级速率则失败,需拔掉读卡器重启 Ubuntu 后重试

4.3.2 开发板测试

  1. 选择启动模式:通过开发板上的拨码开关选择 SD 卡启动(参考开发板原理图)
  2. 插入烧写好的 SD 卡到开发板 TF 卡槽
  3. 上电测试:
    • 确保开发板电源开关弹起,插入电源适配器
    • 按下蓝色电源开关,观察蓝色电源灯亮起
    • 红色 LED 周期性闪烁
熄灭状态
点亮状态

五、核心概念解答

1. 在 LED 实验中,在对 SOC 引脚配置时都做了哪些工作?

  • 复用功能配置:将引脚从默认功能切换为 GPIO 功能;
  • 电气特性配置:设置引脚驱动能力、上下拉等,保证信号稳定;
  • GPIO 方向配置:设置为输出模式,使引脚能主动输出高低电平。

2. 什么是编译器、连接器、格式转换器和反汇编器?

  • 编译器(gcc):将汇编源文件(.S)转为目标文件(.o),进行语法检查和指令翻译;
  • 链接器(ld):将目标文件链接到指定内存地址,解决符号引用(如程序入口 _start);
  • 格式转换器(objcopy):将 ELF 文件(包含调试 / 符号信息)转为开发板可直接执行的二进制文件(.bin);
  • 反汇编器(objdump):将 ELF 文件转回汇编代码,用于调试(验证指令是否正确翻译)。

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

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

相关文章

SpringBoot+Vue 人口老龄化社区服务与管理平台平台完整项目源码+SQL脚本+接口文档【Java Web毕设】

&#x1f4a1;实话实说&#xff1a;C有自己的项目库存&#xff0c;不需要找别人拿货再加价。摘要 随着全球人口老龄化趋势的加剧&#xff0c;社区养老服务与管理需求日益增长。传统的社区服务模式已无法满足老年人多样化、个性化的需求&#xff0c;亟需通过信息化手段提升服务效…

MGeo与传统方法对比,优势一目了然

MGeo与传统方法对比&#xff0c;优势一目了然 1. 引言&#xff1a;中文地址匹配为何如此棘手&#xff1f; 你有没有遇到过这种情况&#xff1a;两个地址明明说的是同一个地方&#xff0c;系统却判断不一致&#xff1f;比如“北京市朝阳区望京SOHO塔1”和“北京朝阳望京SOHO T…

Emotion2Vec+ Large部署卡顿?显存不足问题解决实战教程

Emotion2Vec Large部署卡顿&#xff1f;显存不足问题解决实战教程 1. 问题背景与目标 你是不是也遇到过这种情况&#xff1a;刚部署完 Emotion2Vec Large 语音情感识别系统&#xff0c;满怀期待地上传音频准备测试&#xff0c;结果点击“开始识别”后页面卡住、响应缓慢&…

基于SpringBoot+Vue的体育馆使用预约平台管理系统设计与实现【Java+MySQL+MyBatis完整源码】

&#x1f4a1;实话实说&#xff1a;C有自己的项目库存&#xff0c;不需要找别人拿货再加价。摘要 随着全民健身理念的普及和体育设施的不断完善&#xff0c;体育馆的使用需求日益增长。传统的线下预约方式存在效率低下、信息不透明、资源分配不均等问题&#xff0c;难以满足现代…

Z-Image-Turbo过饱和预防:CFG值合理区间实战验证

Z-Image-Turbo过饱和预防&#xff1a;CFG值合理区间实战验证 1. 引言&#xff1a;为什么CFG值会“失控”&#xff1f; 你有没有遇到过这种情况&#xff1f;输入了一个看起来很正常的提示词&#xff0c;比如“一只在花园里奔跑的金毛犬&#xff0c;阳光明媚&#xff0c;背景是…

企业级夕阳红公寓管理系统管理系统源码|SpringBoot+Vue+MyBatis架构+MySQL数据库【完整版】

&#x1f4a1;实话实说&#xff1a; C有自己的项目库存&#xff0c;不需要找别人拿货再加价。 摘要 随着我国老龄化进程的加速&#xff0c;老年人口数量持续增长&#xff0c;传统的养老模式已无法满足多样化需求。夕阳红公寓作为一种新型养老模式&#xff0c;结合社区化管理和…

GPEN实战案例:社区老人证件照智能修复系统部署全过程

GPEN实战案例&#xff1a;社区老人证件照智能修复系统部署全过程 1. 项目背景与应用价值 在社区服务场景中&#xff0c;老年人办理各类证件时常常面临照片质量不达标的问题。很多老人手中的旧照片存在模糊、褪色、噪点多、光线不足等情况&#xff0c;导致无法通过政务系统的审…

亲自动手试了Unsloth,微调效率提升太明显

亲自动手试了Unsloth&#xff0c;微调效率提升太明显 1. 引言&#xff1a;为什么选择Unsloth&#xff1f; 最近在做Qwen2-7B-Instruct模型的LoRA微调时&#xff0c;偶然接触到了一个叫 Unsloth 的开源框架。一开始只是抱着试试看的心态&#xff0c;结果一上手就彻底被它的效率…

C++课后习题训练记录Day70

1.练习项目&#xff1a; 问题描述 小蓝出生在一个艺术与运动并重的家庭中。 妈妈是位书法家&#xff0c;她希望小蓝能通过练习书法&#xff0c;继承她的艺术天赋&#xff0c;并练就一手好字。爸爸是一名篮球教练&#xff0c;他希望小蓝能通过篮球锻炼身体&#xff0c;培养运…

SGLang高吞吐秘诀:并行请求处理部署实战

SGLang高吞吐秘诀&#xff1a;并行请求处理部署实战 SGLang-v0.5.6 是当前推理框架领域中备受关注的一个版本&#xff0c;它在大模型服务部署方面展现出卓越的性能表现。尤其在高并发、低延迟场景下&#xff0c;SGLang 通过一系列底层优化技术&#xff0c;显著提升了系统的整体…

Glyph推理中断?资源监控与恢复机制部署教程

Glyph推理中断&#xff1f;资源监控与恢复机制部署教程 1. 为什么你的Glyph推理总是中断&#xff1f; 你是不是也遇到过这种情况&#xff1a;正在用Glyph跑一个长文本视觉推理任务&#xff0c;结果突然卡住、页面无响应&#xff0c;刷新后发现推理进程已经没了&#xff1f;或…

亲测Qwen3-1.7B镜像,AI对话真实体验分享超简单

亲测Qwen3-1.7B镜像&#xff0c;AI对话真实体验分享超简单 1. 实际体验前的准备&#xff1a;快速启动与调用方式 最近在CSDN星图上试用了新上线的 Qwen3-1.7B 镜像&#xff0c;整体体验非常流畅。这款模型是阿里巴巴通义千问系列在2025年4月推出的轻量级大语言模型之一&#…

小白必看:GLM-TTS文本转语音快速入门指南

小白必看&#xff1a;GLM-TTS文本转语音快速入门指南 1. 快速上手&#xff0c;5分钟生成你的第一段AI语音 你有没有想过&#xff0c;只需要几秒钟的录音&#xff0c;就能让AI模仿出一模一样的声音&#xff1f;还能用这个声音读出你想说的任何话——无论是中文、英文&#xff…

AI图像处理新标准:cv_unet_image-matting支持TIFF/BMP等多格式部署指南

AI图像处理新标准&#xff1a;cv_unet_image-matting支持TIFF/BMP等多格式部署指南 1. 快速上手&#xff1a;什么是cv_unet_image-matting&#xff1f; 你是否还在为复杂背景的人像抠图烦恼&#xff1f;手动选区费时费力&#xff0c;边缘处理总是不够自然。现在&#xff0c;一…

用Z-Image-Turbo批量生成商品图,效率提升十倍

用Z-Image-Turbo批量生成商品图&#xff0c;效率提升十倍 在电商运营中&#xff0c;高质量的商品图是转化率的关键。但传统拍摄成本高、周期长&#xff0c;设计师修图耗时耗力&#xff0c;尤其面对成百上千 SKU 的上新需求时&#xff0c;团队常常疲于奔命。有没有一种方式&…

零基础玩转YOLOv13:官方镜像让学习更简单

零基础玩转YOLOv13&#xff1a;官方镜像让学习更简单 你是不是也曾经被复杂的环境配置、依赖冲突和版本问题劝退过&#xff1f;想学目标检测&#xff0c;却被“pip install 失败”、“CUDA 不兼容”、“找不到模块”这些报错搞得心力交瘁&#xff1f; 别担心&#xff0c;今天…

GPEN开源协议解读:版权保留要求与二次开发规范

GPEN开源协议解读&#xff1a;版权保留要求与二次开发规范 1. 引言&#xff1a;GPEN图像肖像增强项目背景 你可能已经用过或听说过GPEN——一个专注于人脸图像增强与老照片修复的开源工具。它不仅能提升模糊人像的清晰度&#xff0c;还能智能修复划痕、噪点和褪色问题&#x…

Open-AutoGLM连接失败怎么办?常见问题解决方案

Open-AutoGLM连接失败怎么办&#xff1f;常见问题解决方案 本文基于智谱AI开源项目 Open-AutoGLM 的实际部署经验&#xff0c;系统梳理在使用该手机端AI Agent框架时可能遇到的连接问题&#xff0c;并提供可落地的排查与解决方法。无论你是第一次尝试部署&#xff0c;还是在远程…

麦橘超然随机种子失效?参数传递错误修复实战案例

麦橘超然随机种子失效&#xff1f;参数传递错误修复实战案例 1. 问题背景&#xff1a;你以为的“随机”可能根本没生效 你有没有遇到过这种情况——在使用 AI 图像生成工具时&#xff0c;明明把 随机种子&#xff08;Seed&#xff09;设为 -1&#xff0c;期望每次点击都能得到…

提升用户体验:unet人像卡通化界面优化实战分享

提升用户体验&#xff1a;unet人像卡通化界面优化实战分享 1. 功能概述 本工具基于阿里达摩院 ModelScope 的 DCT-Net 模型&#xff0c;支持将真人照片转换为卡通风格。项目由科哥构建并持续优化&#xff0c;旨在提供一个稳定、易用、高效的人像卡通化解决方案。 核心功能亮…