一、前言
在linux系統中,一切設備都是以文件形式存在,因此其有一箇中心思想是“一切都是文件”(當然除了網絡設備是用套接字方式之外)。在接下來的文章中會操作BBB相關硬件接口(gpio\i2c\spi等),此時對這個思想的理解會更深刻。每一個硬件接口在/dev或/sys/class下都有對應的文件,通過對該硬件接口的open\write\read實現對其的操作。
本節將對BBB普通IO口進行操作,以控制一個gpio口輸出高低電平及輸入高低電平檢測。
二、shell命令控制IO口
主要路徑及命令
GPIO文件位置:/sys/class/gpio
shell主要命令:
cat命令:讀取文件內容。echo: 寫入文件內容
主要流程:
1. 打開該GPIO44目錄:cd /sys/class/gpio
2. 查看文件當前文件:ls。查看有無gpio44這個文件夾。如果沒有 ,輸入:echo 44 > export ,就可以出現。出現後輸入cd gpio44
- 查看GPIO44當前狀態: cat direction
可以看出gpio44默認是輸入狀態。我們可以把它置成輸出 echo out > direction. - 設置GPIO44輸出高電平:echo 1 > value
設置GPIO44輸出低電平:echo 0 > value - gpio44在BBB板子上是P8_12,可以通過接led或測量電平查看其電平狀態。
三、c++編程實現輸入狀態查詢
#include <stdio.h>
#include <unistd.h>
#include<iostream>
using namespace std;
#define GPIO_DIR "/sys/class/gpio/gpio44/"
int main()
{
FILE *fp=NULL;
int i=0;
char ioStatus = 0;
fp=fopen(GPIO_DIR"direction","r+"); /*讀寫模式打開direction*/
if (fp == NULL) {
cout << "open failed!"<< endl;
return 0;
}
fwrite("in",sizeof(char),2,fp); /*設置爲輸入模式*/
fclose(fp);
for (i=0;i<5;i++)
{
fp=fopen(GPIO_DIR"value","r+");
if (fp == NULL) {
cout << "open failed!" << endl;
return 0;
}
fread(&ioStatus, sizeof(char),1,fp); /*讀取引腳輸入電平*/
cout << "gpio44 input status:" <<ioStatus<< endl;
sleep(1); /*延時一秒*/
fclose(fp);
}
return 0;
}
主要流程:
- 打開xshell連接到BBB板,輸入命令:
nano testIO.cpp
,將上述程序粘貼到該文件中。
- 此時ctrl+o保存,此時會出現下圖,接着回車就保存完成。保存後ctrl+x退出。
- 輸入以下命令進行編譯。
g++ -c testIO.cpp
g++ testIO.o -o test
- 運行命令執行程序:
./test
通過查詢IO可知,gpio44爲P8_12,可以通過將BBB本身接口的3.3V或地接到P8_12,可以檢測其輸入狀態。
四、總結
本節主要介紹了BBB作爲普通IO口的操作流程,主要是通過對文件的讀寫實現對gpio的簡單控制。本節作爲入門,直接在BBB上對程序進行編譯,不涉及交叉編譯的知識。可以簡單瞭解BBB操作流程。