C++控GPIO口
echo控GPIO口 echo 16 > /sys/class/gpio/export echo out > /sys/class/gpio/gpio16/direction echo 20 > /sys/class/gpio/export echo in > /sys/class/gpio/gpio20/direction echo both > /sys/class/gpio/gpio20/edge echo "1" > /sys/class/gpio/gpio18/value
initGpio() {
// 初始化GPIO initGpio(); qWarning() << "Open gpio action ! "; /* /sys/class/gpio/export檔案用於通知系統需要匯出控制的GPIO引腳編號 * 向/sys/class/gpio/export寫入編號成功後生成/sys/class/gpio/gpio(number)目錄, * 如果沒有出現相應的目錄,說明此引腳不可匯出; */ QFile gpio_export(QString::fromLatin1("/sys/class/gpio/export"));
// direction檔案,定義輸入輸出方向; direction接受的引數:in, out, high, low QFile direction18(QString::fromLatin1("/sys/class/gpio/gpio18/direction")); QFile direction20(QString::fromLatin1("/sys/class/gpio/gpio20/direction"));
/* edge 表示中斷的觸發方式,edge檔案有如下四個值:"none", "rising", "falling","both" * none表示引腳為輸入,不是中斷引腳 * rising表示引腳為中斷輸入,上升沿觸發 * falling表示引腳為中斷輸入,下降沿觸發 * both表示引腳為中斷輸入,邊沿觸發 * 0-->none, 1-->rising, 2-->falling, 3-->both */ QFile edge20(QString::fromLatin1("/sys/class/gpio/gpio20/edge"));
// 初始化GPIO 18 if (!gpio_export.open(QIODevice::WriteOnly | QIODevice::Truncate | QIODevice::Text)) {
qWarning() << "Open " << gpio_export.fileName() << " failed!"; return ;
} else {
gpio_export.write("18"); gpio_export.close();
}
// 定義GPIO 18方向為輸出 if (!direction18.open(QIODevice::WriteOnly | QIODevice::Truncate | QIODevice::Text)) {
qWarning() << "Open " << direction18.fileName() << " failed!"; return ;
} else {
direction18.write("out"); direction18.close();
}
// 初始化GPIO 20 if (!gpio_export.open(QIODevice::WriteOnly | QIODevice::Truncate | QIODevice::Text)) {
qWarning() << "Open " << gpio_export.fileName() << " failed!"; return ;
} else {
gpio_export.write("20"); gpio_export.close();
}
// 設定GPIO 20方向為輸入 if (!direction20.open(QIODevice::WriteOnly | QIODevice::Truncate | QIODevice::Text)) {
qWarning() << "Open " << direction20.fileName() << " failed!"; return ;
} else {
direction20.write("in"); direction20.close();
}
// 設定GPIO 20輸入為中斷輸入,邊沿觸發 if (!edge20.open(QIODevice::WriteOnly | QIODevice::Truncate | QIODevice::Text)) {
qWarning() << "Open " << edge20.fileName() << " failed!"; return ;
} else {
edge20.write("both"); edge20.close();
}
}
//qWarning() << "gpio is " << state;
// 將GPIO 18拉高, MCU檢測到該I/O有變化後執行相應的動作: GPIO高-led燈點亮 GPIO低-led燈熄滅 QFile gpio18(QString::fromLatin1("/sys/class/gpio/gpio18/value")); if (!gpio18.open(QIODevice::WriteOnly | QIODevice::Truncate | QIODevice::Text)) {
qWarning() << "Open " << gpio18.fileName() << " failed!"; return;
} else if (state) {
gpio18.write("1");
} else {
gpio18.write("0");
} gpio18.close();