NVIDIA Jetson Xavier NX 控制GPIO

2023-05-16

NVIDIA Jetson Xavier NX 控制GPIO

文章目录

  • NVIDIA Jetson Xavier NX 控制GPIO
  • 前言
  • 一、简介
  • 二、代码实例
    • 1.gpio.h
    • 2.gpio.cpp
  • 三、拓展


前言

在linux系统中以文件io的方式控制GPIO示例,开发板为NVIDIA Jetson Xavier NX,其它公司的开发板也可使用。

一、简介

GPIO09接入蜂鸣器,高电平开启,低电平关闭。

二、代码实例

1.gpio.h

代码如下(示例):

#ifndef GPIO_H
#define GPIO_H

#include <cstdlib>  
#include <cstdio>
#include <cstring>
#include <unistd.h>
#include <fcntl.h> 

#define ON "1"           //开启
#define OFF "0"          //关闭
#define BUZZER "436"     //控制蜂鸣器引脚
#define DIRECTION "out"  //方向为输出

class gpio
{
private:
    /* data */
public:
    gpio(/* args */);
    ~gpio();
    int openGpio(const char *port);  //导入gpio
    int closeGpio(const char *port); //导出gpio
    int readGPIOValue(const char *port,int &level);  //读取gpio值
    int setGpioDirection(const char *port,const char *direction);  //设置gpio方向
    int setGpioValue(const char *port,const char *level);  //设置gpio值
    int setGpioEdge(const char *port,const char *edge);  //设置gpio输入模式
};


#endif

2.gpio.cpp

代码如下(示例):

#include "gpio.h"

gpio::gpio(/* args */)
{
}

gpio::~gpio()
{
}

int gpio::openGpio(const char *port)
{
    int fd;
	const char *path = "/sys/class/gpio/export";

	fd = open(path, O_WRONLY);
	if(fd == -1)
	{
	   perror("Failed to open gpio! ");
	   return -1;
	}

	write(fd, port ,sizeof(port)); 
	close(fd);
	return 0; 	
}
	
int gpio::closeGpio(const char *port)
{
    int fd;
	const char *path = "/sys/class/gpio/unexport";

	fd = open(path, O_WRONLY);
	if(fd == -1)
	{
	   perror("Failed to open gpio! ");
	   return -1;
	}

	write(fd, port ,sizeof(port)); 
	close(fd); 	
	return 0;
}

int gpio::readGPIOValue(const char *port,int &level)
{
	int fd;
	char path[40];
	sprintf(path,"/sys/class/gpio/gpio%s/value", port);
	fd = open(path, O_RDONLY);
	if(fd == -1)
	{
		perror("Failed to read GPIO value!");
		return -1;
	}
	char value[2];
	read(fd,value,1);
	level = atoi(value);
	
	return 0;
}

int gpio::setGpioDirection(const char *port,const char *direction)
{
	int fd;
	char path[40];
	sprintf(path, "/sys/class/gpio/gpio%s/direction", port);
	fd = open(path, O_WRONLY);

	if(fd == -1)
	{
	   perror("Failed to set GPIO direction. ");

	   return -1;
	}

	write(fd, direction, sizeof(direction)); 
	close(fd); 
	return 0;
}

int gpio::setGpioEdge(const char *port,const char *edge)
{
	int fd;
	char path[40];
	sprintf(path, "/sys/class/gpio/gpio%s/edge", port);
	fd = open(path, O_WRONLY);

	if(fd == -1)
	{
	   perror("Failed to set GPIO edge. ");

	   return -1;
	}

	write(fd, edge, sizeof(edge)); 
	close(fd); 
	return 0;
}

int gpio::setGpioValue(const char *port,const char *level)
{
	int fd;
	char path[40];
	sprintf(path, "/sys/class/gpio/gpio%s/value", port);
	fd = open(path, O_RDWR);
	if(fd == -1)
	{
	   perror("Failed to set GPIO value! ");
	   return -1;
	}       

	write(fd, level, sizeof(level));
	close(fd);
	return 0;
}

int main()
{
	gpio *gp = new gpio();
	if(gp->openGpio(BUZZER) != 0)  //打开GPIO
	{
		exit(1);	
	}
	usleep(10000);  //两次操作之间延时10ms
	if(gp->setGpioDirection(BUZZER, DIRECTION) != 0)  //设置GPIO方向
	{
		gp->closeGpio(BUZZER);
		exit(1);		
	}
	usleep(10000);
	if(gp->setGpioValue(BUZZER, ON) != 0)  //设置高电平输出,开启蜂鸣器
	{
		gp->closeGpio(BUZZER);
		exit(1);		
	}
	sleep(1);  //保持1s
	if(gp->setGpioValue(BUZZER, OFF) != 0)  //设置低电平输出,关闭蜂鸣器
	{
		gp->closeGpio(BUZZER);
		exit(1);		
	}
	usleep(10000);
	gp->closeGpio(BUZZER);  //关闭GPIO

	return 0;
}

其实上述代码只是以文件io的形式控制GPIO电平状态,在Linux系统中以键入命令的形式同样可以控制GPIO电平状态。

三、拓展

有一个普遍疑惑的问题是:为何自己实践却没有在系统/sys/class/gpio路径下找到指定端口的的GPIO文件,下面以操作484端口为例,我们来观察系统/sys/class/gpio路径下发生的情况。

命令如下(示例):

test@test-desktop:/sys/class/gpio$ ls

export gpiochip240 gpiochip248 gpiochip288 unexport

test@test-desktop:/sys/class/gpio$ echo 484 > export

test@test-desktop:/sys/class/gpio$ ls

export gpio484 gpiochip240 gpiochip248 gpiochip288 unexport

test@test-desktop:/sys/class/gpio$ echo 484 > unexport

test@test-desktop:/sys/class/gpio$ ls

export gpiochip240 gpiochip248 gpiochip288 unexport

test@test-desktop:/sys/class/gpio$

可见只有在执行了导入指定端口的操作后,gpio484文件 才会被系统动态创建出来,同理,执行导出操作后,gpio484 文件被系统销毁。所以在执行访问目标端口文件的操作之前,你得先导入指定的端口。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

NVIDIA Jetson Xavier NX 控制GPIO 的相关文章

  • HFSS - 矩形口径喇叭天线的设计与仿真

    一 理论 喇叭天线是一种应用广 泛的微波天线 xff0c 其优点是结构简单 xff0c 频带宽 xff0c 功率容量大 xff0c 调整与使用方便 合理地选择喇叭尺寸 xff0c 可以获得良好的辐射特性 相当尖锐的主瓣 较小副瓣和较高的增益

随机推荐

  • 【record】1、FS-I6设置与对码

    官方说明文档 先贴一张官方的说明文档 xff1b 注意的点 xff1a 遥控器设置中 xff0c 按住CANCEL保存 xff1b 遥控器设置 xff08 1 xff09 恢复出厂设置 这里我对FS i6直接恢复出厂设置 xff0c 当然可
  • keil无法观察局部变量

    keil观察局部变量的时候 xff0c 发现总是显示not in scope xff0c 是优化级别过高 xff0c 降低优化级别即可
  • rplidar连接计算机显示process has died.....解决方法

    检测是否打开roscore可能是串口未赋予权限 xff0c 解决方法 xff1a sudo chmod 777 dev ttyUSB0
  • ST-LINK/V2:cannot reset target shutting down debug session

    使用 ST LINK V2 为 STM32 下载程序时 xff0c 总是不成功 xff0c 并弹出如下对话框 xff1a 解决方法 xff1a 打开 MDK 的安装目录下的 STLink xff0c 如下是我的路径 xff1a D mdk5
  • C++声明与定义以及初始化,头文件的书写规范

    初始化 初始化 xff1a 当一个对象被创建的同时获得了特定的值 1 初始化不是赋值 xff0c 初始化的含义是创建变量时赋予其一个初始值 xff0c 而赋值的含义是把对象的当前值擦除 xff0c 而以一个新值代替 xff1b 2 默认初始
  • 【C++】Cmake使用教程(看这一篇就够了)

    文章目录 引言一 环境搭建二 简单入门2 1 项目结构2 2 示例源码2 3 运行查看 三 编译多个源文件3 1 在同一个目录下有多个源文件3 1 1 简单版本3 1 1 1 项目结构3 1 1 2 示例代码3 1 1 3 运行查看 3 1
  • 编码

    UTF 8 UTF 8以字节为单位对Unicode进行编码 从Unicode到UTF 8的编码方式如下 xff1a Unicode编码 十六进制 UTF 8 字节流 二进制 000000 00007F0xxxxxxx000080 0007F
  • tensorflow-gpu1.14 + Win10 + CUDA10.0 + CUDNN7.5.0 + Python3.6 + VS2015安装

    最近学习深度学习 xff0c 在配置环境中的过程中遇到很多问题 xff0c 在这进行总结 xff0c 希望对大家有帮助 一 整个软件安装配置过程 xff0c 很多博客写的很详细 xff0c 附上链接 xff1b https blog csd
  • VS2015下配置海康威视SDK

    1网络摄像头可以在官网下载到SDK开发包 xff0c 进入海康威视官网 xff0c 选择何时的版本 xff0c 点击下载 https www hikvision com cn download 61 html 下载完成进行解压 解压完成 x
  • 如何提升串口响应速度

    最近负责编写公司的工厂模式指令集 xff0c 碰到了一些代码之外的问题 xff0c 困扰了我很久 因为综测那边对串口响应速度的要求很高 xff0c 要求从上位机下发指令开始到上位机接收到完整回复 xff0c 整个过程的响应速度要达到几十个m
  • rv1126 SDK简单编译

    rv1126 SDK简单编译 在工程的根目录下执行命令 source envsetup sh 会出现很多选项 xff0c 选择 rockchip rv1126 rv1109 spi nand 这个选项 xff0c 输入93 我的FLASH是
  • socket套接字编程之UDP协议封装

    1 UDP 协议特点 xff1a 传输层协议 无连接 不可靠传输 面向数据报 2 封装之前先将清楚几个要点 xff1a 2 1网络字节序 xff1a 注意设备的大小端 发送主机通常将发送缓冲区中的数据按内存地址从低到高的顺序发出 接收主机把
  • C语言 使用调用函数的方法,将两个字符串连接起来

    因本人才疏学浅 xff0c 见识浅薄 xff0c 有不当之处望指正 xff0c 谢谢 xff01 这次用调用函数的方法 xff0c 连接两个字符串 在被调函数中可以说明形参数组的大小 xff0c 也可以不说明形参数组的大小 例如cat st
  • STL容器特点对比

    1 分类 序列式容器 xff08 sequential container xff09 vector list array deque forward list关联式容器 xff08 associative container xff09
  • 【RT-Thread】PIN 设备源码分析

    目录 1 获取引脚编号2 设置引脚模式3 设置引脚电平4 绑定 PIN 中断回调函数5 使能引脚中断6 总结7 PIN 设备使用示例 关于 RT Thread 的 PIN 设备驱动应用层面的介绍可以直接参考 RT Thread 的官网 xf
  • 基于VSCode的Linux内核调试环境搭建

    1 安装开发工具 span class token function sudo span span class token function apt span span class token function install span b
  • STM32定时器周期任务函数编写

    在STM32中我们对定时器的周期任务有一定的需求 xff0c 但在使用过程中 xff0c 需要将一些任务写到中断中 xff0c 中断函数会看上去比较复杂 xff0c 并且会有好多标志位 以流水灯为例 xff0c 周期为1s 介绍一下我自己的
  • stm32寄存器封装

    文章目录 前言 一 版本一 二 版本二 三 版本三 前言 本文记录的是用stm32开发的时候 一些底层的寄存器封装 固件库是如何帮我们完成这些工作的 一 版本一 代码如下 示例 span class token comment 外设基地址
  • 使用TI的MSP430实现一个单片机与上位机的数传系统。(西安电子科技大学综合应用开发实验)

    题目要求 xff1a 目标 xff1a 智能控制系统 利用单片机 xff08 开发平台任选 xff09 设计并编程实现一个单片机与上位机的数传系统 要求 xff1a 对单片机和PC 手机 单片机之间的通信进行设计 如果大作业没有设计通信部分
  • NVIDIA Jetson Xavier NX 控制GPIO

    NVIDIA Jetson Xavier NX 控制GPIO 文章目录 NVIDIA Jetson Xavier NX 控制GPIO前言一 简介二 代码实例1 gpio h2 gpio cpp 三 拓展 前言 在linux系统中以文件io的