wiringPi 库下用C控制GPIO

介绍wiringPi,引脚的具体使用。

http://wiringpi.com/examples/gertboard-and-wiringpi/blink/

引脚图,二极管阴极接6号引脚(接地)

二极管阳极接11号引脚(wiringPi库,0,BCM编码17)

编码方式一、

#include <stdio.h>
#include <wiringPi.h>

// LED Pin - wiringPi pin 0 is BCM_GPIO 17.

#define LED     0

int main (void)
{
  printf ("Raspberry Pi - Gertboard Blink\n") ;

  wiringPiSetup () ;

  pinMode (LED, OUTPUT) ;

  for (;;)
  {
    digitalWrite (LED, 1) ;     // On
    delay (500) ;               // mS
    digitalWrite (LED, 0) ;     // Off
    delay (500) ;
  }
  return 0 ;
}

编码方式二、

#include <wiringPi.h>
int main (void)
{
  wiringPiSetup () ;
  pinMode (0, OUTPUT) ;
  for (;;)
  {
    digitalWrite (0, HIGH) ; delay (500) ;
    digitalWrite (0,  LOW) ; delay (500) ;
  }
  return 0 ;
}

The wiringPi functions we are using are:

  • wiringPiSetup()

This must be called before anything else – it opens the GPIO devices and allows our program to access it.

  • pinMode()

This set the mode of the pin – usually in or out, but there are some other functions too.

  • digitalWrite()

Outputs a value (0 or 1) to the given pin.

  • delay()

This delays for a number of milliseconds.

So there should be nothing out of the ordinary here – and some will be very familiar if you have used an Arduino in the past.

When your program is running, you can press Control-C to stop it and return to command mode.

gcc -Wall -o blink blink.c -lwiringPi
sudo ./blink

-Wall

This enables all the warnings about constructions that some users consider questionable, and that are easy to avoid (or modify to prevent the warning), even in conjunction with macros. This also enables some language-specific warnings described in C++ Dialect Options and Objective-C and Objective-C++ Dialect Options.

-Wall turns on the following warning flags:

-Waddress   
          -Warray-bounds (only with -O2)  
          -Wc++11-compat  
          -Wchar-subscripts  
          -Wenum-compare (in C/Objc; this is on by default in C++) 
          -Wimplicit-int (C and Objective-C only) 
          -Wimplicit-function-declaration (C and Objective-C only) 
          -Wcomment  
          -Wformat   
          -Wmain (only for C/ObjC and unless -ffreestanding)  
          -Wmaybe-uninitialized 
          -Wmissing-braces  
          -Wnonnull  
          -Wparentheses  
          -Wpointer-sign  
          -Wreorder   
          -Wreturn-type  
          -Wsequence-point  
          -Wsign-compare (only in C++)  
          -Wstrict-aliasing  
          -Wstrict-overflow=1  
          -Wswitch  
          -Wtrigraphs  
          -Wuninitialized  
          -Wunknown-pragmas  
          -Wunused-function  
          -Wunused-label     
          -Wunused-value     
          -Wunused-variable  
          -Wvolatile-register-var

You need to link with the wiringPi library, hence the -lwiringPi     and you also need to be root to run the program, as only root can directly access the GPIO.

-l是指动态库链接  -lwiringPi是指在编译时,寻找wiringPi.so动态库文件。加上static链接 wieingPi.a静态库文件。

Linux下的库文件分为两大类分别是动态链接库(通常以.so结尾)和静态链接库(通常以.a结尾),二者的区别仅在于程序执行时所需的代码是在运行时动态加载的,还是在编译时静态加载的。

默认情况下, GCC在链接时优先使用动态链接库,只有当动态链接库不存在时才考虑使用静态链接库,如果需要的话可以在编译时加上-static选项,强制使用静态链接库。

在/usr/dev/mysql/lib目录下有链接时所需要的库文件libmysqlclient.so和libmysqlclient.a,为了让GCC在链接时只用到静态链接库,可以使用下面的命令:

gcc –L /usr/dev/mysql/lib –static –lmysqlclient test.o –o test

静态库链接时搜索路径顺序:

1. ld会去找GCC命令中的参数-L
2. 再找gcc的环境变量LIBRARY_PATH
3. 再找内定目录 /lib /usr/lib /usr/local/lib 这是当初compile gcc时写在程序内的

动态链接时、执行时搜索路径顺序:

1. 编译目标代码时指定的动态库搜索路径
2. 环境变量LD_LIBRARY_PATH指定的动态库搜索路径
3. 配置文件/etc/ld.so.conf中指定的动态库搜索路径
4. 默认的动态库搜索路径/lib
5. 默认的动态库搜索路径/usr/lib

有关环境变量:
LIBRARY_PATH环境变量:指定程序静态链接库文件搜索路径
LD_LIBRARY_PATH环境变量:指定程序动态链接库文件搜索路径

关于GCC更多解释和应用,可以参考  http://www.cnblogs.com/ggjucheng/archive/2011/12/14/2287738.html

附录:gcc -I -L -l  区别

我们用gcc编译程序时,可能会用到“-I”(大写i),“-L”(大写l),“-l”(小写l)等参数,下面做个记录:

例:

gcc -o hello hello.c -I /home/hello/include -L /home/hello/lib -lworld

上面这句表示在编译hello.c时:

-I /home/hello/include表示将/home/hello/include目录作为第一个寻找头文件的目录,寻找的顺序是:/home/hello/include-->/usr/include-->/usr/local/include

 

 

-L /home/hello/lib表示将/home/hello/lib目录作为第一个寻找库文件的目录,寻找的顺序是:/home/hello/lib-->/lib-->/usr/lib-->/usr/local/lib

 

 

 -lworld表示在上面的lib的路径中寻找libworld.so动态库文件(如果gcc编译选项中加入了“-static”表示寻找libworld.a静态库文件)

时间: 2024-11-05 04:44:25

wiringPi 库下用C控制GPIO的相关文章

arm下用shell控制gpio

创建脚本gpio.sh #!/bin/sh PIN=$1 VALUE=$2 if test -d /sys/class/gpio/gpio$PIN/ then echo $VALUE > /sys/class/gpio/gpio$PIN/value else echo $PIN > /sys/class/gpio/export echo out > /sys/class/gpio/gpio$PIN/direction echo $VALUE > /sys/class/gpio/gp

RaspberryPi2B使用bcm2835c库控制GPIO

RaspberryPi2B使用bcm2835c库控制GPIO 网上有很多RaspberryPi控制GPIO的方法,有Python.WiringPi.bcm2835 C library 使用bcm2835 C库控制GPIO时,发现不管怎么设置,GPIO都没有反应,没有输出控制的值. 查资料发现: bcm2835的C库是bcm2835芯片专用的库,在RaspberryPI上使用没有问题,而RaspberryPi2B使用的是bcm2836芯片,虽说bcm2836和bcm2835芯片基本上一模一样,可以

Linux下gcc编译控制动态库导出函数小结

Linux下gcc编译控制动态库导出函数小结 来源 https://www.cnblogs.com/lidabo/p/5703890.html 根据说明文档“How To Write Shared Libraries"介绍, 有四种方法: 1. 在方法声明定义时,加修饰:__attribute__((visibility("hidden"))) 就是说将不公开的函数都加上这个属性,没加的就是可见的 2. gcc 在链接时设置 -fvisibility=hidden,则不加 v

树莓派wiringPi库详解

wiringPi是一个很棒的树莓派控制API,使用C语言开发,提供了丰富的接口:GPIO控制,中断,多线程,等等.java 的pi4j项目也是基于wiringPi的,我最近也在看源代码,到时候整理好了会放出来的. 下面开始wiringPi之旅吧! 安装 进入  wiringPi的github (https://git.drogon.net/?p=wiringPi;a=summary)下载安装包.点击页面的第一个链接的右边的snapshot,下载安装压缩包. 然后进入安装包所在的目录执行以下命令:

树莓派wiringPi库API函数(翻译中)

树莓派wiringPi库API函数 API函数英文网页    :https://projects.drogon.net/raspberry-pi/wiringpi/functions/ BCM2835芯片手册 :https://github.com/raspberrypi/documentation/blob/master/hardware/raspberrypi/bcm2835 wiringPi库下载地址 : https://git.drogon.net/?p=wiringPi;a=summa

BeagleBone Black板第六课:C++编程控制GPIO基础

BBB板第六课:C++编程控制GPIO基础 在一上课我们通过Shell脚本编程实现了对GPIO端口的简单输出控制,实现对两个LED指示灯的交替点亮和关闭,接下来的一两节课,将通过C++程序来实现Shell脚本的功能.为了实现对应的程序控制,我查阅了好多资料,测试过程中发觉网上的一些程序套用过来总是出现各种各样的编译错误,压根就控制不了BBB板,不知是我的BBB板太新,还是以前的程序太旧.最后还是从头开始,重新研究BBB板的文件系统,找出头文件,找出所有相关的函数,终于实现GPIO的C++程序控制

红外控制GPIO

论坛里有人说要拿红外控制GPIO弄小车,问我怎么弄,我就写了这个帖子我在GPIO口上焊了4个LED,代表上下左右 不止可以控制gpio,还可以执行任意shell不是lirc,是我自己写的轻量级红外接收程序CbOS GM中有运行方法(请先加载红外驱动): cd ~/source_code/IR ./ir 然后按下遥控器的一个按键(我按"上"),得到 get key event! Key 112 Pressed get key event! Key 112 Released 记下按键代码(

Android(Java)控制GPIO的方法及耗时分析

前面两篇分别介绍了通过脚本和C代码读写/sys/class/gpio以控制GPIO.实际项目调试时经常还需要在Java代码里控制GPIO,其实现与C代码类似,唯一不同是Android权限.本文重点介绍Android6.0权限的配置并对在Java层控制GPIO的耗时做简单分析. 以高通平台为例,权限配置主要修改HLOS/device/qcom/sepolicy/common目录下的file.te.file_contexts和system_app.te三个文件. file.te修改如下, # GPI

Android(Linux)控制GPIO的方法及实时性分析

Linux下控制GPIO的方法有N种,详细请参考<RPi GPIO Code Samples>,文中用十多种语言演示了如何控制GPIO,非常全面详尽.因此,这里不再多做赘述,仅把调试过程中整理的脚本贴上并做简单的分析.特别说明,Linux必须有root权限!!!否则会出现/system/bin/sh: can't create /sys/class/gpio/export: Permission denied等错误. @echo off echo adb root adb root >%