一、GPIO
GPIO(General-purpose input/output)即通用型输入输出,GPIO可以控制连接在其之上的引脚实现信号的输入和输出
芯片的引脚与外部设备相连,从而实现与外部硬件设备的通讯、控制及信号采集等功能
LED实验步骤
实验步骤 以LED2灯 闪烁 为例
1. 通过电路原理图分析LED的控制逻辑
2. 通过电路原理图查找LED与Exynos4412的连接关系
3. 通过数据手册分析GPIO中哪些寄存器可以控制LED
4. 通过程序去操控对应的寄存器完成对LED的控制
第一步
得出结论高电平-亮 低电平-灭
第二步
通过连接芯片那一端的网络标号CHG_COK 查看那个寄存器可以控制该LED灯
在芯片电路设计图中可以看到是GPX2_7在控制着该LED2灯
第三步
查看芯片手册分析哪些寄存器可以控制LED2
可以看到GPX2有四组
GPX2CON:配置GPX2寄存器
GPX2DAT:向内存发送数据(高/地电平)
通过LED与Exynos4412的连接关系可以看到用到的寄存器是GPX2_7(GPX2寄存器第七组)
通过GPX2CON[7]来配置寄存器
配置了寄存器但是没有数据啊
然后得通过GPX2DAT来向GPX2CON[7]发送数据
第四步
在相应的地址中写数据进而控制响应的寄存器
led_asm.s 文件
.text
_start:
MAIN:
BL LED_CONFIG //跳转
LOOP:
BL LED_ON
BL DELAY
BL LED_OFF
BL DELAY
B LOOP
/*控制LED2灯 配置寄存器*/
LED_CONFIG:
LDR R2, =0x11000c40
LDR R1, =0x10000000
STR R1, [R2]
MOV PC, LR
/*控制LED2灯 灭*/
LED_ON:
LDR R2, =0x11000c44 //GPX2DAT 内存地址
LDR R1, =0x00000080 //高电平
STR R1, [R2] //R2指向的0x11000c44内存空间地址写入R1的数据 (R2->0x11000c44 = R1)
MOV PC, LR // 将跳转之前 下一条的地址放回PC指令计数器中
/*控制LED2灯 亮*/
LED_OFF:
LDR R2, =0x11000c44
LDR R1, =0x00000000 //低电平
STR R1, [R2]
MOV PC, LR
/*LED2灯 灭和亮 之间间隔的时间*/
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
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 0x40008000 -o $(TARGET).elf
$(OBJCOPY) -O binary -S $(TARGET).elf $(TARGET).bin
clean:
rm $(TARGET).o $(TARGET).elf $(TARGET).bin