概述
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,其余不变
最后
以上就是机智小虾米为你收集整理的通用输入/输出接口 GPIOGPIO的介绍的全部内容,希望文章能够帮你解决通用输入/输出接口 GPIOGPIO的介绍所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复