2026/6/20 7:54:39
网站建设
项目流程
南京网站建设 奥美通全网营销,网站优化推广 site,网页搜索,自己开个公司做网站IMX6ULL 裸机开发实战#xff1a;从汇编启动代码到 LED 闪烁#xff08;Ubuntu 篇#xff09;一、 开发平台与硬件信息
1.1 核心参数
开发板#xff1a;正点原子 i.MX6ULL-Mini#xff08;核心板 底板模式#xff09;。CPU#xff1a;NXP i.MX6ULL (Cortex-A7)#xf…IMX6ULL 裸机开发实战从汇编启动代码到 LED 闪烁Ubuntu 篇一、 开发平台与硬件信息1.1 核心参数开发板正点原子 i.MX6ULL-Mini核心板 底板模式。CPUNXP 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 的外设通常遵循以下三个核心步骤复用功能配置 (IOMUX)芯片引脚很多一个引脚可以做 GPIO也可以做 UART 或 I2C。我们需要通过IOMUXC_SW_MUX_CTL_PAD寄存器将其选定为 GPIO。电气特性配置 (PAD)通过IOMUXC_SW_PAD_CTL_PAD设置引脚的压摆率、驱动能力、开漏输出以及上下拉电阻。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生成目标文件.o2. 链接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 卡准备环境将 SD 卡插入电脑连接至虚拟机。查找设备使用ls /dev/sd*确认 SD 卡设备节点通常为/dev/sdb或/dev/sdc。赋予工具权限chmod 777 imxdownload。执行烧录./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清除冗余文件。六、 开发板测试设置启动拨码根据底板原理图将拨码开关调整至SD 卡启动模式通常是 1-8 位有特定的上下组合。上电插入 SD 卡连接电源按下蓝色电源开关。结果电源指示灯蓝色常量用户指示灯红色开始按照设定的延时周期闪烁。