DAY12. GPIO实验
如果出现图片无法查看可能是网络问题,我用的GitHub+图床保存的图片,可以参考我另外一篇文章GitHub的使用方法含网络问题解决
GitHub使用教程含网络问题_github加速器_肉丸子QAQ的博客-CSDN博客
相关作业和资料已上传,请在主页自行查看
1. GPIO简介
- GPIO(General-purpose input/output)
即通用型输入输出,GPIO可以控制连接在其之上的引脚实现信号的输入和输出芯片的引脚与外部设备相连,从而实现与外部硬件设备的通讯、控制及信号采集等功能
- 实验步骤
-
通过电路原理图分析LED的控制逻辑
-
通过电路原理图查找LED与Exynos4412的连接关系
-
通过数据手册分析GPIO中哪些寄存器可以控制LED
-
通过程序去操控对应的寄存器完成对LED的控制
2. GPIO寄存器分析
控制IO思路:
- 通过电路查看高低电平点亮
- 找到芯片相连的引脚
- 通过芯片数据手册查找相对应引脚的控制寄存器
- 最后查看手册如何修改寄存器从而控制电平输出
- 实验步骤
- 通过电路原理图分析LED的控制逻辑 (以led2为例)
高电平点亮、低电平熄灭
- 通过电路原理图查找LED与Exynos4412的连接关系
GPX2_7
- 通过数据手册分析GPIO中哪些寄存器可以控制LED
GPX2CON
、GPX2DAT
- 通过程序去操控对应的寄存器完成对LED的控制
操控寄存器
GPX2CON
- 地址
- 基地址:
0x1100_0000
- GPX2CON绝对地址:
Base Address + 0x0C40,
- 复位值:
0x0000_0000
- GPX2CON寄存器只能设置模式,不能设置电平高低
GPX2CON[0]
:控制GPX2_0
引脚[3:0]
:GPX2CON
的哪几位控制RW
:该引脚可读可写0x0-F
:不同值代表不同引脚功能0x00
:默认值
GPX2DAT
- 地址
- 32位寄存器,但是只用了`[7:0]sads
当您将端口配置为输入端口时对应的位是引脚状态。
配置为输出端口时,则引脚状态应与相应的位。当端口配置为功能引脚,将读取未定义的值。
意思就是:哪一位对应哪个引脚,0是低电平,1是高电平
3. LED实验
.text
_start:
MAIN:
BL LED_CONFIG
LOOP:
BL LED_ON
BL DELAY
BL LED_OFF
BL DELAY
B LOOP
@GPX2CON寄存器
LED_CONFIG:
LDR R2, =0x11000c40
LDR R1, =0x10000000
STR R1, [R2]
MOV PC, LR
@GPX2DAT寄存器
LED_ON:
LDR R2, =0x11000c44
LDR R1, =0x00000080
STR R1, [R2]
MOV PC, LR
LED_OFF:
LDR R2, =0x11000c44
LDR R1, =0x00000000
STR R1, [R2]
MOV PC, LR
@延时函数
DELAY:
LDR R1, =100000000
L:
SUB R1, R1, #1
CMP R1, #0
BNE L
MOV PC, LR
STOP:
B STOP
.end
不能直接使用我们安装的编译器进行编译,所以我们需要使用Makefile进行特殊处理
TARGET = led-asm
CRORSS_COMPILE = arm-none-linux-gnueabi-
CC = $(CRORSS_COMPILE)gcc
LD = $(CRORSS_COMPILE)ld
OBJCOPY = $(CRORSS_COMPILE)objcopy
all:
$(CC) -c $(TARGET).s -o $(TARGET).o
$(LD) $(TARGET).o -Ttext 0x40008000 -o $(TARGET).elf
$(OBJCOPY) -O binary -S $(TARGET).elf $(TARGET).bin
clean:
rm $(TARGET).o $(TARGET).elf
从这里可以看出使用汇编进行编写代码十分的复杂,在后面的课程里面将使用C语言去编写,此次是为了巩固汇编的知识点
4. 作业
同上