v851s gpio 应用程序编写

1. 查看硬件电路图SCH_Schematic1_2022-11-23 ,查找合适的gpio 作为使用pin

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

电路图pdf路径:Yuzukilizard/Hardware/Schematic/SCH_Schematic1_2022-11-23.pdf

2. 计算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

3. 通过sysfs操作gpio 导出gpio 节点

通过终端操作手动导出:

echo 238 > /sys/class/gpio/export

查看导出的gpio节点

cd /sys/class/gpio

可以看到gpio238

如果通过应用程序导出,code 如下:

#include <sys/stat.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <unistd.h>
#include <fcntl.h>
#include <poll.h>

#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\n", fd);
    if (fd < 0) {
        printf("gpio/export\n");
        return fd;
    }

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

    close(fd);

    return 0;
}

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

4 .接下来设置gpio 的输出状态,对其设置高低电平

完整code 如下:

#include <sys/stat.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <unistd.h>
#include <fcntl.h>
#include <poll.h>

#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\n", fd);
    if (fd < 0) {
        printf("gpio/export\n");
        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\n");
        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\n");
        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\n");
        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\n");
        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\n");
        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\n");
    }
    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);
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/9517.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Maven高级-属性多环境配置与应用

Maven高级-属性&多环境配置与应用4&#xff0c;属性4.1 属性4.1.1 问题分析4.1.2 解决步骤步骤1:父工程中定义属性步骤2:修改依赖的version4.2 配置文件加载属性步骤1:父工程定义属性步骤2:jdbc.properties文件中引用属性步骤3:设置maven过滤文件范围步骤4:测试是否生效4.3…

mysql慢查询

目录标题如何收集慢SQL-- ELK体系收集慢日志分析SQL优化添加索引优化慢sql通过拆分冷热数据优化读写分离预防我们优化的思路是“收集——分析——优化——预防”了解完如何收集慢日志之后&#xff0c;就要开始分析 SQL 了。优化 SQL 的基础手段是 EXPLAIN&#xff0c;我们要收起…

Spark SQL实战(04)-API编程之DataFrame

1 SparkSession Spark Core: SparkContext Spark SQL: 难道就没有SparkContext&#xff1f; 2.x之后统一的 package com.javaedge.bigdata.chapter04import org.apache.spark.sql.{DataFrame, SparkSession}object SparkSessionApp {def main(args: Array[String]): Unit …

认证服务---整合短信验证码,用户注册和登录 ,密码采用MD5加密存储 【二】

前言 分布式微服务系统中添加登录和注册&#xff0c;&#xff08;这里暂未完成分布式情况下用户登录信息情况记录&#xff09;&#xff0c;主要记录&#xff1a;一个微服务专门管理用户信息。需要通过远程调用的形式&#xff0c;来完成用户注册以及登录流程&#xff0c;同时密…

【故障定位】基于多元宇宙算法的主动配电网故障定位方法研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

二分搜索树

一、概念及其介绍 二分搜索树&#xff08;英语&#xff1a;Binary Search Tree&#xff09;&#xff0c;也称为 二叉查找树 、二叉搜索树 、有序二叉树或排序二叉树。满足以下几个条件&#xff1a; 若它的左子树不为空&#xff0c;左子树上所有节点的值都小于它的根节点。若它…

视频生成: 基于Stable Diffusion的微调方法

chatGPT带来了几个月的AIGC热度&#xff0c;文本图像生成模型大行其道&#xff0c;但AI在视频生成任务上尚没有较好的开源仓库&#xff0c;并受限于“缺那么几百块A100"的资源问题&#xff0c;大多数人无法展开视频生成的研究。好在目前有不少针对视频生成的相关paper&…

Day936.如何重构过大类 -系统重构实战

如何重构过大类 Hi&#xff0c;我是阿昌&#xff0c;今天学习记录的是关于如何重构过大类的内容。 在过去的代码里一定会遇到一种典型的代码坏味道&#xff0c;那就是“过大类”。 在产品迭代的过程中&#xff0c;由于缺少规范和守护&#xff0c;单个类很容易急剧膨胀&#…

Learning C++ No.18【STL No.8】

引言&#xff1a; 北京时间&#xff1a;2023/3/18/21:47&#xff0c;周末&#xff0c;不摆烂&#xff0c;但是欠钱终于还是遭报应了&#xff0c;导致坐牢7小时&#xff08;上午3.5&#xff0c;下午3.5&#xff09;&#xff0c;难受&#xff0c;充分意识到行哥是那么的和蔼可亲…

固定资产管理方案:二维码扫扫便知道

用草料可以批量、简单、低成本地制作固定资产二维码标签。 适用于办公设备、车辆、医疗器械、大型生产设备等需要制作一物一码标签的场景。还能配合报修表单、手机端编辑子码功能共同使用&#xff0c;完成对于固定资产的规范化管理&#xff1a; 用二维码管理公司固定资产1、固定…

【Linux】进程等待进程程序替换

进程等待&进程程序替换进程等待进程程序替换通过进程等待和进程程序替换来理解守护进程进程等待 僵尸进程的产生原因是&#xff1a;子进程先于父进程退出&#xff0c;在子进程退出时会给父进程发送SIGCHILD信号&#xff0c;而父进程接收到这个信号后选择不处理&#xff0c;…

2023年MathorCup数学建模赛题浅析

MathorCup俗称妈杯&#xff0c;是除了美赛国赛外参赛人数首屈一指的比赛&#xff0c;而我们的妈杯今天也如期开赛。今年的妈杯难度&#xff0c;至少在我看来应该是2023年截至目前来讲最难的一场比赛。问题的设置、背景的选取等各个方面都吐露着我要难死你们的想法。难度是恒定的…

世纪末的星期

题目 1、世纪末的星期 曾有邪教称1999年12月31日是世界末日。当然该谣言已经不攻自破。 还有人称今后的某个世纪末的12月31日&#xff0c;如果是星期一则会… 有趣的是&#xff0c;任何一个世纪末的年份的12月31日都不可能是星期一!! 于是&#xff0c;“谣言制造商”又修改为星…

cuda ptx 汇编语言示例:读寄存器

编译 , Ampere 显卡&#xff0c;rtx 3060 3070... nvcc -archsm_86 -o hello hello_ptx.cu 或写成Makefile&#xff1a; hello: hello_sm_id.cunvcc -archsm_86 -o $ $^ #nvcc -archsm_86 -o hello hello_sm_id.cu $ 是指目标 $^ 是指第一个依赖 ^^ hello_ptx.cu #…

WinHex安装与使用

目录 下载WinHex 安装WinHex 查看现成的磁盘文件 手动创建磁盘文件 创建磁盘文件 创建分区 安装引导程序 查看磁盘 下载WinHex 下载链接&#xff1a; WinHex: Hex Editor & Disk Editor, Computer Forensics & Data Recovery Software 安装WinHex 1).下载完…

商贸批发进销存管理软件,仓库条码管理,库存管理。采购入库单,供应商档案管理。

公司发生采购业务&#xff0c;就需要对【供应商】档案进行管理。【供应商】档案包括&#xff1a;编号&#xff0c;名称&#xff0c;地址&#xff0c;电话&#xff0c;负责人&#xff0c;等信息。建立好【供应商】档案电脑存档&#xff0c;方便随时查阅&#xff0c;和统计分析。…

MySQL:安装 MySQL、Navicat、使用 Navicat 连接 MySQL

文章目录Day 01&#xff1a;一、概念1. 数据库 DB2. 数据库管理系统 DBMS3. MySQL二、安装 MySQL三、安装 Navicat Premium 16四、使用 Navicat 连接 MySQL注意&#xff1a;Day 01&#xff1a; 一、概念 1. 数据库 DB 数据库&#xff1a;DB (Database) 数据仓库&#xff0c;…

重磅!阿里版本【ChatGPT】开放测评!

前两天突然爆出惊人消息&#xff1a;阿里版ChatGPT开放测评了&#xff01; 在本月初&#xff0c;已经有诸多关于阿里巴巴即将推出类似ChatGPT产品的传闻。 数日前&#xff0c;首批曝光的天猫精灵“鸟鸟分鸟”脱口秀版GPT基于大型模型的“精简版”&#xff0c;凭借其出色的表现吸…

快看这些wireshark 命令,必须得会!

wireshark捕获命令 捕获器表达式语法&#xff1a; 限定词三类 Type&#xff1a;host、net、prot 指出其后数字或名字的意义&#xff08;主机&#xff0c;网段&#xff0c;端口&#xff09; Direction&#xff1a;src、dst 指出传输方向 &#xff08;源 、目的&#xff09; …

最全Linux环境开发——shell编程

Linux下shell编程 一、什么是shell shell是一个用 C 语言编写的程序&#xff0c;它是用户使用 Linux 的桥梁。Shell 既是一种命令语言&#xff0c;又是一种程序设计语言。 shell 本质上是 linux 命令&#xff0c;一条一条命令组合在一起&#xff0c;实现某一个目的&#xff…