联发科Linkit 7688 (二)GPIO基本操作与C语言编程

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管脚的设备有两种激活方式: 

  • Active high 当 GPIO  为 HIGH时,设备被激活
  • Active low:  当 GPIO为  LOW时,设备激活
     下图显示 LED 和 按钮 分别以 Active High 和 Active Low 两种方式 接入GPIO的电路图
   联发科Linkit 7688 (二)GPIO基本操作与C语言编程_第1张图片

二、GPIO的软件控制
  
     在Linux中, GPIO 表达为一个设备文件, 对GPIO的操作采用文件读写方式即可完成。
     在 目录  /sys/class/gpio/ 下 存放着 GPIO 的设备文件。
   
     查看一个7688的gpio这个目录   

          ls /sys/class/gpio

     返回结果:

         export      gpiochip0   gpiochip127 gpiochip32  gpiochip64   unexport

     其中: export 和 unexport 是两个文件, 其它是目录。

     要操作某一个GPIO,  首先要将GPIO 管脚编号首先写入 export 文件中

     输入命令行: echo  44  > /sys/class/gpio/export
     然后 查看gpio目录    ls /sys/class/gpio
     结果是:     

        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 。(具体见后续博文)




     



  



    

     

你可能感兴趣的:(openwrt,c)