树莓派wiringPi库函数

目录

前言

以下内容从 wiringPi官网 翻译并整理而成,方便日后查找、学习,如对内容有疑问,请在评论区留言或自行前往官网核对。

一、初始化函数

※ int wiringPiSetup (void) :

  • 当使用这个函数初始化树莓派引脚时,程序使用的是wiringPi 引脚编号表。引脚的编号为 0~16。
  • 需要root权限
  • 返回:执行状态,-1表示失败

※ int wiringPiSetupGpio (void) :

  • 当使用这个函数初始化树莓派引脚时,程序中使用的是BCM GPIO 引脚编号表。
  • 需要root权限
  • 返回:执行状态,-1表示失败

二、GPIO

有关GPIO的用法,请查看我的另一篇博客:
树莓派4B学习笔记(5)—— 来个GPIO操作吧

※ void pinMode(int pin,int mode):

  • 这会将引脚的模式设置为INPUTOUTPUTPWM_OUTPUTGPIO_CLOCK
  • 请注意,只有wiringPi引脚1(BCM_GPIO 18)支持PWM输出,只有wiringPi引脚7(BCM_GPIO 4)支持CLOCK输出模式。
  • 在Sys模式下,此功能无效。如果需要更改引脚模式,则可以在启动程序之前使用脚本中的gpio程序进行操作。

※ void pullUpDnControl(int pin,int pud):

  • 这将对一个设置IO模式为 INPUT 的输入引脚设置为上拉下拉电阻模式。参数pud应该是从下面几个选项选一:PUD_OFF(不上拉/下拉),PUD_DOWN(下拉至接地)或PUD_UP(上拉至3.3v),在Raspberry Pi上,内部上拉/下拉电阻的阻值约为50KΩ。
  • 处于Sys模式时,此功能对Raspberry Pi的GPIO引脚无效。如果您需要激活上拉/下拉,则可以在启动程序之前使用脚本中的gpio程序来执行此操作。

※ void digitalWrite(int pin,int value):

  • 将值HIGHLOW高电平1低电平0)写入必须预先设置为输出的给定引脚。
  • WiringPi 将任何非零数字视为HIGH,0是LOW的唯一表示。

※ void digitalWriteByte(int value);

  • 这将写入提供给前8个GPIO引脚的8位字节。
  • 尽管仍然需要对GPIO硬件进行两次写操作,但这是一次将所有8位都设置为特定值的最快方法。

※ int digitalRead(int pin):

  • 该函数返回在给定引脚上读取的值。根据引脚上的逻辑电平,它将为高电平低电平10)。

※ AnalogRead(int pin):

  • 模拟量输入
  • 树莓派的引脚本身是不支持AD转换的,也就是不能使用模拟量的API,
  • 需要增加另外的模块。

※ AnalogWrite(int pin,int value):

  • 模拟量输出。
  • 树莓派的引脚本身是不支持AD转换的,也就是不能使用模拟量的API。
  • 需要增加另外的模块。

三、PWM

有关PWM的用法,请查看我的另一篇博客:
树莓派4B学习笔记(10)—— PWM输出

※ void pwmWrite(int pin,int value):

  • 将值写入给定引脚的PWM寄存器。
  • 树莓派只有一个板载PWM引脚,即引脚1(BMC_GPIO 18,物理层12),范围为0~1024。其他PWM器件可能具有其他PWM范围。
  • 在Sys模式下,此功能无法控制树莓派的板载PWM 。

※ pwmSetMode (int mode) :

  • 设置PWM的运行模式。
  • PWM发生器可以运行在2种模式下,通过以下参数指定:
    PWM_MODE_BAL :树莓派默认的PWM模式
    PWM_MODE_MS :传统的PWM模式,

※ pwmSetRange (unsigned int range) :

  • 设置PWM发生器的数值范围(相当于STM32的定时器计数值),默认是0~1024。
  • range:范围的最大值,0~range。

※ pwmSetClock (int divisor) :

  • 这将设置PWM时钟的除数(相当于STM32的定时器预分频值)。

四、软件PWM

树莓派硬件上支持的PWM输出的引脚有限,为了突破这个限制,wiringPi提供了软件实现的PWM输出API。

但有一些限制
1、为了保持较低的CPU使用率,最小脉冲宽度为100μS。将其与默认的建议范围100结合在一起可得到100Hz的PWM频率。如果您更改驱动程序代码中的脉冲宽度,请注意,在少于100μS的情况下,Pi是在软件循环中完成的,这意味着CPU使用率将急剧上升,并且几乎不可能控制多个引脚。
2、PWM输出的每个“周期”都需要10ms(100Hz)的时间,默认范围值为100,因此尝试将PWM值每秒更改100次以上将是徒劳的。
3、在softPWM模式下激活的每个引脚大约占用CPU的0.5%。
4、当前,在程序运行时无法禁用引脚上的softPWM。
5、您需要保持程序运行以维持PWM输出!

有关PWM的用法,请查看我的另一篇博客:
树莓派4B学习笔记(10)—— PWM输出

需要包含头文件:#include <softPwm.h>

编译时需要添pthread库链接 -lpthread

※ int softPwmCreate (int pin, int initialValue, int pwmRange) :

  • 使用一个指定的pin引脚创建一个模拟的PWM输出引脚。
  • pin:用来作为软件PWM输出的引脚。
  • initalValue:引脚输出的初始值。
  • pwmRange:PWM值的范围上限。建议使用100。对于pwmRange使用100 ,那么对于给定的引脚,该值可以是0(关闭)到100(完全打开)之间的任何值。
  • 返回:0表示成功。

※ void softPwmWrite (int pin, int value) :

  • 更新引脚输出的PWM值。
  • pin:通过softPwmCreate创建的引脚。
  • value:PWM引脚输出的值。

五、时钟

※ unsigned int millis(void) :

  • 这将返回一个值,该值表示从调用wiringPiSetup函数(或wiringPiSetupGpio函数)到当前时间所经过的毫秒数
  • 返回一个无符号的32位整数。
  • 最大可记录大约49天的毫秒时长。

※ unsigned int micros (void) :

  • 这将返回一个值,该值表示从调用wiringPiSetup函数(或wiringPiSetupGpio函数)到当前时间所经过的微秒数
  • 返回一个无符号的32位整数。
  • 最大可记录大约71分钟的微秒时长。

※ void delay (unsigned int howLong) :

  • 延时函数(单位为毫秒),使系统暂停运行。
  • 由于Linux的多任务性质,所以实际上可能会延时更长时间。
  • 请注意,最大延迟的毫秒数为无符号的32位整数,大约49天

※ void delayMicroseconds (unsigned int howLong) :

  • 延时函数(单位为微秒),使系统暂停运行。
  • 由于Linux的多任务性质,所以实际上可能会延时更长时间。
  • 请注意,最大延迟的微秒数为无符号的32位整数,大约71分钟
  • 需要提出的是,小于100微秒的延迟是通过持续轮询系统时间的硬编码循环计时的,超过100微秒的延迟是使用系统nanosleep()函数完成的。您可能需要考虑非常短的延时对系统整体性能的影响,尤其是在使用线程的情况下。

六、中断

※ int waitForInterrupt (int pin,int timeOut) :

  • 当被调用时,它将等待该引脚上发生中断事件,并且您的程序将被停止
  • timeOut参数以毫秒为单位给出。如果该参数为-1,则意味着永远等待。
  • 如果发生错误,返回值为-1;如果超时,则返回值为0;如果中断成功,则返回值为1。
  • 在调用waitForInterrupt之前,必须首先初始化GPIO引脚,目前唯一的方法是在脚本中使用gpio程序,或者从程序内部使用system()调用。
  • 例如,我们要等待GPIO0引脚的下降沿中断,我们需要在运行程序前执行命令:gpio edge 0 falling

※ int routingPiISR (int pin,int edgeType,void (* function) (void) ) :

  • 注册的函数会在中断发生时执行。
  • edgeType参数是INT_EDGE_FALLING(下降沿触发),INT_EDGE_RISING(上升沿触发),INT_EDGE_BOTH(双边沿触发)或INT_EDGE_SETUP。如果是INT_EDGE_SETUP,则不会进行引脚初始化,假设您已经在其他地方设置了引脚(例如,使用gpio程序)。但是如果您指定了其他类型之一,则该引脚将被导出并初始化为指定的触发方式。
  • function参数是中断处理函数的指针,它是一个无返回值,无参数的函数。当发生中断时需要树莓派执行的操作都写在这个函数里。
  • 返回值:返回负数则代表定义失败
  • 引脚号在当前模式下提供wiringPi,BCM_GPIO,物理或Sys模式。
  • 此功能可以在任何模式下工作,并且不需要root特权。
  • 该功能以高优先级运行(如果程序使用sudo或以root身份运行),并且与主程序同时执行。它具有对所有全局变量,打开文件句柄等的完全访问权限。
  • 注意:当本次中断函数还未执行完毕时,这时候树莓派又触发了一个中断,那么这个后来的中断不会被丢弃,它仍然可以被执行。但是wiringPi最多可以跟踪并记录后来仅仅1个中断,如果不止1个,则他们会被忽略,得不到执行。

例:通过1脚检测 因为按键按下引发的下降沿,触发中断,反转11控制的LED

#include<iostream>
#include<wiringPi.h>
#include<cstdlib>
using namespace std;

void ButtonPressed(void);
void setup();

/********************************/
const int LEDPin = 11;
const int ButtonPin = 1;
/*******************************/

int main()
{

    setup();

    //注册中断处理函数
    if(0>wiringPiISR(ButtonPin,INT_EDGE_FALLING,ButtonPressed))
    {
        cerr<<"interrupt function register failure"<<endl;
        exit(-1);
    }


    while(1)
    ;

    return 0;
}

void setup()
{
    if(-1==wiringPiSetup())
    {
        cerr<<"wiringPi setup error"<<endl;
        exit(-1);
    }
    
    pinMode(LEDPin,OUTPUT);    //配置11脚为控制LED的输出模式
    digitalWrite(LEDPin,LOW);  //初始化为低电平

    pinMode(ButtonPin,INPUT);            //配置1脚为输入
    pullUpDnControl(ButtonPin,PUD_UP);  //将1脚上拉到3.3v

}


//中断处理函数:反转LED的电平
void ButtonPressed(void)
{

    digitalWrite(LEDPin,  (HIGH==digitalRead(LEDPin))?LOW:HIGH );

}

七、串口

有关串口的函数使用时需要包含头文件:#include <wiringSerial.h>

有关串口的用法,请查看我的另一篇博客:
树莓派4B学习笔记(11)—— 串口配置与基础用法

※ int serialOpen (char *device, int baud) :

  • 打开并初始化串口。
  • device:串口的地址,在Linux中就是设备所在的目录。
    默认一般是"/dev/serial0",我的是这样的。
  • baud:波特率。
  • 返回:正常返回文件描述符,否则返回-1失败。

※ void serialClose (int fd) :

  • 关闭由给定文件描述符标识的设备。
  • fd:文件描述符。

※ void serialPutchar (int fd, unsigned char c) :

  • 发送一个字节的数据到串口
  • fd:文件描述符
  • c:要发送的数据

※ void serialPuts (int fd, char *s) :

  • 发送一个字符串到串口。
  • fd:文件描述符。
  • s:发送的字符串,字符串要以'\0'结尾。

※ void serialPrintf (int fd, char *message, …) :

  • 像使用C语言中的printf一样发送数据到串口
  • fd:文件描述符
  • message:格式化的字符串

※ int serialDataAvail (int fd) :

  • 获取串口缓存中可用的字节数。
  • fd:文件描述符
  • 返回:串口缓存中已经接收的,可读取的字节数,-1代表错误

※ int serialGetchar (int fd) :

  • 从串口读取一个字节数据返回。
  • 如果串口缓存中没有可用的数据,则会等待10秒,如果10后还有没,返回-1,所以,在读取前,做好通过serialDataAvail判断下。
  • fd:文件描述符。
  • 返回:读取到的字符。

※ void serialFlush (int fd) :

  • 刷新,清空串口缓冲中的所有可用的数据。
  • fd:文件描述符。

※ *size_t write (int fd,const void * buf,size_t count) :

  • 这个是Linux下的标准IO库函数,需要包含头文件#include <unistd.h>。当要发送到的数据量过大时,wiringPi建议使用这个函数。
  • fd:文件描述符。
  • buf:需要发送的数据缓存数组。
  • count:发送buf中的前count个字节数据。
  • 返回:实际写入的字符数,错误返回-1。

※ *size_t read (int fd,void * buf ,size_t count) :

  • 这个是Linux下的标准IO库函数,需要包含头文件#include <unistd.h>。当要接收的数据量过大时,wiringPi建议使用这个函数。
  • fd:文件描述符。
  • buf:接受的数据缓存的数组。
  • count:接收的字节数.。
  • 返回:实际读取的字符数。

先这样吧,还有IIC,SPI等,有空再更新…

  • 13
    点赞
  • 91
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值