嵌入式学习:裸机开发_L1_汇编LED实验

本文介绍了如何在基于i.MX6ULL的正点原子和飞凌开发板上进行裸机开发,通过汇编语言控制LED。内容涵盖了时钟控制、IO复用、GPIO寄存器以及ARM汇编指令集,包括各种寻址模式、数据传输和算术运算指令。并给出了具体的代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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 的值左移 3 位,然后和 R1 相与操作,结果放入 R1

可采用的移位操作:

指令 解释 补充说明
LSL 逻辑左移(Logical Shift Left) 低端空出位补 0
LSR 逻辑右移(Logical Shift Right) 高端空出位补 0
ASR 算术右移(Arithmetic Shift Right) 移位过程中符号位不变,即源操作数为正数,则高端空出位补 0,否则补 1
ROR 循环右移(Rotate Right) 由低端移出位填入高端空出位
RRX 带扩展的循环右移(Rotate Right eXtended by 1 place) 操作数右移一位,高端空出位用原 C 标志值填充。

3.5.4 寄存器间接寻址

操作数保存在寄存器指定地址的存储单元中,即寄存器为操作数的地址指针。

例:

LDR R1, [R2] @ 将 R2 中的数值作为地址,取出此地址中的数据保存在 R1 中
SWP R1, R1, [R2] @ 将R2中的数值作为地址,取出此地址中的数值与 R1 中的值
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值