通用输入/输出接口 GPIO

GPIO的介绍

GPIO(General Purpose Input/Output),通俗点讲就是一些引脚,可以通过它们向外输出高低电平,或者读入引脚的状态。GPIO 接口技术是众多接口技术中最为简单的一种。

GPIO 接口具有:功率损耗低、布线简单、封装尺寸小、控制简单等优点,故其应用广泛,在嵌入式系统中占有很大的比重。

GPIO 接口通常至少有2个寄存器:通用I/O控制寄存器 和 通用I/O数据寄存器
数据寄存器的各位直接引到芯片外部供外部设备使用,各位上对应的信号是输入还是输出,可通过设置控制寄存器中对应位独立地控制。
除这两种基本寄存器外,有时还有上拉寄存器,通过它可以设置I/O输出模式是高阻态的或带上拉电平输出的或不带上拉电平输出的。

S5PV210的GPIO寄存器

GPIO接口组寄存器由4位来控制,扩展了GPIO引脚的功能。所以S5PV210的GPIO不仅有GPIO的功能,还可复用作其他功能,如串口。

实验用到的寄存器详解

S5PV210的GPIO寄存器非常多,每个接口组有两种类型的控制寄存器,一种工作在正常模式,另一种工作在掉电模式。下面只针对本章实验用到的GPC0进行介绍,其他的GPIO接口用法可依葫芦画瓢。
GPC0:5 in/out port
GPC0共有5个引脚。

GPC0的控制寄存器有:GPC0CON、GPC0DAT、GPC0PUD、GPC0DRV;
GPC0CONPDN、GPC0PUDPDN。前四类工作在正常模式,后两类工作在掉电模式。

(1)GPC0CON寄存器
此寄存器为GPC0引脚的控制寄存器,主要用于配置各引脚的功能。其对应的地址为0xE0200060。
因为GPC0共有5个引脚,且每个引脚需用4位来控制,故GPC0CON共有20位,从右到左依次对应0-4号引脚。
3号引脚通常记作GPC0_3。
0000代表输入,0001代表输出。

GPC0CON
GPC0CON[4][19:16]
GPC0CON[3][15:12]
GPC0CON[2][11:8]
GPC0CON[1][7:4]
GPC0CON[0][3:0]

(2)GPC0DAT寄存器
此寄存器用于决定引脚的输入或输出电平的状态:
当引脚设为输入(0000)时,可出对应引脚的电平状态是高是低;当引脚设为输出(0001)时,可入引脚的电平是高还是低。
其对应的内存地址为0xE0200064。该寄存器是1位控制一个引脚。

(3)GPC0PUD寄存器
当值为0b00时,对应引脚无上拉/下拉电阻;当值为0b01时,有内部下拉电阻;当值为0b10时,内部有上拉电阻;当值为0b11时为保留。
其对应的内存地址为0xE0200068。该寄存器用2位控制一个引脚。

(4)GPC0DRV寄存器
……
(5)GPC0CONPDN寄存器
……
(6)GPC0PUDPDN寄存器
……

实验实例1

实验目的:
利用S5PV210的GPC0_3、GPC0_4这两个GPIO引脚控制2个LED发光二极管,用C语言实现。

1)启动代码start.S

.text
.global _start	//声明一个全局的标号
_start:
	bl main	    //跳转到C函数中执行

halt_loop:
	b halt_loop //死循环,不让程序跑飞

2)循环点亮LED灯

#define GPC0CON	*((volatile unsigned int*)0xE0200060) //寄存器的地址,必须要进行宏定义
#define GPC0DAT	*((volatile unsigned int*)0xE0200064)

#define GPC0_3_out	(1<<(3*4)) //3号引脚[15:12]设为0001 输出
#define GPC0_4_out	(1<<(4*4)) //4号引脚[19:16]设为0001 输出

#define GPC0_3_MASK	(0xF<<(3*4)) //3号引脚[15:12]设为1111
#define GPC0_4_MASK	(0xF<<(4*4)) //4号引脚[19:16]设为1111

void delay(volatile unsigned long dly)
{
	volatile unsigned int t = 0xFFFF;
	while(dly--)
		for(;t>0;t--);		//循环次数必须设置大一点,否则看不出闪烁效果
}

int main()
{
	unsigned long i = (1<<3); //1左移3位,0001变为1000。i用于指示当前亮着的灯。初始化为3号灯亮。
	//&= 碰1不变,碰0清零。~ 取反。| 连接作用。
	GPC0CON &= ~(GPC0_3_MASK|GPC0_4_MASK);  //括号里表示:[19:12]是11111111
	//GPC0CON共有20位,控制5个引脚,这一步将3、4引脚清零,其余引脚保持不变。
	//|= 碰1变1,碰0不变。
	GPC0CON |= (GPC0_3_out|GPC0_4_out); //括号里表示:[19:12]是00010001
	//配置3、4引脚为输出引脚。

	while(1) 
	{
		delay(0x50000);
		GPC0DAT &= ~(0x3<<3);  //0011左移3位得到11000,~得到00111,&=将3、4位清零,即两灯全关。
		if(i==0x08) //0x08用二进制表示为1000,即三号灯。若当前亮的是三号灯,
			i=(1<<4); //0001变到10000指示4号灯
		else
			i=(1<<3); //指示到三号灯
		GPC0DAT |= i; //|=之后3、4位要么是01(3号灯亮),要么是10(4号灯亮)。循环点亮。
	}
	return 0;
}

&= 主要目的是将某几位清零,其余不变
|= 主要目的是将某几位变为1,其余不变

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值