0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

简易实现GPIO应用程序在V85x上编写

全志在线 来源:全志在线开发者论坛 2023-05-19 09:33 次阅读

GPIO应用程序编写

作者@chhjnavy

查找合适的GPIO

在这里我们选取 GPIOH14(注意目前开发使用这个pin 作为触摸屏的pin脚,需要将触摸屏connect断开) ,因为可以通过排插使用杜邦线将其引出,用于连接别的设备。

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

计算GPIO IO号

Linux 系统中,GPIO 通常由 Pinctrl 系统进行管理。Linux 定义了 Pinctrl 框架,统一了各大 SoC 厂商的 Pin 管理方式,避免了各大厂商自行实现自己的 Pin 管理系统,是一个非常有用的功能。

每个gpio 都对应一个IO 号:
- PH14: 7 * 32 + 14 = 238
- PH13: 7 * 32 + 13 = 237
- PH12: 7 * 32 + 12 = 236
- PH11: 7 * 32 + 11 = 235

导出GPIO节点

通过终端操作手动导出:

echo 238 > /sys/class/gpio/export

查看导出的gpio节点

cd /sys/class/gpio

可以看到gpio238

如果通过应用程序导出,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;
}

根据IO 号导出gpio 节点是很重要的一个环节,接下来就可以通过gpio 节点,对gpio 进行操作。

设置高低电平

#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 设定为高电平输出
    gpio_set_value(GPIOH14, XGPIO_HIGH );
    //将gpio238 设定为低电平输出
    gpio_set_value(GPIOH14, XGPIO_LOW);
}

审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 触摸屏
    +关注

    关注

    42

    文章

    2259

    浏览量

    115339
  • soc
    soc
    +关注

    关注

    38

    文章

    4034

    浏览量

    217275
  • Linux
    +关注

    关注

    87

    文章

    11139

    浏览量

    208168
  • 应用程序
    +关注

    关注

    37

    文章

    3201

    浏览量

    57421
  • GPIO
    +关注

    关注

    16

    文章

    1180

    浏览量

    51609

原文标题:简易实现GPIO应用程序在V85x上编写

文章出处:【微信号:gh_79acfa3aa3e3,微信公众号:全志在线】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    labview编写应用程序W10能用吗?

    labview编写应用程序W10能用吗?我2010版本编写W10
    发表于 04-08 14:46

    怎样测试am335x系统中编写应用程序

    am335x的arm系统中编写应用程序时,发现想将数据保存在文本文件中,下次启动应用程序时就能从文件中读出上次的数据。结果一直保存不成功,
    发表于 07-16 06:15

    如何在AVRX编写应用程序

    AVRX系统具有哪些特点应用?如何在AVRX编写应用程序
    发表于 09-26 09:13

    【沁恒微CH32V307评估板试用体验】第一个应用程序编写-LED流水灯

    _rcc.c、ch32v30x_gpio.h/ch32v30x_gpio.c编写一个LED_Init()函数,具体代码如下: (7)编写LED流水灯
    发表于 05-21 18:44

    全志V853芯片 如何在Tina V85x平台切换sensor?

    原文链接:https://bbs.aw-ol.com/topic/1666/作者@budbool目的V85x某方案目前默认Sensor是GC2053。实际使用时若需要用到GC4663(比如wdr功能
    发表于 06-28 09:27

    每日推荐 | Tina V85x 平台E907启动方式,OpenHarmony征文活动获奖名单

    大家好,以下为电子发烧友推荐每日好帖,欢迎留言点评讨论~1、全志V853芯片 Tina下RISC-V核E907启动方式的选择推荐理由:Tina V85x 平台E907支持2种启动方式
    发表于 08-08 10:14

    全志V853芯片 如何在Tina V85x平台切换sensor?

    全志V853开发板购买链接:https://item.hqchip.com/2500386536.html目的V85x某方案目前默认Sensor是GC2053。实际使用时若需要用到GC4663(比如
    发表于 02-13 11:03

    如何将引导加载程序0x00000000和应用程序放置0x00008000?

    代码的情况下编写引导加载程序代码 我将 s32kds 用于 arm ide,每当我尝试刷新引导加载程序代码时,它都会擦除整个闪存,包括我位于 0x00008000 的
    发表于 03-27 08:26

    鼠标应用程序设计

    鼠标应用程序设计     用汇编语言编写的鼠标和键盘应用程序。   程序执行后
    发表于 06-12 23:17 1269次阅读

    如何编写C应用程序并在Cyclone V SoC DevKit中运行ARM DS-5 AE

    如何编写C应用程序并使用ARM DS-5 AE运行在Cyclone V SoC DevKit
    的头像 发表于 06-20 00:04 3846次阅读
    如何<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++编写应用程序加速内核运行

    SDAccel编译器支持OpenCL C,C和C ++,用于定义FPGA执行的内核功能。 了解如何利用用C / C ++编写的现有函数作为FPGA运行的OpenCL应用程序的加速内核。
    的头像 发表于 11-20 06:40 2819次阅读

    X-HDL V4.21应用程序免费下载

    X-HDL V4.21应用程序免费下载
    发表于 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开发指南

    介绍v85X E907 的启动环境和AMP 的环境搭建。
    的头像 发表于 03-06 10:36 931次阅读
    Tina Linux E907开发指南

    基于OpenHarmony编写GPIO平台驱动和应用程序

    程序是基于OpenHarmony标准系统编写的基础外设类:GPIO驱动。
    的头像 发表于 09-12 10:04 759次阅读
    基于OpenHarmony<b class='flag-5'>编写</b><b class='flag-5'>GPIO</b>平台驱动和<b class='flag-5'>应用程序</b>

    怎样codeblocks编写程序

    CodeBlocks编写程序是一项相对简单而又重要的任务。CodeBlocks是一个广泛使用的集成开发环境(IDE),它能够帮助程序编写
    的头像 发表于 11-26 09:26 1237次阅读