IMX6ULL 裸机开发学习(一):汇编点亮 LED
👁 5
分类:工业互联网
基于野火 IMX6ULL mini 开发板,用 GNU ARM 汇编完成 LED 闪烁实验:CCM 时钟使能、IOMUX 复用配置、GPIO 方向与数据寄存器操作,配套 Makefile 与 imxdownload 烧写流程。
IMX6ULL 裸机开发学习(一):汇编点亮 LED
一、项目背景
IMX6ULL 是 NXP 推出的低功耗 Cortex-A7 应用处理器,广泛应用于工业 HMI、物联网网关与入门级 Linux 开发板。对于嵌入式初学者而言,裸机开发是理解芯片底层工作原理的最佳路径——没有操作系统屏蔽细节,每一个寄存器都要亲手配置。
本文基于野火 IMX6ULL mini 开发板,通过 GNU ARM 汇编实现 LED 闪烁,完整走通"时钟使能 → IO 复用 → 电气属性 → GPIO 方向 → 电平输出"的 GPIO 控制链路。
二、技术方案:环境与硬件
- 开发板:野火 IMX6ULL mini 板
- 编程环境:Ubuntu 18.04 + VSCode
- 工具链:arm-linux-gnueabihf-gcc / ld / objcopy
- 目标外设:GPIO5_IO03(开漏输出驱动 LED)
GPIO 点亮 LED 的本质:配置引脚复用为 GPIO 功能、设置电气属性、将引脚方向设为输出、向数据寄存器写 0/1 控制电平。
三、系统架构:寄存器配置链路
LED 控制的完整寄存器链路:
| 步骤 | 寄存器 | 地址 | 说明 |
|---|---|---|---|
| 1 | CCM_CCGR0~CCGR6 | 0x020C4068~0x020C4080 | 使能外设时钟(全部置 0xffffffff) |
| 2 | IOMUXC_SNVS_SW_MUX_CTL_PAD_SNVS_TAMPER3 | 0x02290014 | 引脚复用为 GPIO5_IO03(ALT5) |
| 3 | IOMUXC_SNVS_SW_PAD_CTL_PAD_SNVS_TAMPER3 | 0x02290058 | 电气属性:压摆率/驱动/速度/开漏 |
| 4 | GPIO5_GDIR | 0x020AC004 | 方向寄存器,BIT3=1 设为输出 |
| 5 | GPIO5_DR | 0x020AC000 | 数据寄存器,BIT3=0 点亮 / =1 熄灭 |
四、实施过程:汇编代码
4.1 主程序 led.s
/*******************
*文件名: led.s
*描述 :裸机实验测试1 汇编点亮led灯
********************/
.global _start @全局标号
_start:
/***** 1.使能控制时钟 *****/
ldr r0, =0x020c4068 @ CCM_CCGR0
ldr r1, =0xffffffff
str r1, [r0]
ldr r0, =0x020c406C @ CCM_CCGR1
ldr r1, =0xffffffff
str r1, [r0]
ldr r0, =0x020c4070 @ CCM_CCGR2
ldr r1, =0xffffffff
str r1, [r0]
ldr r0, =0x020c4074 @ CCM_CCGR3
ldr r1, =0xffffffff
str r1, [r0]
ldr r0, =0x020c4078 @ CCM_CCGR4
ldr r1, =0xffffffff
str r1, [r0]
ldr r0, =0x020c407C @ CCM_CCGR5
ldr r1, =0xffffffff
str r1, [r0]
ldr r0, =0x020c4080 @ CCM_CCGR6
ldr r1, =0xffffffff
str r1, [r0]
/***** 2.GPIO5_IO03 复用功能配置GPIO (ALT5) *****/
ldr r0, =0x02290014 @ IOMUXC_SNVS_SW_MUX_CTL_PAD_SNVS_TAMPER3
ldr r1, =0x5 @ ALT5 -> GPIO5_IO03
str r1, [r0]
/***** 3.GPIO5_IO03 配置IO电气属性 *****/
/* 0x08B0: BIT0压摆率慢速, BIT5-3驱动R0/6, BIT7-6速度100MHz,
BIT11开漏输出使能, BIT12关闭上下拉, BIT15-14 100K上拉, BIT16关闭hys */
ldr r0, =0x02290058 @ IOMUXC_SNVS_SW_PAD_CTL_PAD_SNVS_TAMPER3
ldr r1, =0x08B0
str r1, [r0]
/***** 4.设置GPIO5_IO03 为输出 *****/
ldr r0, =0x020AC004 @ GPIO5_GDIR
ldr r1, =0x08 @ BIT3
str r1, [r0]
/***** 5.主循环:LED闪烁 *****/
loop:
ldr r0, =0x020AC000 @ GPIO5_DR
ldr r1, =0x00 @ BIT3=0 开灯
str r1, [r0]
bl delay @ 延时
ldr r0, =0x020AC000 @ GPIO5_DR
ldr r1, =0x08 @ BIT3=1 关灯
str r1, [r0]
bl delay
b loop
/**
* 简单汇编延时
*/
delay:
ldr r2, =0xfffff
ldr r3, =0x0
delay_loop:
sub r2, r2, #1
cmp r2, r3
bne delay_loop
mov pc, lr @ 返回主函数
4.2 Makefile 与烧写
led.bin : led.s
arm-linux-gnueabihf-gcc -g -c led.s -o led.o
arm-linux-gnueabihf-ld -Ttext 0x87800000 led.o -o led.elf
arm-linux-gnueabihf-objcopy -O binary -S -g led.elf led.bin
clean:
rm -rf *.o led.bin led.elf led.dis
dump:
arm-linux-gnueabihf-objdump -D led.elf > led.dis
dowmload:
./imxdownload led.bin /dev/sdb
关键点:
- 链接地址 0x87800000:与开发板 DDR 的加载地址一致(配合 imxdownload 工具烧写);
- imxdownload:将 led.bin 打包成带 IMX 头部的镜像写入 SD 卡;
- objdump:反汇编核对生成的机器码。
五、应用价值
- 最终效果:LED 约 0.5 秒周期闪烁;
- 通过本实验建立"看寄存器手册 → 写寄存器 → 观察硬件现象"的裸机开发思维;
- 为后续 C 语言裸机开发(start.S 启动 + main 框架)打下寄存器操作基础。
六、SEO关键词
IMX6ULL、裸机开发、汇编点亮LED、野火开发板、GPIO、ARM汇编、CCM时钟、IOMUX复用、imxdownload、嵌入式入门
