您好,登录后才能下订单哦!
密码登录
登录注册
点击 登录注册 即表示同意《亿速云用户服务条款》
# 如何用sys方式控制GPIO
## 引言
在嵌入式Linux开发中,GPIO(General Purpose Input/Output)是最基础的外设接口之一。传统控制方式多通过编写内核模块或使用第三方库(如WiringPi),但Linux内核提供的`sysfs`接口提供了一种无需编写驱动即可操作GPIO的轻量级方案。本文将详细介绍如何通过`sysfs`文件系统控制GPIO。
---
## 一、sysfs GPIO接口原理
### 1.1 sysfs简介
`sysfs`是Linux 2.6内核引入的虚拟文件系统,挂载在`/sys`目录下。它将内核对象(如设备、驱动等)以文件和目录的形式暴露给用户空间,允许通过文件读写操作与内核交互。
### 1.2 GPIO子系统路径
GPIO控制接口位于:
/sys/class/gpio/
关键文件说明:
- `export`:写入GPIO编号以启用控制
- `unexport`:写入GPIO编号以释放控制
- `gpioX/`:具体GPIO的控制目录(X为编号)
---
## 二、硬件准备与权限配置
### 2.1 确认GPIO编号
不同硬件平台的GPIO编号规则不同:
- **树莓派**:使用BCM编号(如GPIO17对应物理引脚11)
- **其他开发板**:参考芯片手册(如i.MX6ULL的GPIO1_IO03=1*32+3=35)
### 2.2 用户权限配置
普通用户需获得访问权限:
```bash
# 将用户加入gpio组
sudo usermod -aG gpio $USER
# 或临时使用sudo
sudo chmod 666 /sys/class/gpio/*
# 示例:启用GPIO17
echo 17 > /sys/class/gpio/export
成功后会出现/sys/class/gpio/gpio17
目录。
# 设置为输出
echo out > /sys/class/gpio/gpio17/direction
# 设置为输入(带内部上拉)
echo in > /sys/class/gpio/gpio17/direction
echo high > /sys/class/gpio/gpio17/direction
# 输出高电平
echo 1 > /sys/class/gpio/gpio17/value
# 读取输入状态
cat /sys/class/gpio/gpio17/value
echo 17 > /sys/class/gpio/unexport
通过edge
文件配置中断触发方式:
# 配置为上升沿触发
echo rising > /sys/class/gpio/gpio17/edge
然后通过poll()
或select()
监听value
文件变化。
#!/bin/bash
GPIO=17
# 初始化
echo $GPIO > /sys/class/gpio/export
echo out > /sys/class/gpio/gpio$GPIO/direction
# 闪烁LED
for i in {1..5}; do
echo 1 > /sys/class/gpio/gpio$GPIO/value
sleep 0.5
echo 0 > /sys/class/gpio/gpio$GPIO/value
sleep 0.5
done
# 清理
echo $GPIO > /sys/class/gpio/unexport
Device or resource busy
/sys/kernel/debug/gpio
或释放冲突资源Permission denied
udev
规则自动配置)# 查看所有GPIO状态
cat /sys/kernel/debug/gpio
# 实时监控值变化
watch -n 0.1 cat /sys/class/gpio/gpio17/value
echo
:保持value
文件打开并通过write()
操作int fd = open("/sys/class/gpio/gpio17/value", O_WRONLY);
write(fd, "1", 1);
close(fd);
方式 | 延迟 | 复杂度 | 适用场景 |
---|---|---|---|
sysfs | 高(~ms) | 低 | 简单控制/调试 |
字符设备 | 中(~μs) | 中 | 生产环境 |
内核模块 | 低(~ns) | 高 | 实时性要求极高 |
import os
import time
# 初始化
os.system("echo 17 > /sys/class/gpio/export")
os.system("echo 27 > /sys/class/gpio/export")
os.system("echo out > /sys/class/gpio/gpio17/direction")
os.system("echo in > /sys/class/gpio/gpio27/direction")
# 事件循环
while True:
with open('/sys/class/gpio/gpio27/value') as f:
if f.read().strip() == '0':
with open('/sys/class/gpio/gpio17/value', 'w') as led:
led.write('1')
time.sleep(0.2) # 防抖
通过sysfs
操作GPIO虽然效率不如内核驱动,但其简单易用的特性使其成为快速原型开发的首选方案。对于学习Linux设备模型和嵌入式入门而言,这是不可或缺的基础技能。随着熟练度提升,开发者可逐步过渡到更高效的字符设备(如/dev/gpiochipX
)控制方式。
注意:不同内核版本可能略有差异,建议参考官方文档《Linux GPIO User Space Documentation》。 “`
(全文约1450字,实际字数可能因Markdown渲染略有差异)
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。