Linkit 系列博文:
联发科Linkit 7688 (一) 上手及在Mac下搭建OpenWrt交叉编译环境,C语言编译Hello,World
联发科Linkit 7688 (二)GPIO基本操作与C语言编程
联发科Linkit 7688 DUO(三): 通过 Arduino 控制外设和传感器
Linkit 7688 DUO(四): 接上各种Arduino传感器和模块——基础篇
Linkit 7688 DUO(五) 接上各种Arduino传感器和模块—扩展篇
Linkit 7688 DUO(六) 加入MQTT物联网协议
GPIO ( General Purpose Input Output ) 全名为通用输入输出,是CPU的一种管脚,即可以做输入、也可以做输出, 常用于将开关、按键、LED、传感器等接到CPU。
Linkit 7688 有40多个GPIO管脚, 分别编号为:gpio1, gpio2, ... gpioxx
一、GPIO 基础
GPIO 管脚支持最高 4 mA 电流, 激活时电压为3.3V. 管脚有两个状态:HIGH 或 LOW, HIGH就是高电压(3.3V), LOW是低电压(0 V)
根据连接电路的不同,连接GPIO管脚的设备有两种激活方式:
ls /sys/class/gpio
返回结果:
export gpiochip0 gpiochip127 gpiochip32 gpiochip64 unexport
其中: export 和 unexport 是两个文件, 其它是目录。
要操作某一个GPIO, 首先要将GPIO 管脚编号首先写入 export 文件中
export gpiochip0 gpiochip32 unexport
gpio44 gpiochip127 gpiochip64
可以看到,该目录下多了一个名为 gpio44的目录。 进入这个目录即可对GPIO44口进行操作。
查看一下gpio44目录: ls /sys/class/gpio/gpio44
结果有几个文件:
active_low device direction edge subsystem uevent value
其中:
direction 文件是GPIO的输入输出方向,写入文本"out" 到该文件,则 GPIO口被置为输出状态。写入"in" 到该文件,则 GPIO口被置为输入状态。
value 文件是GPIO的当前状态值,为1或0 (即 HIGH 或 LOW). 写入文本"1" 到该文件,则 GPIO置为HIGH(高电压), 写入文本"0" 到该文件,则 GPIO置为LOW(低电压)
以命令行操作一下, 将gpio44的direction设成 "out", 值设为 "0"
echo out > /sys/class/gpio/gpio44/direction
echo 0 > /sys/class/gpio/gpio44/value
则此时, 开发板上的WIFI灯亮起。 (开发板的WIFI灯连接了 gpio44, 由于WIFI灯的接入方式是Active Low,故写入 “0“ 灯亮)
写入 “1“ , 则开发板上的WIFI灯灭了,命令如下:
echo 1 > /sys/class/gpio/gpio44/value
操作完成后,可以将GPIO 管脚编号写入 unexport 文件中
echo 44 > /sys/class/gpio/unexport
则目录 /sys/class/gpio/gpio44 将消失, 不能操作GPIO 44脚了
上述过程是适用于所有 Linux 版本的通用处理方式,不仅是OpenWrt独有的。
三、C语言编程操作GPIO
明白上述过程后,也就明白了:C语言编程操作GPIO其实就是读写文件。
比如: 将 gpio44 置为HIGH
int fp =open("/sys/class/gpio/gpio44/value", O_WRONLY);
write(fp, "1", 2 );
close(fp);
一般来说,对设备文件的操作使用 open(), close(), 而不使用 fopen(), fclose(). 前者是操作系统函数、无缓冲的,后者是标准C函数、有缓冲的。
为方便使用,我写了一个gpio模块,包含两个文件 gpio.c, gpio.h, 有几个GPIO的常用操作函数。 比如:
/**
* Export specified GPIO pin
* @param pin_number specified the pin
* @return 1 if success.
* return negative integer error code if fail.
*/
int gpio_export(int pin_number) ;
/**
* Write specified GPIO pin
* @param pin_number specified the pin
* @param value
* @return 1 if success.
* return negative integer error code if fail.
*/
int gpio_write(int pin_number,int value);
/**
* set direction of specified GPIO pin
* @param pin_number specified the pin
* @param direction could be GPIO_IN or GPIO_OUT, GPIO_OUT_HIGH, GPIO_OUT_LOW
* @return 1 if success.
* return negative integer error code if fail.
*/
int gpio_set_direction(int pin_number,int direction);
具体看 gpio.h 头文件 和 example吧
例程:
#include "gpio.h"
int main() {
gpio_export(44); //export gpio44
gpio_set_direction(44, GPIO_OUTPUT); //设 gpio44 为 输出状态
gpio_write(44, GPIO_LOW); //设 gpio44 值为 LOW, 在7688板上则WIFI灯亮起
}
gpio模块和例程在我的下载中分享 :GPIO库
对于CPU直接引出的 GPIO管脚 , 上述操作就可以了。
但是,在Linkit 7688 DUO开发板, 板上引出的GPIO引脚都是由一片 ATmega32U4 芯片提供的,这片芯片提供Arduino的开发接口。
因此,要操作 Linkit 7688 DUO开发板的GPIO口,需要安装 Arduino IDE, 并用Arduino编程ATmega32U4 控制GPIO口,
Linkit 7688主芯片通过串口控制ATmega32U4 。(具体见后续博文)