友善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 M4NanoPi 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开发板

原文地址:https://www.cnblogs.com/hanson/p/10557565.html

时间: 2024-11-08 06:43:51

友善RK3399/NanoPC-T4开发板wiringPi的C语言访问GPIO外设实例讲解 -【申嵌视频】的相关文章

友善之臂tiny4412-1306开发板安卓系统烧写

折腾了很久,终于烧写成功.不废话,咱们说说流程吧. 首先,我们需要有一个基于tiny4412的kernel,从友善之臂官网获取. 然后解压: 1.tar -xvf  linux-3.5 .... 然后cp  tiny4412-android_deconfig  .config 接下来make zImage 在 arch/arm/boot/生成对应的zImage ,这个也就是我们的kernrl. 当然在此之前,我们需要安装交叉编译工具arm-linux-gcc.没有的话就装上这个环境,arm-li

手把手教你从零实现Linux misc设备驱动一(基于友善之臂4412开发板)

关于如何来写一个misc设备,在前面有篇文章已经介绍了大致的流程,现在就让我们来实现一个最简单的misc设备驱动. http://blog.csdn.net/morixinguan/article/details/52700146 关于前面的字符设备有以下四篇文章,可以做参考: http://blog.csdn.net/morixinguan/article/details/55002774 http://blog.csdn.net/morixinguan/article/details/550

手把手教你写Linux设备驱动---定时器(一)(基于友善之臂4412开发板)

这个专题我们来说下Linux中的定时器. 在Linux内核中,有这样的一个定时器,叫做内核定时器,内核定时器用于控制某个函数,也就是定时器将要处理的函数在未来的某个特定的时间内执行.内核定时器注册的处理函数只执行一次,即不是循环执行的. 如果对延迟的精度要求不高的话,最简单的实现方法如下---忙等待: Unsigned long j = jiffies + jit_delay * HZ; While(jiffies < j) { -- } 下面来说下具体的参数代表的含义: jiffies:全局变

织女星开发板使用RISC-V RI5CY核驱动GPIO

前言 织女星开发板是OPEN-ISA社区为中国大陆地区定制的一款体积小.功耗超低和功能丰富的 RISC-V评估开发板,基于NXP半导体四核异构RV32M1主控芯片. 两个RISC-V核:RI5CY + ZERO_RISCY. 两个ARM核: Cortex-M4F + Cortex-M0+ . 4个核被分为两个子系统,大核CM4F/RI5CY和小核CM0+/ZERO-RISCY,片上集成1.25 MB Flash .384 KB SRAM,其中1 MB的Flash被大核所使用,起始地址0x0000

TurnipBit开发板DIY呼吸的吃豆人教程实例

转载请以链接形式注明文章来源(MicroPythonQQ技术交流群:157816561,公众号:MicroPython玩家汇) 0x00前言 吃豆人是耳熟能详的可爱形象,如今我们的TurnipBit也集成了这可爱的图形,我们这就让他来呼吸了~. 0x01效果展示 先一起看下最终的成品演示视频: 0x02准备 TurnipBit一块 数据线一条 TurnipBit可视化编程网站:www.tpyboard.com 0x03代码实现 打开我们的TurnipBit在线图形编辑器. http://www.

编译 Linux 3.5 内核烧写 Android 4.2.2 到 Tiny4412 开发板

. . . . . 昨天已经编译了 Android 4.2.2 的源码,详见<Ubuntu 14.04 编译 Android 4.2.2 for Tiny4412>一文. 今天我们继续剩下的工作,让我们的 android 系统可以跑在 Tiny4412 开发板上. Android 和 Linux 是两码事,Android 系统是基于 Linux 内核的.我们编译的 Android 源码是 Android 系统本身的源码,而内核是指通过原生 Linux 源码一直过来的内核源码,所以它们需要我们分

x86 构架的 Arduino 开发板Intel Galileo

RobotPeak是上海的一家硬件创业团队,团队致力于民用机器人平台系统.机器人操作系统(ROS)以及相关设备的设计研发,并尝试将日新月异的机器人技术融入人们的日常生活与娱乐当中.同时,RobotPeak 将尽力为机器人技术在开源硬件.开源软件社区的普及做出贡献.陈士凯是 RobotPeak 联合创始人,他给我们带来了最新的  x86 构架的 Arduino 开发板 Intel Galileo 的深度使用报告. 1.前言 在今年(2013)罗马举办的首届欧洲 Make Faire 上,Intel

嵌入式开发板 迅为4412开发板 初学ARM开发板首选!提供教学视频!

选择迅为4412开发板无论是学习ARM技术还是开发产品都无须担心,迅为4412开发板提供了丰富的例程源码实例和视频,只需要你有C语言基础,就可以快速学习嵌入式高端技术开发! 搭载三星Exynos四核处理器,配备1GB内存,4GB固态硬盘EMMC存储,兼具快速读取与超大容量,纵使海量思考也能及时处理. 详情了解: http://topeetboard.com   更多了解:https://arm-board.taobao.com

5.安装 Linux 系统到开发板

课程要求: 1. 了解linux嵌入式系统的组成和启动流程. 2. 通过SD卡自动烧写Linux系统到nand flash中. 3. 体验Linux+Qt系统. 实验器材: 软件: 1.OK6410光盘A,B. 硬件: 1. PC机一台. 2. SD卡读卡器各一 3. OK6410开发板一套. 4. USB转串口线一条. 背景知识: 1. Qtopia简介: Qtopia 是 Trolltech 公司为采用嵌入式 Linux 操作系统的消费电子设备而开发的综合应用平台, Qtopia 包含完整的