gpio介绍

来源:互联网 发布:视频播放插件video.js 编辑:程序博客网 时间:2024/06/14 10:58

参考【转载】:https://my.oschina.net/u/1176566/blog/295398

GPIO–General-Purpose IO ports,也就是通用IO接口。

在嵌入式系统中常常有数量众多,但是结构却比较简单的外部设备/电路,对这些设备/电路有的需要CPU为之提供控制手段,有的则需要被CPU用作输入信号。而且,许多这样的设备/电路只要求一位,即只要有开/关两种状态就够了,比如灯亮与灭。对这些设备/电路的控制,使用传统的串行口或并行口都不合适。所以在微控制器芯片上一般都会提供一个“通用可编程IO接口”,即GPIO。接口至少有两个寄存器,即“通用IO控制寄存器”与“通用IO数据寄存器”。    数据寄存器的各位都直接引到芯片外部,而对数据寄存器中每一位的作用,即每一位的信号流通方向时输入还是输出,则可以通过控制寄存器中对应位独立的加以设置。这样,有无GPIO接口也就成为微控制器区别于微处理器的一个特征。在实际的MCU中,GPIO是有多种形式的。比如,有的数据寄存器可以按照位寻址,有些却不能按照位寻址,这在编程时就要区分了。        比如传统的8051系列,就区分成可位寻址和不可位寻址两种寄存器。另外,为了使用的方便,很多mcu把glue logic等集成到芯片内部,增强了系统的稳定性能,比如GPIO接口除去两个标准寄存器必须具备外,还提供上拉寄存器,可以设置IO的输出模式是高阻,还是带上拉的电平输出,或者不带上拉的电平输出。这在电路设计中,外围电路就可以简化不少。

gpio使用:

看看系统中有没有“/sys/class/gpio”这个文件夹。
如果没有请在编译内核的时候加入
Device Drivers —> GPIO Support —> /sys/class/gpio/… (sysfs interface)。

终端中显示如下
1 GPIOA: 0
2 GPIOE: 128
3 GPIOF: 160
4 GPIOG: 192
5 GPIOH: 224
6 GPIOB: 32
7 GPIOC: 64
8 GPIOD: 96

2.计算GPIO号码
我们把GPE11用来控制LED。
GPE0的头是128,GPE11 就是128+11 = 139. (引脚编号 = 控制引脚的寄存器基数 + 控制引脚寄存器位数 )

一、通知系统需要导出控制的GPIO引脚编号:$echo 139 > /sys/class/gpio/export (export :将gpio139导出控制,生成/sys/class/gpio/gpio139,没有生成代表此引脚不可用)

二、控制LED所以是输出: $ echo out > /sys/class/gpio/gpio139/direction (direction :接受的参数: out 、in、heigh、low、heigh/low)

三、进行输出设置了: $ echo 1 > /sys/class/gpio/gpio139/value (value:端口的数值,固定为1代表闭合 或者 0 代表断开)

/sys/class/gpio/unexport 用于通知系统取消导出
/sys/class/gpio/gpiochipX目录保存系统中GPIO寄存器的信息,包括每个寄存器控制引脚的起始编号 base,寄存器名称,引脚总数 导出一个引脚的操作步骤

在使用某个GPIO之前首先的保证此GPIO没有正在被使用,否则是无法操作的;
如NAND模块的NCE3/PC18,此io口正被使用,在导入echo 74 > /sys/class/gpio/export时没问题,但是设置方向是无权操作

LED.java
============================LED.java=================================

try {        process = Runtime.getRuntime().exec("su");        dos = new DataOutputStream(process.getOutputStream());        dos.writeBytes("echo 74 > /sys/class/gpio/export"+"\n");  //将 74引脚导出控制        dos.flush();        dos.writeBytes("echo out > /sys/class/gpio/gpio74/direction"+"\n"); //设置引脚功能为输出        dos.flush();        dos.close();} catch (IOException e) {        e.printStackTrace();}

LED开关方法

public static void cmdLedOff() {        DataOutputStream dos = null;        try {                process = Runtime.getRuntime().exec("su");                dos = new DataOutputStream(process.getOutputStream());                dos.writeBytes("echo 0 > /sys/class/gpio/gpio74/value"+"\n"); //74 引脚设置为 关  1为开                dos.flush();                dos.close();        } catch (IOException e) {                e.printStackTrace();        }}