一、GPIO简介
GPIO(General-purpose input/output)即通用型输入输出,GPIO可以控制连接在其之上的引脚实现信号的输入和输出
芯片的引脚与外部设备相连,从而实现与外部硬件设备的通讯、控制及信号采集等功能
实验步骤
1. 通过电路原理图分析LED的控制逻辑
2. 通过电路原理图查找LED与Exynos4412的连接关系
3. 通过数据手册分析GPIO中哪些寄存器可以控制LED
4. 通过程序去操控对应的寄存器完成对LED的控制
二、GPIO寄存器分析
![](https://img-blog.csdnimg.cn/a12d0e0c687f45b6824f62584dae6a25.png)
高电平导通,低电平截至
输出嘛,肯定就是Output模式GPX2CON【7】=0x1
输出高电平就对应位写1,输出低电平就对应位写0
![](https://img-blog.csdnimg.cn/31d6919e6c6b413f96c659ec9bec1fb5.png)
控制上下拉,点灯暂时用不到。
![](https://img-blog.csdnimg.cn/fdd42be460aa4b6aae10bb27ea5d8c9a.png)
设置驱动能力,点灯暂时也用不到,本来就使用了一个三极管当开关,点灯够用了。
三、GPIO编程
预处理->编译->汇编->链接
gcc -E
gcc -S
gcc -c
gcc
链接使用的工具是ld, .elf是Linux可执行文件的后缀
-Ttext 0x40005000 是将程序放到内存上,保证程序可以执行。
交叉编译工具链在32位ubuntu上可以正常使用,但是在64位的需要执行这样一条命令
sudo apt-get install lib32z1 lib32ncurses
![](https://img-blog.csdnimg.cn/19140825dfef449fbe311a1b2203de8f.png)
先rm掉报错的文件,然后
sudo apt update
![](https://img-blog.csdnimg.cn/6d41a61ceabf469fb0b8d2dbdfc030fc.png)
好家伙和我套娃呢
sudo rm /var/lib/apt/extended_states
然后在
sudo apt update
![](https://img-blog.csdnimg.cn/21c795f6d18947e2b0838259353c7e2c.png)
E: Unable to locate package lib32ncurses5
![](https://img-blog.csdnimg.cn/4f92ca2e891f4fc8b6c508838cd59fed.png)
TARGET = LED-ASM
CROSS_COMPILE = arm-none-linux-gnueabi-
CC = $(CROSS_COMPILE)gcc
LD = $(CROSS_COMPILE)ld
OBJCOPY = $(CROSS_COMPILE)objcopy
all:
$(CC) -c $(TARGET).s -o $(TARGET).o
$(LD) $(TARGET).o -Ttext 0x40005000 -o $(TARGET).elf
$(OBJCOPY) -O binary -S $(TARGET).elf $(TARGET).bin
clean:
rm $(TARGET).o $(TARGET).elf $(TARGET).bin
1
2 .text
3 _start:
4
5 LED_CONFIG:
6 LDR R2, =0x11000c40
7 LDR R1, =0x10000000
8 STR R1, [R2]
9
10 LED_ON:
11 LDR R2, =0x11000c44
12 LDR R1, =0x00000080
13 STR R1, [R2]
14 B STOP
15
16 LED_OFF:
17 LDR R2, =0x11000c44
18 LDR R1, =0x00000000
19 STR R1, [R2]
20
21 STOP:
22 B STOP
23 .end
![](https://img-blog.csdnimg.cn/f6f0a256f6634a41b4505dd7e8075e78.png)
然后把编译好滴.bin文件传给我们的开发板
![](https://img-blog.csdnimg.cn/9ce4ba16363f45a29d0021941c88b2fe.png)
![](https://img-blog.csdnimg.cn/d68312afc1134152801d737e52a891e5.png)
go 0x40008000
成功点亮LED2
四、LED实验
现在写个程序让LED2闪烁
.text
_start:
MAIN:
BL LED_CONFIG
LOOP:
BL LED_ON
BL DELAY
BL LED_OFF
BL DELAY
B LOOP
LED_CONFIG:
LDR R2, =0x11000c40
LDR R1, =0x10000000
STR R1, [R2]
MOV PC, LR
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
运行一下没啥毛病。
本来想写个流水灯来着,太麻烦了,再写个LED3闪烁吧,等以后用C写
![](https://img-blog.csdnimg.cn/b8418b34b9064fe3a2fc2b17ce4ca46d.png)
![](https://img-blog.csdnimg.cn/c47c807c65f84469be37c7a64c4b7412.png)
.text
_start:
MAIN:
BL LED_CONFIG
LOOP:
BL LED_ON
BL DELAY
BL LED_OFF
BL DELAY
B LOOP
LED_CONFIG:
LDR R2, =0x11000c20
LDR R1, =0x00000001
STR R1, [R2]
MOV PC, LR
LED_ON:
LDR R2, =0x11000c24
LDR R1, =0x00000001
STR R1, [R2]
MOV PC, LR
LED_OFF:
LDR R2, =0x11000c24
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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)