WiringPi(树莓派库函数)
一、下载、安装、使用
- 下载:使用git clone git://git.drogon.net/wiringPi下载wringPi
- 安装 :cd wiringPi
执行./build自动安装
如果想在PC上使用交叉编译的方式安装,可以将树莓派里面生成的 libwiringPiDev.so.2.25 和 libwiringPi.so.2.25 库拷贝到PC的库里面,然后创建软连接:
ln -s libwiringPi.so.2.25 libwiringPi.so
ln -s libwiringPiDev.so.2.25 libwiringPiDev.so
参考网页: 树莓派交叉编译环境构建(含 wiringPi)
wiringPi测试
gpio readall命令显示所有的引脚
如图所示:第一种为板上编号(37),即中间两列,表示第几号插针。第二中为wiringPi编码(25),使用wiringPi库编程时是用wiringPi编号,第三种为BCM编号,这个是更加BCM管脚来编号的,使用bcm2835库或python的RPi.GPIO编程时使用BCM编号ringPi API
参考网页:https://projects.drogon.net/raspberry-pi/wiringpi/functions/
包含头文件 #include < wiringPi.h>
需要在makefile里面添加头文件地址和库的地址
例如:-I/usr/local/include -L/usr/local/lib -lwiringPi初始化wiringPi
wiringPiSetup(void);
这个函数初始化wiringPi系统,它提供了将虚拟引脚编号0~16映射到实际的Broadcom GPIO引脚编号。wiringPiSetupGpio(void)
这个函数与上面的相同,但是它允许程序不重新映射直接使用Broadcom GPIO引脚编号wiringPiSetupSys(void)
以上两个函数只有root用户才能调用,本函数访问的不是直接的硬件而是/sys/class/gpio接口,这种模式引脚编号是原生的Broadcom GPIO引脚编号
读写函数
void pinMode (int pin, int mode) ;
这个函数设置引脚的模式为INPUT、OUTPUT或者PWM_OUTPUT.注意仅仅wiringPi引脚1(BCM_GPIO 18)支持PWM输出,引脚编号void digitalWrite (int pin, int value) ;
向给出的引脚写HIGH或者LOW(1 or 0)值,并确保该引脚在之前已经被设置成输出模式。void digitalWriteByte (int value) ;
这个函数写8位字节到8个GPIO引脚,最快的方式是马上设置所有8位字节成一个特定的值,尽管它仍然需要对GPIO硬件进行了两次写操作。void pwmWrite (int pin, int value) ;
向给出引脚的PWM寄存器写value值,value的值必须在0~1024之间。这个函数在系统模式( Sys mode)下无效。void digitalRead(int pin);
这个函数返回读取pin引脚所获得的值,这个值将会是HIGH或者LOW(1 or 0)void pullUpDnControl (int pin, int pud) ;
这个函数将给出的引脚设置成上拉或者下拉电阻模式,引脚必须设置成输入模式。和Arduino不同,BCM2835同时有用上拉和下拉内部电阻器。pud参数应该是;PUD_OFF(没有上拉或下拉),PUD_DOWN(下拉),PUD_UP(上拉到3.3V)。这个函数在Sys模式下无效。
PWM控制
pwmSetMode (int mode) ;
pwm发生器可以产生两种模式– “balanced” and “mark:space”,通过参数:PWM_MODE_BAL or PWM_MODE_MS来切换这两种模式pwmSetRange (unsigned int range) ;
这个函数设置了PWM发生器的寄存器的范围,默认是1024。pwmSetClock (int divisor) ;
这个函数用于设置PWM时钟的分频数。
定时器函数
unsigned int millis (void);
这个函数返回一个数据,这个数据代表了从你的程序调用wiringPiSetup函数开始到当前所经历的毫秒数,它返回一个32位无符号数。void delay (unsigned int howLong)
这个函数会导致程序执行暂停至少howLong毫秒,由于linux多任务的特性可能会更长。void delayMicroseconds (unsigned int howLong)
这个函数会导致程序执行暂停至少howLong微秒,由于linux多任务的特性可能会更长。
程序/线程优先级
- int piHiPri (int priority) ;
中断
- int wiringPiISR (int pin, int edgeType, void (*function)(void)) ;
这个函数在特殊的引脚上注册一个函数来接收中断,edgeType参数是INT_EDGE_FALLING、INT_EDGE_RISING,INT_EDGE_BOTH or INT_EDGE_SETUP中的一个。如果它是INT_EDGE_SETUP,则不会有初始化引脚的操作发生-它假定你已经在别处设置了引(例如 使用gpio命令),但是如果你指定了其它类型中的一种,然后这个引脚就会按照规定被导出和初始化。它通过合适的调用gpio通用命令来实现,因此它应该被使用。waitForInterrupt()函数已经被弃用了,你应该使用下面这个更新更简单的wiringPiISR() 函数。
- int wiringPiISR (int pin, int edgeType, void (*function)(void)) ;
并行处理
- int piThreadCreate (name) ;
- piLock (int keyNum) ;
- piUnlock (int keyNum) ;
混杂函数
- piBoardRev (void) ;
- wpiPinToGpio (int wPiPin) ;
- setPadDrive (int group, int value) ;
三、软件PWM库
WiringPi提供了一套以软件的方式模拟PWM的函数,这些函数可以用在树莓派任意的GPIO上。
包含头文件
- #include < wiringPi.h>
- #include < softPwm.h>
编译的时候需要包含pthread和wiringPi库的路径
例如:cc -o myprog myprog.c -lwiringPi -lpthread
int softPwmCreate (int pin, int initialValue, int pwmRange) ;
void softPwmWrite (int pin, int value) ;