目录
-
- 前言
- 一、初始化函数
-
- ※ int wiringPiSetup (void) :
- ※ int wiringPiSetupGpio (void) :
- 二、GPIO
-
- ※ void pinMode(int pin,int mode):
- ※ void pullUpDnControl(int pin,int pud):
- ※ void digitalWrite(int pin,int value):
- ※ void digitalWriteByte(int value);
- ※ int digitalRead(int pin):
- ※ AnalogRead(int pin):
- ※ AnalogWrite(int pin,int value):
- 三、PWM
-
- ※ void pwmWrite(int pin,int value):
- ※ pwmSetMode (int mode) :
- ※ pwmSetRange (unsigned int range) :
- ※ pwmSetClock (int divisor) :
- 四、软件PWM
-
- ※ int softPwmCreate (int pin, int initialValue, int pwmRange) :
- ※ void softPwmWrite (int pin, int value) :
- 五、时钟
-
- ※ unsigned int millis(void) :
- ※ unsigned int micros (void) :
- ※ void delay (unsigned int howLong) :
- ※ void delayMicroseconds (unsigned int howLong) :
- 六、中断
-
- ※ int waitForInterrupt (int pin,int timeOut) :
- ※ int routingPiISR (int pin,int edgeType,void (* function) (void) ) :
- 七、串口
-
- ※ int serialOpen (char *device, int baud) :
- ※ void serialClose (int fd) :
- ※ void serialPutchar (int fd, unsigned char c) :
- ※ void serialPuts (int fd, char *s) :
- ※ void serialPrintf (int fd, char *message, …) :
- ※ int serialDataAvail (int fd) :
- ※ int serialGetchar (int fd) :
- ※ void serialFlush (int fd) :
- ※ *size_t write (int fd,const void * buf,size_t count) :
- ※ *size_t read (int fd,void * buf ,size_t count) :
- 先这样吧,还有IIC,SPI等,有空再更新.....
前言
以下内容从 wiringPi官网 翻译并整理而成,方便日后查找、学习,如对内容有疑问,请在评论区留言或自行前往官网核对。
一、初始化函数
※ int wiringPiSetup (void) :
- 当使用这个函数初始化树莓派引脚时,程序使用的是wiringPi 引脚编号表。引脚的编号为 0~16。
- 需要root权限
- 返回:执行状态,-1表示失败
※ int wiringPiSetupGpio (void) :
- 当使用这个函数初始化树莓派引脚时,程序中使用的是BCM GPIO 引脚编号表。
- 需要root权限
- 返回:执行状态,-1表示失败
二、GPIO
※ void pinMode(int pin,int mode):
- 这会将引脚的模式设置为INPUT,OUTPUT,PWM_OUTPUT或GPIO_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):
- 将值HIGH或LOW(高电平1或低电平0)写入必须预先设置为输出的给定引脚。
- WiringPi 将任何非零数字视为HIGH,0是LOW的唯一表示。
※ void digitalWriteByte(int value);
- 这将写入提供给前8个GPIO引脚的8位字节。
- 尽管仍然需要对GPIO硬件进行两次写操作,但这是一次将所有8位都设置为特定值的最快方法。
※ int digitalRead(int pin):
- 该函数返回在给定引脚上读取的值。根据引脚上的逻辑电平,它将为高电平或低电平(1或0)。
※ AnalogRead(int pin):
- 模拟量输入
- 树莓派的引脚本身是不支持AD转换的,也就是不能使用模拟量的API,
- 需要增加另外的模块。
※ AnalogWrite(int pin,int value):
- 模拟量输出。
- 树莓派的引脚本身是不支持AD转换的,也就是不能使用模拟量的API。
- 需要增加另外的模块。
三、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输出!
需要包含头文件:#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>
※ int serialOpen (char *device, int baud) :
- 打开并初始化串口。
- device:串口的地址,在Linux中就是设备所在的目录。
默认一般是"/dev/ttyAMA0",我的是这样的。 - 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:接收的字节数.。
- 返回:实际读取的字符数。