树莓派5 GPIO占用问题:原PI3正常代码报‘GPIO busy’
树莓派5运行原树莓派3 GPIO控制代码出现"GPIO busy"的解决方案
核心原因分析
树莓派5采用BCM2712新芯片,GPIO子系统和旧款树莓派3存在差异,加上系统默认服务、库兼容性、代码逻辑等问题,都会触发"GPIO busy"错误,以下是具体排查和解决步骤:
1. 旧版RPi.GPIO库不兼容BCM2712芯片
树莓派3常用的旧版RPi.GPIO未适配BCM2712,会导致引脚识别错误或资源锁定。
- 解决步骤:
- 卸载旧库:
sudo pip uninstall RPi.GPIO - 安装适配树莓派5的版本:
sudo pip install RPi.GPIO==0.7.1.post4 - 长期方案:改用官方推荐的
gpiozero或gpiod库,比如安装gpiod的Python绑定:sudo pip install gpiod,重构移位寄存器代码时参考官方文档的引脚操作方式
- 卸载旧库:
2. 系统默认服务占用GPIO资源
树莓派5默认启用了部分依赖GPIO的系统服务(如raspi-gpio),会抢占引脚资源。
- 解决步骤:
- 查看占用GPIO的进程:
sudo lsof /dev/gpiochip0 - 停止占用服务:
sudo systemctl stop raspi-gpio,如需永久禁用:sudo systemctl disable raspi-gpio - 断开额外的HAT设备、GPIO扩展板,排除硬件占用
- 查看占用GPIO的进程:
3. 代码逻辑导致重复初始化GPIO
Flask的多线程/多进程模式下,如果每个请求都初始化GPIO,会引发资源冲突。
- 解决步骤:
- 确保GPIO仅初始化一次:将移位寄存器的GPIO初始化代码放在Flask app启动前,而非路由函数内。示例:
# main.py from flask import Flask import shift_register # 全局初始化GPIO,仅执行一次 shift_register.init_gpio() app = Flask(__name__) @app.route('/control') def control_shift_reg(): shift_register.update_outputs(...) return "OK" if __name__ == '__main__': app.run(host='0.0.0.0', port=5000) - 明确指定引脚编号模式:在
shift_register.py开头添加GPIO.setmode(GPIO.BCM)或GPIO.setmode(GPIO.BOARD),和树莓派3上的设置保持一致 - 程序退出时清理GPIO:在
shift_register.py中添加清理函数,比如:
并在Flask app停止时调用def cleanup_gpio(): GPIO.cleanup()
- 确保GPIO仅初始化一次:将移位寄存器的GPIO初始化代码放在Flask app启动前,而非路由函数内。示例:
4. GPIO访问权限不足
树莓派5对GPIO的权限管控更严格,普通用户无操作权限时会触发类似"busy"的错误。
- 解决步骤:
- 将当前用户加入gpio组:
sudo usermod -aG gpio $USER,执行后重新登录生效 - 临时方案:用sudo运行代码:
sudo python main.py
- 将当前用户加入gpio组:
典型报错栈示例
RuntimeError: GPIO busy Traceback (most recent call last): File "main.py", line 12, in <module> shift_register.init_gpio() File "/home/pi/shift_register.py", line 8, in init_gpio GPIO.setup(DATA_PIN, GPIO.OUT) RuntimeError: GPIO busy
内容的提问来源于stack exchange,提问作者Eddygrinder
相关产品推荐
相关产品推荐

