友善RK3399/NanoPC-T4开发板wiringPi的C语言访问GPIO外设实例讲解 -【申嵌视频】
1 wiringPi简介
wiringPi库最早是由Gordon Henderson所编写并维护的一个用C语言写成的类库,除了GPIO库,还包括了I2C库、SPI库、UART库和软件PWM库等,由于wiringPi的API函数和arduino非常相似,这也使得它广受欢迎。
wiringPi库除了提供wiringPi类库及其头文件外,还提供了一个命令行工具gpio:可以用来设置和读写GPIO管脚,以方便在Shell脚本中控制GPIO管脚。
wiringPi库最初是为BCM2835芯片编写的,现已移植到FriendlyELEC-RK3399平台,目前支持NanoPi M4、NanoPi NEO4、和NanoPC-T4开发板。
当前提供的WiringPi版本:2.44
WiringPi项目主页: http://wiringpi.com
我们同时为FriendlyELEC-RK3399平台提供了wiringPi的Python版本,请前往这里查看: WiringPi-Python for RK3399/zh
2 支持的OS
- FriendlyCore
- FriendlyDesktop
注:最新版本ROM中已经默认预装 wiringPi,也可以参照本文的方法手动安装
3 支持的开发板
4 wiringPi在T4/M4/NEO4上的安装
通过ssh,或者串口终端进入开发板的命令行,用以下命令安装:
# 删除旧的实现 wget http://112.124.9.243:8888/wiringpi/friendlyelec-rk3399/remove_oldversion_wiringPi.sh chmod 755 remove_oldversion_wiringPi.sh sudo ./remove_oldversion_wiringPi.sh # 下载并安装wiringPi for RK3399 wget http://112.124.9.243:8888/wiringpi/friendlyelec-rk3399/wiringpi-v2.44-friendlyelec-rk3399.deb sudo dpkg -i wiringpi-v2.44-friendlyelec-rk3399.deb
4.1 测试安装
通过以下指令可以测试wiringPi是否安装成功:
gpio readall
如果安装成功会显示开发板的针脚布局,例如NanoPi M4会显示如下信息:
root@NanoPi-M4:~# gpio readall +------+-----+----------+------+ Model NanoPi-M4 +------+----------+-----+------+ | GPIO | wPi | Name | Mode | V | Physical | V | Mode | Name | wPi | GPIO | +------+-----+----------+------+---+----++----+---+------+----------+-----+------+ | | | 3.3V | | | 1 || 2 | | | 5V | | | | | | I2C2_SDA | | | 3 || 4 | | | 5V | | | | | | I2C2_SCL | | | 5 || 6 | | | GND(0V) | | | | 32 | 7 | GPIO1_A0 | OUT | 0 | 7 || 8 | | ALT | GPIO4_C1 | 15 | 145 | | | | GND(0V) | | | 9 || 10 | | ALT | GPIO4_C0 | 16 | 144 | | 33 | 0 | GPIO1_A1 | IN | 0 | 11 || 12 | 1 | IN | GPIO1_C2 | 1 | 50 | | 35 | 2 | GPIO1_A3 | IN | 0 | 13 || 14 | | | GND(0V) | | | | 36 | 3 | GPIO1_A4 | IN | 0 | 15 || 16 | 0 | IN | GPIO1_C6 | 4 | 54 | | | | 3.3V | | | 17 || 18 | 0 | IN | GPIO1_C7 | 5 | 55 | | | | UART4_TX | | | 19 || 20 | | | GND(0V) | | | | | | UART4_RX | | | 21 || 22 | 0 | IN | GPIO1_D0 | 6 | 56 | | | | SPI1_CLK | | | 23 || 24 | | | SPI1_CSn | | | | | | GND(0V) | | | 25 || 26 | | ALT | GPIO4_C5 | 11 | 149 | | | | I2C2_SDA | | | 27 || 28 | | | I2C2_SCL | | | | | | I2S0_LRX | | | 29 || 30 | | | GND(0V) | | | | | | I2S0_LTX | | | 31 || 32 | | | I2S_CLK | | | | | | I2S0_SCL | | | 33 || 34 | | | GND(0V) | | | | | | I2S0SDI0 | | | 35 || 36 | | | I2S0SDO0 | | | | | | I2S0I1O3 | | | 37 || 38 | | | I2S0I2O2 | | | | | | GND(0V) | | | 39 || 40 | | | I2S0I3O1 | | | +------+-----+----------+------+---+----++----+---+------+----------+-----+------+ root@NanoPi-M4:~#
5 wiringPi示例
将一个Matrix - LED通过连接至开发板,引脚的连接对应如下:
Matrix-LED是一个简单的发光二极管模块。3-Pin 2.54mm排针,V接电源,G接地,S信号通过一个三极管放大控制LED的导通或关闭。您可以向S输出静态的高低电平信号,也可以输出变化的PWM信号,信号电平可以是3.3V或5V。当您向S输出高电平时LED以最大亮度发光,低电平就完全熄灭,可变占空比的PWM信号可以调节发光的亮度。
5.1 工作原理
3-Pin 2.54mm排针,V接电源,G接地,S信号通过一个三极管放大控制LED的导通或关闭。您可以向S输出静态的高低电平信号,也可以输出变化的PWM信号,信号电平可以是3.3V或5V。当您向S输出高电平时LED以最大亮度发光,低电平就完全熄灭,可变占空比的PWM信号可以调节发光的亮度。
5.2 原理图
5.3 实物线路连接图
接下来我们用wiringPi实现一个LED闪烁的例子,
在代码中使用数字7来操作Pin7这个引脚:
5.4 C语言示例
创建一个C源文件:
vi test.c
然后键入如下代码:
#include <wiringPi.h> int main(void) { wiringPiSetup() ; pinMode (7, OUTPUT) ; for(;;) { digitalWrite(7, HIGH) ; delay (500) ; digitalWrite(7, LOW) ; delay (500) ; } }
编译test.c并运行:
gcc -Wall -o test test.c -lwiringPi -lwiringPiDev -lpthread -lrt -lm -lcrypt sudo ./test
看到LED灯一闪一闪的,就表示成功了。
5.5 Shell示例
创建一个shell脚本:
vi test.sh
然后键入如下代码:
LED=7 gpio mode $LED out while true; do gpio write $LED 1 sleep 0.5 gpio write $LED 0 sleep 0.5 done
运行脚本:
source test.sh
会看到LED闪烁了。
5.6 Python示例
请前往这里查看: WiringPi-Python for RK3399/zh
6 wiringPi 常用API速查
6.1 初始化函数
6.1.1 wiringPiSetup (void)
该函数初始化wiringPi,并假定程序将使用wiringPi的管脚定义图。具体管脚映射,可以通过gpio readall命令来查看。
该函数需要root权限。
6.1.2 int wiringPiSetupGpio(void)
该函数和wiringPiSetup函数类似,区别在于假定程序使用的是CPU的GPIO管脚定义,而没有重新映射。
该函数需要root权限。
6.1.3 int wiringPiSetupPhys (void)
该函数和wiringPiSetup函数类似,区别在于不允许程序使用物理管脚定义,仅支持P1接口。
该函数需要root权限。
6.1.4 int wiringPiSetupSys (void)
该函数初始化wiringPi,使用/sys/class/gpio接口,而不是直接通过操作硬件来实现。
该函数可以使用非root权限用户,在此种模式下的管脚号是CPU的GPIO管脚号,和wiringPiSetupGpio函数类似。
在此种模式下,在运行程序前,您需要通过/sys/class/gpio接口导出要使用的管脚。
你可以在一个独立的shell脚本中来导出将要使用的管脚,或者使用系统的system()函数来调用GPIO命令。
6.2 核心函数
6.2.1 void pinMode (int pin, int mode)
使用该函数可以将某个引脚配置为INPUT(输入) OUTPUT(输出)PWM_OUTPUT(脉冲输出)或者GPIO_CLOCK(时钟)。
在Sys模式下,这个函数没有影响。
你可以通过调用GPIO命令在shell脚本中来设置管脚的模式。
6.2.2 void pullUpDnControl (int pin, int pud)
使用该函数可以设置指定管脚使用上拉或者下拉电阻模式,通常当需要管脚作为输入引脚时,需要设定此项。
不同于Arduino,CPU有内部上拉和下拉电阻这两种模式。
参数pud可以为PUD_OFF(无上拉或下拉电阻)、PUD_DOWN(内部下拉至地线)或者PUD_UP(内部上拉至3.3V)。
该函数在Sys模式下无作用。
如果你需要激活上拉或下拉电阻的话,在启动程序前,可以通过在脚本中调用GPIO命令来实现。
6.2.3 void digitalWrite (int pin, int value)
使用该函数可以向指定的管脚写入HIGH(高)或者LOW(低),写入前,需要将管脚设置为输出模式。
wiringPi将任何的非0值作为HIGH(高)来对待,因此,0是唯一能够代表LOW(低)的数值。
6.2.4 void pwmWrite (int pin, int value)
使用该函数可以将值写入指定管脚的PWM寄存器中,可设置的值为0~1024,其他PWM讴备可能有不同的PWM范围。
当在Sys模式时,该函数不可用来控制板上PWM。
6.2.5 digitalRead(int pin);
使用该函数可以读取指定管脚的值,读取到的值为HIGH(1)或者LOW(0),该值取决于该管脚的逻辑电平的高低。
6.2.6 analogRead (int pin) ;
该函数返回所指定的模拟输入管脚的值。你需要添加额外的模拟模块来使用该函数,比如Gertboard,quick2Wire模拟板等。
6.2.7 analogWrite (int pin, int value) ;
该函数将指定的值写入到指定的管脚。你需要添加额外的模拟模块来使用该函数,比如Gertboard等。
---------------------------------------------------------------------------------------------------------------------------------------------------------------
上海嵌入式家园-开发板代理商城
http://embedclub.taobao.com/
专业销售瑞芯微RK3399系列开发板,友善之臂NanoPC-T4, NanoPi M4, NanoPi NEO4开发板
友善RK3399/NanoPC-T4开发板wiringPi的C语言访问GPIO外设实例讲解 -【申嵌视频】的更多相关文章
- 友善RK3399/NanoPC-T4开发板wiringPi Python库访问GPIO外设实例讲解 -【申嵌视频】
1 wiringPi for Python简介 wiringPi for Python是wiringPi的Python语言扩展,用于在Python程序中操作GPIO/I2C/SPI库/UART/PWM ...
- RK3399 友善NanoPC-T4开发板使用sysfs方法控制status LED状态灯-【申嵌视频-RK3399篇】
实验1:sysfs 操作方法控制NanoPC-T4开发板上LED灯 (status LED状态灯:GPIO0_B5/LED1_OUT)root@NanoPC-T4: cd /sys/class/led ...
- RK3399/NanoPC-T4开发板使用/sys/class/gpio操作外接GPIO设备-【申嵌视频-RK3399篇】
实验2:RK3399/NanoPC-T4开发板使用/sys/class/gpio操作外接GPIO设备,比如外接一个LED模块,通过GPIO1_A0管脚 1 介绍 LED模块 Matrix-LE ...
- 友善之臂tiny4412-1306开发板安卓系统烧写
折腾了很久,终于烧写成功.不废话,咱们说说流程吧. 首先,我们需要有一个基于tiny4412的kernel,从友善之臂官网获取. 然后解压: 1.tar -xvf linux-3.5 .... 然后 ...
- 手把手教你从零实现Linux misc设备驱动一(基于友善之臂4412开发板)
关于怎样来写一个misc设备,在前面有篇文章已经介绍了大致的流程,如今就让我们来实现一个最简单的misc设备驱动. http://blog.csdn.net/morixinguan/article/d ...
- 手把手教你写Linux设备驱动---中断(三)--workqueue实现(基于友善之臂4412开发板) 【转】
转自:http://blog.csdn.net/morixinguan/article/details/69680909 上节,我们讲到如何来实现tasklet小任务机制 http://blog.cs ...
- TurnipBit开发板DIY呼吸的吃豆人教程实例
转载请以链接形式注明文章来源(MicroPythonQQ技术交流群:157816561,公众号:MicroPython玩家汇) 0x00前言 吃豆人是耳熟能详的可爱形象,如今我们的TurnipBit也 ...
- 使用arm开发板搭建无线mesh网络(二)
上篇博文介绍了无线mesh网络和adhoc网络的区别,这篇文章将介绍无线mesh网络的骨干网节点的组建过程.首先需要介绍下骨干网节点的设计方案:每个骨干网节点都是由一块友善之臂的tiny6410 ar ...
- x86 构架的 Arduino 开发板Intel Galileo
RobotPeak是上海的一家硬件创业团队,团队致力于民用机器人平台系统.机器人操作系统(ROS)以及相关设备的设计研发,并尝试将日新月异的机器人技术融入人们的日常生活与娱乐当中.同时,RobotPe ...
随机推荐
- 【转】Android-Input 触摸设备
https://source.android.com/devices/input/touch-devices 触摸设备 Android 支持各种触摸屏和触摸板,包括基于触控笔的数字化板. 触摸屏是与显 ...
- makefile笔记3 - makefile规则
target ... : prerequisites ... command ... ... 规则包含两个部分,一个是依赖关系,一个是生成目标的方法. 在 Makefile 中,规则的顺序是很重要的, ...
- re正则表达式匹配字符串中的数字
re.match(r'.*-(\d*).html',url_1).group(1) \d+匹配1次或者多次数字,注意这里不要写成*,因为即便是小数,小数点之前也得有一个数字:\.?这个是匹配小数点的, ...
- Delphi编程之爬取贴吧图片最终版
接着前面两篇文章的内容,我们今天把这个贴吧爬取图片的程序完善,让它具有可以下载贴吧多页和帖子多页图片的能力. 主界面设计如下,包含3个labelededit,3个button,1个memo,1个str ...
- Linux 驱动——Button驱动6(mutex、NBLOCK、O_NONBLOCK)互斥信号量、阻塞、非阻塞
button_drv.c驱动文件: #include <linux/module.h>#include <linux/kernel.h>#include <linux/f ...
- java如何快速创建List
几个快速添加list的方法 1. 使用Collections.addAll()方法,前提还是需要手动 new ArrayList ArrayList<String> s = new Arr ...
- RNA-seq 数据文件处理
http://www.fungenomics.com/article/30 [专题]基因组学技术专题(二)-- 为什么说FPKM/RPKM是错的 下载数据 wget是linux下一个从网络上自动下载文 ...
- SQL注入之Sqli-labs系列第四十一关(基于堆叠注入的盲注)和四十二关四十三关四十四关四十五关
0x1普通测试方式 (1)输入and1=1和and1=2测试,返回错误,证明存在注入 (2)union select联合查询 (3)查询表名 (4)其他 payload: ,( ,( 0x2 堆叠注入 ...
- 在PL/SQL中调用Oracle存储过程
存储过程 1 什么是存储过程? 用于在数据库中完成特定的操作或者任务.是一个PLSQL程序块,可以永久的保存在数据库中以供其他程序调用. 2 存储过程的参数模式 存储过程的参数特性: IN类型的参数 ...
- Ubuntu 安装 uget
PPA方式 sudo add-apt-repository ppa:plushuang-tw/uget-stable sudo apt update sudo apt install uget -y ...