插件窝 干货文章 Linux下控制GPIO的方法

Linux下控制GPIO的方法

GPIO 电平 gpiod 树莓 630    来源:    2025-04-10

在Linux系统中控制GPIO(通用输入输出)主要有以下几种方法,适用于不同场景和需求:


一、通过 sysfs接口 (传统方式,适用于大多数情况)

路径/sys/class/gpio/
步骤

  1. 导出GPIO引脚

    echo <gpio_number> > /sys/class/gpio/export
    

    示例

    echo 17 > /sys/class/gpio/export  # 导出GPIO17
    
  2. 设置方向(输入/输出)

    echo out > /sys/class/gpio/gpio17/direction  # 设置为输出
    echo in > /sys/class/gpio/gpio17/direction   # 设置为输入
    
  3. 读写GPIO值

    • 输出模式
      bash echo 1 > /sys/class/gpio/gpio17/value # 输出高电平 echo 0 > /sys/class/gpio/gpio17/value # 输出低电平
    • 输入模式
      bash cat /sys/class/gpio/gpio17/value # 读取当前电平
  4. 取消导出

    echo <gpio_number> > /sys/class/gpio/unexport
    

注意
- 需要root权限或用户加入gpio组。
- 引脚编号可能是硬件编号(如BCM2835的GPIO17)或系统编号(需查阅文档)。


二、通过 libgpiod库 (推荐,较新的方式)

适用场景:较新的Linux内核(4.8+)或嵌入式平台(如树莓派4B)。
安装

sudo apt install gpiod libgpiod-dev  # Debian/Ubuntu

常用命令工具
1. 查看可用GPIO
bash gpiodetect 2. 设置/读取GPIO
bash gpioset <chip> <offset>=1 # 设置GPIO为高电平 gpioget <chip> <offset> # 读取GPIO值 示例
bash gpioset gpiochip0 17=1 # 设置GPIO17高电平

编程示例(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);
    gpiod_chip_close(chip);
    return 0;
}

三、通过 WiringPi库 (树莓派传统方式)

适用场景:树莓派传统项目(已停止维护,建议优先用libgpiod)。
安装

sudo apt install wiringpi

使用示例

gpio mode 17 out    # 设置GPIO17为输出
gpio write 17 1     # 输出高电平
gpio read 17        # 读取值

四、通过 设备树(Device Tree)配置

适用场景:嵌入式开发,需在启动时配置GPIO状态(如默认上拉/下拉)。
步骤
1. 修改设备树文件(.dts),添加GPIO配置:
dts gpio-keys { button { label = "USER_BUTTON"; gpios = <&gpio0 17 GPIO_ACTIVE_LOW>; }; }; 2. 编译并加载设备树。


五、通过 Python脚本

  1. 使用RPi.GPIO(树莓派专用)
    python import RPi.GPIO as GPIO GPIO.setmode(GPIO.BCM) GPIO.setup(17, GPIO.OUT) GPIO.output(17, GPIO.HIGH)
  2. 使用gpiod(跨平台推荐)
    python import gpiod chip = gpiod.Chip('gpiochip0') line = chip.get_line(17) line.request(consumer="example", type=gpiod.LINE_REQ_DIR_OUT) line.set_value(1)

常见问题解决

  1. 权限不足

    • 将用户加入gpio组:sudo usermod -aG gpio $USER
    • 或使用sudo执行命令。
  2. GPIO编号错误

    • 查阅硬件手册确认物理引脚和GPIO编号的映射(如树莓派BCM编号)。
  3. sysfs接口不存在

    • 确认内核配置了CONFIG_GPIO_SYSFS,或改用libgpiod。

总结建议

  • 推荐方法:优先使用libgpiod(现代、稳定、跨平台)。
  • 快速调试:用sysfs或gpioset/gpioget命令行工具。
  • 嵌入式开发:结合设备树配置启动状态。

根据具体硬件和内核版本选择最适合的方式即可。