ARM接口编程-GPIO

一丶GPIO控制

GPIO 功能描述

GPIO 的英文全称为 General-Purpose IO ports,也就是通用 IO 接口。在嵌入式系统中常常有很多简单的外部设备/电路,对这些设备/电路的控制通常只要求一位,即只要有开/关两种状态就够了。比如,控制某个 LED 灯亮与灭,或者通过获取某个引脚的电平属性来达到判断外围设备的状态。
GPIO最简单的使用是监控引脚的瞬时电平,GPIO进一步应用是判断和控制芯片引脚的连续电平变化,即通过软件监控引脚电平时序,来模拟各种各样的部件功能,如SPI、IIC和UART等部件(实际上处理器内部的大多数部件也是监控引脚时序,只不过不是软件来完成,而是通过芯片的内部部件在硬件上自动完成)。

以Exynos4412为例,Exynos4412有304个多功能输入输出GPIO,分为37组通用GPIO和2组memory GPIO。可以通过设置寄存器来确定某个引脚是用于输入、输出还是其他特殊功能。GPIO操作是所有操作的基础,由此扩展来可以了解所有的硬件操作,这是底层硬件和软件开发人员必须要掌握的。

在这里插入图片描述
硬件电路如图所示,LED2~LED5 分别与GPX2_7、GPX1_0、GPF3_4、GPF3_5 相连,通过GPX2_7、GPX1_0、GPF3_4、GPF3_5 引脚的高低电平来控制三极管的导通性,从而控制LED 的亮灭。

4412内存映射图
在这里插入图片描述
对于Exynos4412,通常使用芯片的内部寄存器来控制GPIO,这些寄存器一般驻留在芯片的内部RAM中,每个寄存器都有固定的唯一储存器地址,每个寄存器都是32位,占4个字节的存储空间。
一般同类部件的多个寄存器地址都是连在一起的,有一个寄存器内存基地址,通过相对于该基地址的偏移量来确定某个特定的寄存器。
例如:GPIO寄存器GPX1组的基地址是0x11000000,GPX1CON的偏移量是0x0C20,所以GPX1CON在内部RAM中的地址是0x11000C20。GPIO常用的寄存器主要有以下四种:

(1) 端口控制寄存器(GPA0CON-GPZCON)
在Exynos4412中,大多数的引脚都可复用,所以必须对每个引脚进行配置。端口控制寄存器(GPnCON)定义了每个引脚的功能。
(2) 端口数据寄存器(GPA0DAT-GPZDAT)
如果端口被配置成了输出端口,可以向GPnDAT的相应位写数据。如果端口被配置成了输入端口,可以从GPnDAT的相应位读出数据。
(3) 端口上拉寄存器(GPA0PUD - GPZPUD)
端口上拉寄存器控制了每个端口组的上拉/下拉电阻的使能/禁止。根据对应位的0/1 组合,设置对应端口的上拉/下拉电阻功能是否使能。如果端口的上拉电阻被使能,无论在哪种状态(输入、输出、DATAn、EINTn 等)下,上拉电阻都起作用。
(4) 驱动能力寄存器( GPA0DRV - GPZDRV)
设置GPIO 口的驱动能力

端口控制寄存器(GPA0CON-GPZCON)
对于高端ARM处理器,内部部件比较丰富,芯片引脚资源比较宝贵,一般一个引脚可以被多个部件使用,但是对于每一个时刻,一个引脚只能一个部件所使用,所以ARM处理器会有一个寄存器来配置引脚复用功能,即确定引脚在当前时刻是被那个部件使用。

本例子用到了GPX2_7、GPX1_0、GPF3_4、GPF3_5这4个I/O 引脚,
GPX2_7引脚复用配置对应GPX2CON的[31:28]位
GPX1_0引脚复用配置对应GPX1CON的[3:0]位
GPF3_4引脚复用配置对应GPF3CON的[19:16]位
GPF3_5引脚复用配置对应GPF3CON的[23:20]位。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

端口数据寄存器(GPA0DAT-GPZDAT)
当通过端口配置寄存器将引脚配置为GPIO功能的输入或输出后,就可以使用端口数据寄存器来监控引脚的电平,在某一时候引脚处于输入或输出一种状态。当处于GPIO功能的输入状态时,如果引脚为高或低电平时,端口数据寄存器的对应位为1或0,
当处于GPIO功能的输出状态时,如果端口数据寄存器的对应位为1或0,对应引脚将输出高或低电平,例如:GPX2_7为GPIO输出功能,GPX2DAT的位[7]置1,GPX2_7引脚将输出高电平。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
为了实现控制LED 的目的,需要通过配置GPX1CON、GPX2CON、GPF3CON 寄存器将GPX2_7、GPX1_0、GPF3_4、GPF3_5 设置为输出属性。通过设置对应的DAT寄存器实现点亮与熄灭LED。

寄存器定义

所用到的寄存器定义都包含在头文件exynos_4412.h中,其中包含了本例所用到的GPX1,GPX2和GPF3三组GPIO寄存器程序定义

/* GPX1寄存器程序定义 */
typedef struct {
unsigned int CON;
unsigned int DAT;
unsigned int PUD;
unsigned int DRV;
}gpx1;
#define GPX1 (* (volatile gpx1 *)0x11000C20 )
/* GPX2寄存器程序定义*/
typedef struct {
unsigned int CON;
unsigned int DAT;
unsigned int PUD;
unsigned int DRV;
}gpx2;
#define GPX2 (* (volatile gpx2 *)0x11000C40 )

寄存器读写

程序定义好寄存器之后,就可以对寄存器进行读写,如要读GPX1的CON寄存器到变量tmp中,可采用代码’ tmp=GPX1.CON’,如要向GPF3的DAT寄存器写0x01,可采用代码’GPF3.DAT=0x01’。

设置引脚复用功能,设置为输出

GPX2.CON = (GPX2.CON & ~(0xf<<28))| 1<<28;
//GPX2_7:设置为输出,led2
	GPX1.CON = (GPX1.CON & ~(0xf)) | 1; //GPX1_0: 设置为输出, LED3
	GPF3.CON = (GPF3.CON & ~(0xf<<16 | 0xf<<20)) | (1<<16 | 1<<20);//GPF3_4: 设置为输出,LED4	

引脚输出电平控制

//打开 LED2
GPX2.DAT |= 0x1 << 7;
mydelay_ms(500);//延迟500毫秒
//打开 LED3
GPX1.DAT |= 0x1;
//关闭 LED2
GPX2.DAT &= ~(0x1<<7);
mydelay_ms(500); //延迟500毫秒
//打开 LED5
GPF3.DAT |= (0x1 << 5);
//关闭 LED3
GPX1.DAT &= ~0x1;
mydelay_ms(500); //延迟500毫秒
//打开 LED4
GPF3.DAT |= (0x1 << 4);
//关闭 LED5
GPF3.DAT &= ~(0x1 << 5);
mydelay_ms(500); //延迟500毫秒
//关闭 LED4
GPF3.DAT &= ~(0x1 << 4);

主体程序

led.c

#include "exynos_4412.h"

void Gpio_Init()
{	
	GPX2.CON &= 0c  
}
#include "exynos_4412.h"
int main(void)
{
	GPX2.CON = (GPX2.CON & ~(0xf<<28))| 1<<28;
//GPX2_7:设置为输出,led2
	GPX1.CON = (GPX1.CON & ~(0xf)) | 1; //GPX1_0: 设置为输出, LED3
	GPF3.CON = (GPF3.CON & ~(0xf<<16 | 0xf<<20)) | (1<<16 | 1<<20);//GPF3_4: 设置为输出,LED4		
	while(1)
	{
		//打开 LED2
		GPX2.DAT |= 0x1 << 7;
		mydelay_ms(500);//延迟500毫秒
		//打开 LED3
		GPX1.DAT |= 0x1;
		//关闭 LED2
		GPX2.DAT &= ~(0x1<<7);
		mydelay_ms(500); //延迟500毫秒
		//打开 LED5
		GPF3.DAT |= (0x1 << 5);
		//关闭 LED3
		GPX1.DAT &= ~0x1;
		mydelay_ms(500); //延迟500毫秒
		//打开 LED4
		GPF3.DAT |= (0x1 << 4);
		//关闭 LED5
		GPF3.DAT &= ~(0x1 << 5);
		mydelay_ms(500); //延迟500毫秒
		//关闭 LED4
		GPF3.DAT &= ~(0x1 << 4);
	}
	return 0;
}
  • 3
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值