1. 程式人生 > >C++控GPIO口

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();