GPIO实验

一、GPIO

GPIO(General-purpose input/output)即通用型输入输出,GPIO可以控制连接在其之上的引脚实现信号的输入和输出
芯片的引脚与外部设备相连,从而实现与外部硬件设备的通讯、控制及信号采集等功能
在这里插入图片描述

LED实验步骤

最终目的:通过GPIO这个控制器去控制引脚产生高低电平从而控制LED灯的点亮和熄灭

实验: 以LED2灯 闪烁 为例

1. 通过电路原理图分析LED的控制逻辑	

2. 通过电路原理图查找LED与Exynos4412的连接关系

3. 通过数据手册分析GPIO中哪些寄存器可以控制LED

4. 通过程序去操控对应的寄存器完成对LED的控制

第一步

得出结论高电平-亮 低电平-灭
下一步要找到CHG_COK这个网络标号,连接在4412芯片那一个引脚上
在这里插入图片描述

第二步

在这里插入图片描述

通过电路设计图中的网络标号CHG_COK,在芯片电路设计图中可以看到连接在4412芯片上面是GPX2这一组的第七个(GPX2_7)控制着该引脚
(这个引脚的名称为什么这么多呢,因为很多引脚的功能是复用的)

第三步

查看芯片手册分析哪些寄存器可以控制LED2
在这里插入图片描述
通过芯片手册可以看到GPX0, GPX1, GPX2, GPX3 这四组共有32个引脚,那么GPX2这一组就是有8个引脚。
在这里插入图片描述

GPX2CON(32Bit): 可以配置这一组引脚,这一组有八个引脚,都归这个寄存器来管理
GPX2DAT(32Bit): 存储这一组引脚的相关数据

在这里插入图片描述
这里看到对GPX2CON这个寄存器每一位是干什么的一个详解
GPX2CON[0]这一位可以管理GPX2_0这个引脚,以此类推 > GPX2CON[7]这一位可以管理GPX2_7这个引脚
我们这个实验目的:是想要通过GPIO这个寄存器产生一个高或低信号,去控制外面的LED的点亮和熄灭,所以设置成 0x = Output 输出功能,设置GPX2CON[7]这个寄存器的[31:28]这四位设置成0x1
设置了这四位只是将GPX2_7设置成输出功能,然后输出什么信号还是控制不了的

然后得通过GPX2DAT寄存器来向GPX2CON[7]发送数据
在这里插入图片描述
GPX2DAT(32bit,高位没有用)这七位每一位控制着一个引脚,如果GPX2DAT第0位写零,GPX2_0输出低电平,写1输出高电平。
那么GPX2DAT第7位写零,GPX2_7就输出低电平,写1输出高电平

第四步

在相应的地址中写数据进而控制响应的寄存器

led_asm.s 文件

汇编语言编写的代码,利用


.text
_start:

/* 设置LED2 */

LED2_CONFIG:
		LDR R2, =0x11000c40
		LDR R1, =0x10000000
		
		/* 在R2指向的内存空间中写入R1数据 */
		STR R1, [R2]
/* 关闭LED2 */
LED2_ON:
		LDR R2, =0x11000c44
		LDR R1, =0x00000080
		STR R1, [R2]

MAIN:
		BL LED_CONFIG
LOOP:
		BL LED_OFF
		BL DELEY
		BL LED_ON
		BL DELEY
		B LOOP

/*设置LED3*/
LED_CONFIG:
		LDR R1, =0x11000c20
		LDR R2, =0x00000001
		STR R2, [R1]
		MOV PC, LR

/*打开LED3*/
LED_OFF:
		LDR R1, =0x11000c24
		LDR R2, =0x00000001
		STR R2, [R1]
		MOV PC, LR

/*关闭LED3*/
LED_ON:
		LDR R1, =0x11000c24
		LDR R1, =0x00000000
		STR R2, [R1]
		MOV PC, LR

/* LED3 亮灯和关闭 之间的停留时间*/
DELEY:
		LDR R1, =1000000
L:
		SUB R1, R1, #1
		CMP R1, #1
		BNE L

STOP:
		B STOP

.end

Makefile文件

/* 执行文件的名字 */
TARGET = led-asm

/* 交叉编译器的前缀 */
CROSS_COMPILE = arm-none-linux-gnueabi-

/* 完整的编译器名字 */
CC = $(CROSS_COMPILE)gcc

/* 链接文件使用的工具ld */
LD = $(CROSS_COMPILE)ld

/* objcopy这个工具可以将.elf文件编译成开发板可执行的文件 */
OBJCOPY = $(CROSS_COMPILE)objcopy

/* 编译规则 */
all:
	/* 编译分四步:-E 预编译, -S 汇编, -c 目标文件(机器码),gcc 链接 */
	/* 写的就是汇编文件  随意直接进行 -c 形成目标文件  形成 .o 机器码*/
	$(CC) -c $(TARGET).s -o $(TARGET).o

	/* ld链接生成一个.elf可执行文件  链接的时候重定向一个地址 0x40008000 */
	/* -Ttext 0x40008000: 这个文件编译完成之后,将来这段程序放入 0x40008000 这个地址去运行 */
	$(LD) $(TARGET).o -Ttext 0x40008000 -o $(TARGET).elf

	/* 因为开发板上面没有Linux系统,.elf只能在Linux系统下运行,所以需要转换成开发板可执行的文件 */
	/* 	-O 指定转换binary格式 -S 转换.elf文件, 生成.bin文件 */
	$(OBJCOPY) -O binary -S $(TARGET).elf $(TARGET).bin

clean:
	rm $(TARGET).o $(TARGET).elf $(TARGET).bin  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值