主題 : 友善RK3399/NanoPC-T4開發板wiringPi的C語言訪問GPIO外設實例講解 復制鏈接 | 瀏覽器收藏 | 打印
上海嵌入式家園-開發板商城
級別: 俠客
UID: 6501
精華: 3
發帖: 111
金錢: 715 兩
威望: 143 點
貢獻值: 3 點
綜合積分: 282 分
注冊時間: 2009-06-04
最后登錄: 2019-09-11
樓主  發表于: 77天前

 友善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 支持的開發板
NanoPi M4、NanoPi NEO4、和NanoPC-T4
4 wiringPi在T4/M4/NEO4上的安裝
通過ssh,或者串口終端進入開發板的命令行,用以下命令安裝:
1.# 刪除舊的實現
2.wget http://112.124.9.243:8888/wiringpi/friendlyelec-rk3399/remove_oldversion_wiringPi.sh
3.chmod 755 remove_oldversion_wiringPi.sh
4.sudo ./remove_oldversion_wiringPi.sh
5.# 下載并安裝wiringPi for RK3399
6.wget http://112.124.9.243:8888/wiringpi/friendlyelec-rk3399/wiringpi-v2.44-friendlyelec-rk3399.deb
7.sudo dpkg -i  wiringpi-v2.44-friendlyelec-rk3399.deb
4.1 測試安裝
通過以下指令可以測試wiringPi是否安裝成功:
1.gpio readall
如果安裝成功會顯示開發板的針腳布局,例如NanoPi M4會顯示如下信息:
[email protected]:~# gpio readall
2. +------+-----+----------+------+ Model  NanoPi-M4 +------+----------+-----+------+
3. | GPIO | wPi |   Name   | Mode | V | Physical | V | Mode |   Name   | wPi | GPIO |
4. +------+-----+----------+------+---+----++----+---+------+----------+-----+------+
5. |      |     |     3.3V |      |   |  1 || 2  |   |      | 5V       |     |      |
6. |      |     | I2C2_SDA |      |   |  3 || 4  |   |      | 5V       |     |      |
7. |      |     | I2C2_SCL |      |   |  5 || 6  |   |      | GND(0V)  |     |      |
8. |   32 |   7 | GPIO1_A0 |  OUT | 0 |  7 || 8  |   | ALT  | GPIO4_C1 | 15  |  145 |
9. |      |     |  GND(0V) |      |   |  9 || 10 |   | ALT  | GPIO4_C0 | 16  |  144 |
10. |   33 |   0 | GPIO1_A1 |   IN | 0 | 11 || 12 | 1 | IN   | GPIO1_C2 | 1   |  50  |
11. |   35 |   2 | GPIO1_A3 |   IN | 0 | 13 || 14 |   |      | GND(0V)  |     |      |
12. |   36 |   3 | GPIO1_A4 |   IN | 0 | 15 || 16 | 0 | IN   | GPIO1_C6 | 4   |  54  |
13. |      |     |     3.3V |      |   | 17 || 18 | 0 | IN   | GPIO1_C7 | 5   |  55  |
14. |      |     | UART4_TX |      |   | 19 || 20 |   |      | GND(0V)  |     |      |
15. |      |     | UART4_RX |      |   | 21 || 22 | 0 | IN   | GPIO1_D0 | 6   |  56  |
16. |      |     | SPI1_CLK |      |   | 23 || 24 |   |      | SPI1_CSn |     |      |
17. |      |     |  GND(0V) |      |   | 25 || 26 |   | ALT  | GPIO4_C5 | 11  |  149 |
18. |      |     | I2C2_SDA |      |   | 27 || 28 |   |      | I2C2_SCL |     |      |
19. |      |     | I2S0_LRX |      |   | 29 || 30 |   |      | GND(0V)  |     |      |
20. |      |     | I2S0_LTX |      |   | 31 || 32 |   |      | I2S_CLK  |     |      |
21. |      |     | I2S0_SCL |      |   | 33 || 34 |   |      | GND(0V)  |     |      |
22. |      |     | I2S0SDI0 |      |   | 35 || 36 |   |      | I2S0SDO0 |     |      |
23. |      |     | I2S0I1O3 |      |   | 37 || 38 |   |      | I2S0I2O2 |     |      |
24. |      |     |  GND(0V) |      |   | 39 || 40 |   |      | I2S0I3O1 |     |      |
25. +------+-----+----------+------+---+----++----+---+------+----------+-----+------+
[email protected]:~#
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源文件:
1.vi test.c
然后鍵入如下代碼:
1.#include <wiringPi.h>
2.int main(void)
3.{
4.  wiringPiSetup() ;
5.  pinMode (7, OUTPUT) ;
6.  for(;;)
7.  {
8.    digitalWrite(7, HIGH) ;
9.    delay (500) ;
10.    digitalWrite(7,  LOW) ;
11.    delay (500) ;
12.  }
13.}
編譯test.c并運行:
1.gcc -Wall -o test test.c -lwiringPi -lwiringPiDev -lpthread -lrt -lm -lcrypt
2.sudo ./test
看到LED燈一閃一閃的,就表示成功了。
5.5 Shell示例
創建一個shell腳本:
1.vi test.sh
然后鍵入如下代碼:
1.LED=7
2.gpio mode $LED out
3.while true; do
4.  gpio write $LED 1
5.  sleep 0.5
6.  gpio write $LED 0
7.  sleep 0.5
8.done
運行腳本:
1.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
死或生沙滩排球下载