一、复习C语言
结构体,内存对齐
共用体(union)的核心本质
所有成员共用同一块内存空间!
- 同一时间,只能存一个成员
- 所有成员的起始地址完全一样
- 大小 = 最大成员的大小
同一块内存,你想当什么类型读,就当什么类型读。
| 方式 | 范围 | 是否需要恢复 | 平台 |
|---|---|---|---|
#pragma pack(push,1) |
全局 | 必须恢复 | 所有编译器 |
__attribute__((packed)) |
仅当前结构体 | 不用恢复 | GNU C (Linux/GCC) |
| 文件后缀 | 含义 | 可读吗? |
|---|---|---|
.c |
C 源代码 | 可读(文本) |
.i |
预处理后 C 代码 | 可读(文本,无宏 / 注释) |
.s |
汇编代码 | 可读(文本,汇编指令) |
.o |
目标文件 | 不可读(二进制,机器码) |
| 可执行文件 | 最终程序 | 不可读(二进制,可直接运行) |
二、点灯编程

设置引脚:
GPI01_103
IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO03
IOMUXC_SW_PAD_CTL_PAD_GPIO1_I003
GPIO1_DIR 第3位设置位1,引脚方向为输出
GPIO1_DR 第3位置0(低电平)或置1(高电平)
- 查看原理图,确定硬件连接
- 找到 LED 连接的 SoC 引脚(例如
GPIO1_IO03),确认是高电平点亮还是低电平点亮。- 引脚功能与电气配置
- 选择引脚功能(MUX) :通过
IOMUXC寄存器,将该引脚复用为 GPIO 功能(而非 UART/PWM 等其他功能)。- 配置引脚电气特性(PAD):设置上下拉、驱动能力、速度等,确保 GPIO 输出稳定。
- 配置 GPIO 方向(DIR) :将对应 GPIO 引脚设置为 输出模式(Output)。
- 控制 LED 亮灭
- 通过 GPIO 数据寄存器(DR)写入高低电平,实现 LED 点亮 / 熄灭
i.MX6ULL 引脚控制逻辑
- MUXIO_SW:引脚复用选择器,决定引脚功能(GPIO/UART/EINT/PWM 等)。
- PAD_SW:引脚电气属性配置(上下拉、驱动强度、速度等)。
- GPIO 模块 :
DIR:方向寄存器,控制引脚为输入 / 输出。DR:数据寄存器,输出时写入电平,输入时读取电平。- pad:芯片外部引脚,最终连接到 LED 硬件。

查表:


编程
设置栈指针(堆栈)指向 0x81000000因为:
- 裸机程序刚开始运行时,没有栈
- 必须先设置
sp堆栈,才能调用 C 语言函数- 所以启动文件第一件事就是:给栈找一块安全的内存
cs
.global _start
_start:
ldr pc, =_reset_handler
ldr pc, =_software_handler
ldr pc, =_undef_handler
ldr pc, =_prefetch_abort_handler
ldr pc, =_data_abort_handler
nop
ldr pc, =_irq_handler
ldr pc, =_fiq_handler
_software_handler:
b _software_handler
_undef_handler:
b _undef_handler
_prefetch_abort_handler:
b _prefetch_abort_handler
_data_abort_handler:
b _data_abort_handler
_irq_handler:
b _irq_handler
_fiq_handler:
b _fiq_handler
_reset_handler:
/*DDR 0x80000000 ~ 0xA0000000*/
cpsid i /*disable irq*/
ldr sp, =0x81000000 /*init system mode stack 16M */
cps #0x12 /*change to irq mode */
/*
mrs r0, cpsr
bic r0, r0, #0x1f
orr r0, r0, #0x12
msr cpsr_c, r0
*/
ldr sp, =0x82000000 /*init irq mode stack 16M */
cps #0x1f /* change to system mode */
/*
mrs r0, cpsr
orr r0, r0, #0x1f
msr cpsr_c, r0
*/
cpsie i /* enable irq */
bl led_init
led:
bl led_on
bl led_delay
bl led_off
bl led_delay
b led
code_end:
b code_end
led_init:
ldr r0, =0x20e0068
ldr r1, [r0]
bic r1, r1, #0x1f
orr r1, r1, #0x05
str r1, [r0]
ldr r0, =0x20e02f4
ldr r1, [r0] /*unuse*/
ldr r1, =0x10b0
str r1, [r0]
ldr r0, =0x209c004
ldr r1, [r0]
orr r1, r1, #(1 << 3)
str r1, [r0]
ldr r0, =0x209c000
ldr r1, [r0]
orr r1, r1, #(1 << 3)
str r1, [r0]
bx lr
led_on:
ldr r0, =0x209c000
ldr r1, [r0]
bic r1, r1, #(1 << 3)
str r1, [r0]
bx lr
led_off:
ldr r0, =0x209c000
ldr r1, [r0]
orr r1, r1, #(1 << 3)
str r1, [r0]
bx lr
led_delay:
ldr r0, =0x80000
loop_delay:
sub r0, r0, #1
cmp r0, #0
bge loop_delay
bx lr
下载程序:
