[Linux] Ubuntu实机下控制GPIO

博客介绍了在Linux系统下控制GPIO口的两种方式。一是终端实现,包括查看GPIO口标号、在特定目录创建IO口以及操作IO口;二是C语言编程实现,如在vim里编写main.c文件,编译后执行。通过这些方法可修改GPIO的值。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

该图为泰山派的IO口空间分配列表,此次要控制的IO口为GPIO1的PA4

方式一:终端实现

通过进入  /sys/class/gpio 直接操作文件的内容修改GPIO的值

查看需要控制的GPIO口在Linux里对应的标号

想要查看上图中GPIO1_A4的GPIO标号,可以在终端使用命令行输入

cat /sys/kernel/debug/gpio

可以得到所有GPIO口的标号,得到的结果是:

gpiochip0: GPIOs 0-31, parent: platform/fdd60000.gpio, gpio0:
 gpio-23  (                    |mdio-reset          ) out hi    

gpiochip1: GPIOs 32-63, parent: platform/fe740000.gpio, gpio1:
 gpio-40  (                    |rgb-led-b           ) out lo    
 gpio-41  (                    |rgb-led-g           ) out lo    
 gpio-42  (                    |rgb-led-r           ) out lo    

gpiochip2: GPIOs 64-95, parent: platform/fe750000.gpio, gpio2:
 gpio-73  (                    |reset               ) out hi    
 gpio-77  (                    |bt_default_rts      ) out lo    
 gpio-79  (                    |bt_default_reset    ) out hi    
 gpio-80  (                    |bt_default_wake_host) in  hi    
 gpio-81  (                    |bt_default_wake     ) out hi    

gpiochip3: GPIOs 96-127, parent: platform/fe760000.gpio, gpio3:

gpiochip4: GPIOs 128-159, parent: platform/fe770000.gpio, gpio4:
 gpio-148 (                    |vcc5v0_host         ) out hi    

gpiochip5: GPIOs 511-511, parent: platform/rk805-pinctrl, rk817-gpio, can sleep:

由此可得在gpio1这组里是由编号为32开始的,所以GPIO1_A0的标号为32,则GPIO1_A4标号为32+4=36。

进入 "sys/class/gpio/"里创建IO口

cd进去之后使用ls查看所有文件,可以看到有

export gpio36 gpiochipo gpiochip128 gpiochip32 gpiochip511 gpiochip64 gpiochip96 unexport

在这里每一个gpiochipX 文件夹用来管理一组GPIO 。进入gpiochip0 ,显示为:

base: 表示这组GPIO的最小标号

label: 表示这组GPIO对应的名字,均为gpio

ngpio:表示该控制器管理的GPIO引脚数量

在使用GPIO之前需要将该IO口设置为可配置模式,使用

echo 标号 > export

在这里是标号36,所以是 echo 36 > export

输入命令之后再用 ls 查看文件夹发现多出一个名为 gpio36 的文件夹,这就是可以控制的36号IO口的文件夹。

进入 gpioxx 操作IO口

cd进入,在这里使用 ls 可以看到有

我们主要关心的文件是:active_low 、 direction 、edge 、value 这四个属性文件

active_low:这个属性文件用于控制IO口的输出极性,默认情况下为0 

direction:引脚为输入或输出模式 可以配置为  "out" 或者  "in"

value:输出模式下,向value 文件写入0/1,控制gpio 引脚输出高/低电平

          输入模式下,该值为读取到的电平状态

edge控制中断的触发模式,在设置为中断之前需要将IO口设置为输入模式

  • 非中断引脚: echo "none" > edge
  • 上升沿触发: echo "rising" > edge
  • 下降沿触发: echo "falling" > edge
  • 边沿触发: echo "both" > edge

当设置为中断输入之后可以通过poll() 函数监听输入

例如,现在需要这个IO口输出高电平,则终端输入如下:

echo "out" > direction
echo  1 > value

即可

需要读取一次作为输入状态的IO口电平(输出状态也可以读电平)则是:

echo "in" > direction
cat /sys/class/gpio/gpio36/value

即可

至此,终端进入  /sys/class/gpio 直接操作文件的内容修改GPIO的值结束。

方式二:C语言编程实现

在vim里编写main.c文件,编译后执行

读取电平如下:

#include "stdio.h"
#include "fcntl.h"
#include "unistd.h"//引用需要的头文件

int main(void)
{
	int fd;
	char value=0;
	
	fd = open("/sys/class/gpio/export",O_RDWR);     //fd作为可读可写的/sys/class/gpio/export
	write(fd,"36",2);                               //启用36号ID引脚,返回的期望值为2个字符
	close(fd);                                      //释放FD

	fd = open("/sys/class/gpio/gpio36/direction",O_RDWR);
	write(fd,"in",3);                               //36号ID设为输入
	close(fd);

    fd = open("/sys/class/gpio/gpio36/value",O_RDWR); //fd作为IO口的电平状态value
	while(1)
    {
		read(fd,&value,1);                          //读入电平
		printf("Value =%c \r\n",value);             //打印电平状态
        sleep(1);                                   //延时1S
	}
	return 0;
}

如果需要修改IO电平则:

#include "stdio.h"
#include "fcntl.h"
#include "unistd.h"//引用需要的头文件

int main(void)
{
	int fd;
	char value=0;
	
	fd = open("/sys/class/gpio/export",O_RDWR);     //fd作为可读可写的/sys/class/gpio/export
	write(fd,"36",2);                               //启用36号ID引脚,返回的期望值为2个字符
	close(fd);                                      //释放FD

	fd = open("/sys/class/gpio/gpio36/direction",O_RDWR);
	write(fd,"out",3);                               //36号ID设为输出
	close(fd);

	fd = open("/sys/class/gpio/gpio36/value",O_RDWR); //fd作为IO口电平
	while(1)
    {
 
	    write(fd,1,3);                              //修改为高电平
        sleep(1);                                   //延时1S
        write(fd,0,3);                              //修改为低电平
        sleep(1);                                   //延时1S
	}
	return 0;
}

未完待续...

<think>好的,我现在需要帮助用户解决在Ubuntu Linux中使用GPIO的问题。首先,我得回忆一下用户提供的引用内容,看看有没有相关的信息。引用[1]提到可以使用debugfs来查看当前GPIO的配置,以及检查GPIO引脚是否被复用或用于其他功能。引用[3]则提到了安装一些构建工具,可能和编译内核模块或相关工具有关。 首先,用户的问题是关于如何在Ubuntu中配置或使用GPIO接口。考虑到Ubuntu是基于Linux的,而树莓派等单板计算通常使用GPIO,可能需要特定的驱动或库。不过,用户可能是在普通的Ubuntu系统上使用GPIO,比如在x86架构的器上,或者是在树莓派上安装的Ubuntu系统。 接下来,我需要确定在Ubuntu中访问GPIO的一般方法。通常,Linux系统通过sysfs接口来访问GPIO,路径是/sys/class/gpio。用户需要导出GPIO引脚,设置方向(输入或输出),然后读写值。这可能涉及到命令行操作,或者编写脚本。 另外,引用[1]提到的debugfs可能是一个调试工具,用于查看GPIO的状态。用户可能需要安装相关的工具,或者挂载debugfs文件系统。不过,在较新的内核中,sysfs可能已经取代了部分功能。 然后,安装必要的工具。引用[3]中提到的build-essential、cmake、make等可能是在编译内核模块或用户空间程序时需要的。如果用户需要编写自己的GPIO控制程序,可能需要这些工具。 可能还需要安装特定的库,比如libgpiod,它提供了用户空间的库和工具来管理GPIO。在Ubuntu中,可以通过apt安装,比如sudo apt install gpiod。 另外,权限问题也是一个需要注意的地方。普通用户可能需要加入特定的用户组,或者使用sudo来访问GPIO设备文件。 现在,我需要将这些步骤整理成一个清晰的流程:安装工具、配置权限、使用sysfs或libgpiod进行操作、调试方法等。同时,确保符合用户的要求,比如使用中文回答,行内公式用$...$,代码块正确,引用标识自然添加。 可能还需要生成相关问题,比如如何通过编程控制GPIO、如何检查GPIO状态、如何解决权限问题等。 需要验证一下各个步骤是否正确,比如安装gpiod包是否存在,sysfs的路径是否正确。在Ubuntu 20.04中,libgpiod确可用,而sysfs接口可能仍然有效,但有些平台可能已迁移到chardev方式,所以可能需要结合具体情况说明。 最后,确保回答结构清晰,分步骤说明,并引用提供的资料中的相关内容,比如debugfs的使用在引用[1]中提到,安装构建工具在引用[3]中。</think>### 如何在Ubuntu Linux中使用GPIO接口? #### 1. **确认系统支持与内核模块** - 在Ubuntu中操作GPIO需要内核支持对应的GPIO控制器驱动。大多数嵌入式平台(如树莓派)的Ubuntu镜像已包含GPIO驱动。 - 使用以下命令查看GPIO设备状态: ```bash ls /sys/class/gpio ``` - 若需调试,可通过`debugfs`查看GPIO配置: ```bash sudo mount -t debugfs none /sys/kernel/debug cat /sys/kernel/debug/gpio # 查看GPIO复用状态[^1] ``` #### 2. **安装必要工具** - 安装基础编译工具(用于后续开发): ```bash sudo apt-get install -y build-essential cmake make pkg-config libgpiod-dev[^3] ``` - 安装GPIO用户空间工具: ```bash sudo apt install gpiod #### 3. **通过sysfs操作GPIO(传统方法)** - **导出GPIO引脚**(以GPIO 17为例): ```bash echo 17 | sudo tee /sys/class/gpio/export ``` - **设置方向**(输入或输出): ```bash echo out | sudo tee /sys/class/gpio/gpio17/direction ``` - **读写值**: ```bash echo 1 | sudo tee /sys/class/gpio/gpio17/value # 输出高电平 cat /sys/class/gpio/gpio17/value # 读取当前电平 ``` #### 4. **使用libgpiod库(推荐方法)** - **命令行工具**(如`gpiodetect`, `gpioinfo`): ```bash gpiodetect # 检测可用GPIO芯片 gpioinfo # 查看引脚详细信息 ``` - **编程控制**(C语言示例): ```c #include <gpiod.h> int main() { struct gpiod_chip *chip = gpiod_chip_open("/dev/gpiochip0"); struct gpiod_line *line = gpiod_chip_get_line(chip, 17); gpiod_line_request_output(line, "example", 0); gpiod_line_set_value(line, 1); gpiod_line_release(line); return 0; } ``` 编译命令:`gcc -o gpio_test gpio_test.c -lgpiod` #### 5. **权限配置** - 默认需要`root`权限操作GPIO,可通过添加用户到`gpio`组解决: ```bash sudo usermod -aG gpio $USER sudo reboot # 重启生效 ``` #### 6. **验证与调试** - 使用万用表测量引脚电压,或通过逻辑分析仪观察信号。 - 检查内核日志中的GPIO错误: ```bash dmesg | grep gpio ``` --- ###
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值