0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

簡易實現(xiàn)GPIO應用程序在V85x上編寫

全志在線 ? 來源:全志在線開發(fā)者論壇 ? 2023-05-19 09:33 ? 次閱讀

GPIO應用程序編寫

作者@chhjnavy

查找合適的GPIO

在這里我們選取 GPIOH14(注意目前開發(fā)使用這個pin 作為觸摸屏的pin腳,需要將觸摸屏connect斷開) ,因為可以通過排插使用杜邦線將其引出,用于連接別的設(shè)備。

4fa95f84-f575-11ed-90ce-dac502259ad0.png

計算GPIO IO號

Linux 系統(tǒng)中,GPIO 通常由 Pinctrl 系統(tǒng)進行管理。Linux 定義了 Pinctrl 框架,統(tǒng)一了各大 SoC 廠商的 Pin 管理方式,避免了各大廠商自行實現(xiàn)自己的 Pin 管理系統(tǒng),是一個非常有用的功能。

每個gpio 都對應一個IO 號:
- PH14: 7 * 32 + 14 = 238
- PH13: 7 * 32 + 13 = 237
- PH12: 7 * 32 + 12 = 236
- PH11: 7 * 32 + 11 = 235

導出GPIO節(jié)點

通過終端操作手動導出:

echo 238 > /sys/class/gpio/export

查看導出的gpio節(jié)點

cd /sys/class/gpio

可以看到gpio238

如果通過應用程序?qū)С?,code 如下:

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 


#define GPIOH14 238


#define XGPIO_HIGH 1
#define XGPIO_LOW  0


/****************************************************************
* Constants
****************************************************************/


#define SYSFS_GPIO_DIR "/sys/class/gpio"
#define POLL_TIMEOUT (3 * 1000) /* 3 seconds */
#define MAX_BUF 64


/****************************************************************
 * gpio_export
 ****************************************************************/
int gpio_export(unsigned int gpio)
{
  int fd, len;
  char buf[MAX_BUF];


  fd = open(SYSFS_GPIO_DIR"/export", O_WRONLY);
  printf("open device ==================fd = %d
", fd);
  if (fd < 0) {
 ? ? ? ?printf("gpio/export
");
 ? ? ? ?return fd;
 ? ?}


 ? ?len = snprintf(buf, sizeof(buf), "%d", gpio);
 ? ?write(fd, buf, len);


 ? ?close(fd);


 ? ?return 0;
}

根據(jù)IO 號導出gpio 節(jié)點是很重要的一個環(huán)節(jié),接下來就可以通過gpio 節(jié)點,對gpio 進行操作。

設(shè)置高低電平

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 


#include "gpioAPIs.h"


/****************************************************************
* Constants
****************************************************************/


#define SYSFS_GPIO_DIR "/sys/class/gpio"
#define POLL_TIMEOUT (3 * 1000) /* 3 seconds */
#define MAX_BUF 64


/****************************************************************
 * gpio_export
 ****************************************************************/
int gpio_export(unsigned int gpio)
{
  int fd, len;
  char buf[MAX_BUF];


  fd = open(SYSFS_GPIO_DIR"/export", O_WRONLY);
  printf("open device ==================fd = %d
", fd);
  if (fd < 0) {
 ? ? ? ?printf("gpio/export
");
 ? ? ? ?return fd;
 ? ?}


 ? ?len = snprintf(buf, sizeof(buf), "%d", gpio);
 ? ?write(fd, buf, len);


 ? ?close(fd);


 ? ?return 0;
}


/****************************************************************
 * gpio_unexport
 ****************************************************************/
int gpio_unexport(unsigned int gpio)
{
 ? ?int fd, len;
 ? ?char buf[MAX_BUF];


 ? ?fd = open(SYSFS_GPIO_DIR"/unexport", O_WRONLY);
 ? ?if (fd < 0) {
 ? ? ? ?printf("gpio/export
");
 ? ? ? ?return fd;
 ? ?}


 ? ?len = snprintf(buf, sizeof(buf), "%d", gpio);
 ? ?write(fd, buf, len);
 ? ?close(fd);
 ? ?return 0;
}


/****************************************************************
 * gpio_set_dir
 ****************************************************************/
int gpio_set_dir(unsigned int gpio, unsigned int out_flag)
{
 ? ?int fd, len;
 ? ?char buf[MAX_BUF];


 ? ?len = snprintf(buf, sizeof(buf), SYSFS_GPIO_DIR"/gpio%d/direction", gpio);


 ? ?fd = open(buf, O_WRONLY);
 ? ?if (fd < 0) {
 ? ? ? ?printf("gpio/direction
");
 ? ? ? ?return fd;
 ? ?}


 ? ?if (out_flag)
 ? ? ? ?write(fd, "out", 4);
 ? ?else
 ? ? ? ?write(fd, "in", 3);


 ? ?close(fd);
 ? ?return 0;
}


/****************************************************************
 * gpio_set_value
 ****************************************************************/
int gpio_set_value(unsigned int gpio, unsigned int value)
{
 ? ?int fd, len;
 ? ?char buf[MAX_BUF];


 ? ?len = snprintf(buf, sizeof(buf), SYSFS_GPIO_DIR"/gpio%d/value", gpio);


 ? ?fd = open(buf, O_RDWR );
 ? ?if (fd < 0) {
 ? ? ? ?printf("gpio/set-value
");
 ? ? ? ?return fd;
 ? ?}


 ? ?if (value)
 ? ? ? ?write(fd, "1", 2);
 ? ?else
 ? ? ? ?write(fd, "0", 2);


 ? ?close(fd);
 ? ?return 0;
}


/****************************************************************
 * gpio_get_value
 ****************************************************************/
int gpio_get_value(unsigned int gpio, unsigned int *value)
{
 ? ?int fd, len;
 ? ?char buf[MAX_BUF];
 ? ?char ch;


 ? ?len = snprintf(buf, sizeof(buf), SYSFS_GPIO_DIR"/gpio%d/value", gpio);


 ? ?fd = open(buf, O_RDWR );
 ? ?if (fd < 0) {
 ? ? ? ?printf("gpio/get-value
");
 ? ? ? ?return fd;
 ? ?}


 ? ?read(fd, &ch, 1);


 ? ?if (ch != '0') {
 ? ? ? ?*value = 1;
 ? ?} else {
 ? ? ? ?*value = 0;
 ? ?}


 ? ?close(fd);
 ? ?return 0;
}




/****************************************************************
 * gpio_set_edge
 ****************************************************************/


int gpio_set_edge(unsigned int gpio, char *edge)
{
 ? ?int fd, len;
 ? ?char buf[MAX_BUF];


 ? ?len = snprintf(buf, sizeof(buf), SYSFS_GPIO_DIR"/gpio%d/edge", gpio);


 ? ?fd = open(buf, O_WRONLY);
 ? ?if (fd < 0) {
 ? ? ? ?printf("gpio/set-edge
");
 ? ? ? ?return fd;
 ? ?}


 ? ?write(fd, edge, strlen(edge) + 1);
 ? ?close(fd);
 ? ?return 0;
}


/****************************************************************
 * gpio_fd_open
 ****************************************************************/


int gpio_fd_open(unsigned int gpio)
{
 ? ?int fd, len;
 ? ?char buf[MAX_BUF];


 ? ?len = snprintf(buf, sizeof(buf), SYSFS_GPIO_DIR"/gpio%d/value", gpio);


 ? ?fd = open(buf, O_RDONLY | O_NONBLOCK );
 ? ?if (fd < 0) {
 ? ? ? ?printf("gpio/fd_open
");
 ? ?}
 ? ?return fd;
}


/****************************************************************
 * gpio_fd_close
 ****************************************************************/


int gpio_fd_close(int fd)
{
 ? ?return close(fd);
}


void gpio_init() {


 ? ?gpio_export(GPIOH14);
 ? ?gpio_set_dir(GPIOH14, 0);
 ? ?//gpio_set_edge(GPIOH14, "rising");
}


void gpio_uninit() {
 ? ?gpio_unexport(GPIOH14);


}


void mian(void) {
 ? ?gpio_init();
 ? ?//將gpio238 設(shè)定為高電平輸出
 ? ?gpio_set_value(GPIOH14, XGPIO_HIGH );
 ? ?//將gpio238 設(shè)定為低電平輸出
 ? ?gpio_set_value(GPIOH14, XGPIO_LOW);
}

審核編輯:湯梓紅

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 觸摸屏
    +關(guān)注

    關(guān)注

    42

    文章

    2255

    瀏覽量

    115097
  • soc
    soc
    +關(guān)注

    關(guān)注

    38

    文章

    4021

    瀏覽量

    217014
  • Linux
    +關(guān)注

    關(guān)注

    87

    文章

    11123

    瀏覽量

    207895
  • 應用程序
    +關(guān)注

    關(guān)注

    37

    文章

    3198

    瀏覽量

    57357
  • GPIO
    +關(guān)注

    關(guān)注

    16

    文章

    1172

    瀏覽量

    51511

原文標題:簡易實現(xiàn)GPIO應用程序在V85x上編寫

文章出處:【微信號:gh_79acfa3aa3e3,微信公眾號:全志在線】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    labview編寫應用程序W10能用嗎?

    labview編寫應用程序W10能用嗎?我2010版本編寫W10
    發(fā)表于 04-08 14:46

    怎樣測試am335x系統(tǒng)中編寫應用程序

    am335x的arm系統(tǒng)中編寫應用程序時,發(fā)現(xiàn)想將數(shù)據(jù)保存在文本文件中,下次啟動應用程序時就能從文件中讀出上次的數(shù)據(jù)。結(jié)果一直保存不成功,
    發(fā)表于 07-16 06:15

    如何在AVRX編寫應用程序

    AVRX系統(tǒng)具有哪些特點應用?如何在AVRX編寫應用程序?
    發(fā)表于 09-26 09:13

    【沁恒微CH32V307評估板試用體驗】第一個應用程序編寫-LED流水燈

    _rcc.c、ch32v30x_gpio.h/ch32v30x_gpio.c編寫一個LED_Init()函數(shù),具體代碼如下: (7)編寫LED流水燈
    發(fā)表于 05-21 18:44

    全志V853芯片 如何在Tina V85x平臺切換sensor?

    原文鏈接:https://bbs.aw-ol.com/topic/1666/作者@budbool目的V85x某方案目前默認Sensor是GC2053。實際使用時若需要用到GC4663(比如wdr功能
    發(fā)表于 06-28 09:27

    每日推薦 | Tina V85x 平臺E907啟動方式,OpenHarmony征文活動獲獎名單

    大家好,以下為電子發(fā)燒友推薦每日好帖,歡迎留言點評討論~1、全志V853芯片 Tina下RISC-V核E907啟動方式的選擇推薦理由:Tina V85x 平臺E907支持2種啟動方式
    發(fā)表于 08-08 10:14

    全志V853芯片 如何在Tina V85x平臺切換sensor?

    全志V853開發(fā)板購買鏈接:https://item.hqchip.com/2500386536.html目的V85x某方案目前默認Sensor是GC2053。實際使用時若需要用到GC4663(比如
    發(fā)表于 02-13 11:03

    如何將引導加載程序0x00000000和應用程序放置0x00008000?

    代碼的情況下編寫引導加載程序代碼 我將 s32kds 用于 arm ide,每當我嘗試刷新引導加載程序代碼時,它都會擦除整個閃存,包括我位于 0x00008000 的
    發(fā)表于 03-27 08:26

    鼠標應用程序設(shè)計

    鼠標應用程序設(shè)計     用匯編語言編寫的鼠標和鍵盤應用程序。   程序執(zhí)行后
    發(fā)表于 06-12 23:17 ?1264次閱讀

    如何編寫C應用程序并在Cyclone V SoC DevKit中運行ARM DS-5 AE

    如何編寫C應用程序并使用ARM DS-5 AE運行在Cyclone V SoC DevKit
    的頭像 發(fā)表于 06-20 00:04 ?3829次閱讀
    如何<b class='flag-5'>編寫</b>C<b class='flag-5'>應用程序</b>并在Cyclone <b class='flag-5'>V</b> SoC DevKit中運行ARM DS-5 AE

    如何利用C/C++編寫應用程序加速內(nèi)核運行

    SDAccel編譯器支持OpenCL C,C和C ++,用于定義FPGA執(zhí)行的內(nèi)核功能。 了解如何利用用C / C ++編寫的現(xiàn)有函數(shù)作為FPGA運行的OpenCL應用程序的加速內(nèi)核。
    的頭像 發(fā)表于 11-20 06:40 ?2807次閱讀

    X-HDL V4.21應用程序免費下載

    X-HDL V4.21應用程序免費下載
    發(fā)表于 04-24 08:00 ?120次下載
    <b class='flag-5'>X</b>-HDL <b class='flag-5'>V</b>4.21<b class='flag-5'>應用程序</b>免費下載

    Tina Linux E907開發(fā)指南

    介紹v85X E907 的啟動環(huán)境和AMP 的環(huán)境搭建。
    的頭像 發(fā)表于 03-06 10:36 ?890次閱讀
    Tina Linux E907開發(fā)指南

    基于OpenHarmony編寫GPIO平臺驅(qū)動和應用程序

    程序是基于OpenHarmony標準系統(tǒng)編寫的基礎(chǔ)外設(shè)類:GPIO驅(qū)動。
    的頭像 發(fā)表于 09-12 10:04 ?743次閱讀
    基于OpenHarmony<b class='flag-5'>編寫</b><b class='flag-5'>GPIO</b>平臺驅(qū)動和<b class='flag-5'>應用程序</b>

    怎樣codeblocks編寫程序

    CodeBlocks編寫程序是一項相對簡單而又重要的任務。CodeBlocks是一個廣泛使用的集成開發(fā)環(huán)境(IDE),它能夠幫助程序編寫
    的頭像 發(fā)表于 11-26 09:26 ?1105次閱讀