在Linux系统中控制GPIO(通用输入输出)主要有以下几种方法,适用于不同场景和需求:
路径:/sys/class/gpio/
步骤:
导出GPIO引脚
echo <gpio_number> > /sys/class/gpio/export
示例:
echo 17 > /sys/class/gpio/export # 导出GPIO17
设置方向(输入/输出)
echo out > /sys/class/gpio/gpio17/direction # 设置为输出
echo in > /sys/class/gpio/gpio17/direction # 设置为输入
读写GPIO值
bash
echo 1 > /sys/class/gpio/gpio17/value # 输出高电平
echo 0 > /sys/class/gpio/gpio17/value # 输出低电平
bash
cat /sys/class/gpio/gpio17/value # 读取当前电平
取消导出
echo <gpio_number> > /sys/class/gpio/unexport
注意:
- 需要root权限或用户加入gpio
组。
- 引脚编号可能是硬件编号(如BCM2835的GPIO17)或系统编号(需查阅文档)。
适用场景:较新的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;
}
适用场景:树莓派传统项目(已停止维护,建议优先用libgpiod)。
安装:
sudo apt install wiringpi
使用示例:
gpio mode 17 out # 设置GPIO17为输出
gpio write 17 1 # 输出高电平
gpio read 17 # 读取值
适用场景:嵌入式开发,需在启动时配置GPIO状态(如默认上拉/下拉)。
步骤:
1. 修改设备树文件(.dts
),添加GPIO配置:
dts
gpio-keys {
button {
label = "USER_BUTTON";
gpios = <&gpio0 17 GPIO_ACTIVE_LOW>;
};
};
2. 编译并加载设备树。
python
import RPi.GPIO as GPIO
GPIO.setmode(GPIO.BCM)
GPIO.setup(17, GPIO.OUT)
GPIO.output(17, GPIO.HIGH)
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)
权限不足:
gpio
组:sudo usermod -aG gpio $USER
sudo
执行命令。GPIO编号错误:
sysfs接口不存在:
CONFIG_GPIO_SYSFS
,或改用libgpiod。libgpiod
(现代、稳定、跨平台)。gpioset/gpioget
命令行工具。根据具体硬件和内核版本选择最适合的方式即可。