裸机开发_L1_汇编LED实验
0. 本节目标
- 了解时钟控制寄存器
- 了解复用配置寄存器
- 了解电气属性寄存器
- 了解GPIO控制相关寄存器
1. 硬件层电路
1.1 使用正点原子 i.MX6ULL ALPHA V2.2 开发板
查看底板原理图可知:
功能管脚 | 芯片引脚 |
---|---|
LED0 | GPIO3 |
1.2 飞凌i.MX6UL-C开发板
2. 初识 i.MX6ULL 寄存器
2.1 i.MX6ULL 时钟控制寄存器
2.2 i.MX6ULL IO复用寄存器
2.3 i.MX6ULL 电气属性寄存器
2.4 i.MX6ULL GPIO控制寄存器
3. ARM 汇编指令集简介
使用指令集:ARMv7-A 汇编指令集,32位,load/store架构。
大多数ARM处理器支持超过一种指令集:
> ARM —— 一种32位指令集
> Thumb —— 一种16位指令集,具有更好的代码密度(但是相比ARM代码,性能有所降低)
在程序的控制之下,处理器可以在这两种指令集之间来回切换。
所有的 Cortex-A 系列处理器实现了 Thumb-2 技术,它扩展了Thumb指令集。混合使用32位和16位指令,以Thumb指令集的代码密度和接近ARM指令集的性能。自从所有的Cortex-A系列处理器支持这一扩展,针对它们的软件常被编译成Thumb指令集。
3.1 处理器工作模式
3.2 汇编语言基本格式
label: instruction @ comment
域 | 说明 | 备注 |
---|---|---|
label | 标号 | 可不写 |
instruction | 指令 | 必须写 |
@ comment | 注释 | 可不写 |
GNU汇编语言,函数定义
函数名:
函数体
返回语句
3.3 伪指令指定“段”
预定义段名 | 含义 |
---|---|
.text | 代码段 |
.data | 初始化的数据段 |
.bss | 未初始化的数据段 |
.rodata | 只读数据段 |
3.4 汇编程序入口
3.4.1 默认入口标号 _start
.global _start
_start:
ldr r0, =0x12 @ r0=0x12
3.4.2 链接脚本 ENTRY
3.5 ARM 9种寻址模式
3.5.1 立即寻址
操作数是立即数,以“#”为前缀,表示 16 进制数值时以“0x”表示。
例:
MOV R0, #0xFF00 @ 0xFF00 -> R0
SUBS R0, R0, #1 @ R0 – 1 -> R0
3.5.2 寄存器寻址
操作数的值在寄存器中,指令执行时直接取出寄存器值操作。
例:
MOV R1, R2 @ R2 -> R1
SUB R0, R1, R2 @ R1 - R2 -> R0
3.5.3 寄存器偏移寻址
当第二操作数是寄存器偏移方式时,第二个寄存器操作数在与第一个操作数结合之前,选择进行移位操作。
例:
MOV R0, R2, LSL #3 @ R2 的值左移 3 位,结果放入 R0,即 R0 = R2 * 8
ANDS R1, R1, R2, LSL #3 @ R2 的值