一、GPIO简介
GPIO(General-purpose input/output)即通用型输入输出,GPIO可以控制连接在其之上的引脚实现信号的输入和输出
芯片的引脚与外部设备相连,从而实现与外部硬件设备的通讯、控制及信号采集等功能
1. 通过电路原理图分析LED的控制逻辑
2. 通过电路原理图查找LED与Exynos4412的连接关系
3. 通过数据手册分析GPIO中哪些寄存器可以控制LED
4. 通过程序去操控对应的寄存器完成对LED的控制
二、GPIO寄存器分析
高电平导通,低电平截至
输出嘛,肯定就是Output模式GPX2CON【7】=0x1
输出高电平就对应位写1,输出低电平就对应位写0
控制上下拉,点灯暂时用不到。
设置驱动能力,点灯暂时也用不到,本来就使用了一个三极管当开关,点灯够用了。
三、GPIO编程
预处理->编译->汇编->链接
gcc -E
gcc -S
gcc -c
gcc
链接使用的工具是ld, .elf是Linux可执行文件的后缀
-Ttext 0x40005000 是将程序放到内存上,保证程序可以执行。
交叉编译工具链在32位ubuntu上可以正常使用,但是在64位的需要执行这样一条命令
sudo apt-get install lib32z1 lib32ncurses
先rm掉报错的文件,然后
sudo apt update
好家伙和我套娃呢
sudo rm /var/lib/apt/extended_states
然后在
sudo apt update
E: Unable to locate package lib32ncurses5
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
然后把编译好滴.bin文件传给我们的开发板
go 0x40008000
成功点亮LED2
四、LED实验
现在写个程序让LED2闪烁
.text
_start:MAIN:
BL LED_CONFIG
LOOP:
BL LED_ON
BL DELAY
BL LED_OFF
BL DELAY
B LOOPLED_CONFIG:
LDR R2, =0x11000c40
LDR R1, =0x10000000
STR R1, [R2]
MOV PC, LRLED_ON:
LDR R2, =0x11000c44
LDR R1, =0x00000080
STR R1, [R2]
MOV PC, LRLED_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, LRSTOP:
B STOP
.end
运行一下没啥毛病。
本来想写个流水灯来着,太麻烦了,再写个LED3闪烁吧,等以后用C写
.text
_start:MAIN:
BL LED_CONFIG
LOOP:
BL LED_ON
BL DELAY
BL LED_OFF
BL DELAY
B LOOPLED_CONFIG:
LDR R2, =0x11000c20
LDR R1, =0x00000001
STR R1, [R2]
MOV PC, LRLED_ON:
LDR R2, =0x11000c24
LDR R1, =0x00000001
STR R1, [R2]
MOV PC, LRLED_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, LRSTOP:
B STOP
.end