树莓派3 3个GPIO引脚默认高电平无法拉低,请求技术支持
解决树莓派3无法拉低特定GPIO引脚的问题
看起来你遇到的是树莓派常见的GPIO引脚被系统默认复用功能或内核模块占用的问题。从你提供的gpio readall输出看,出问题的是**BCM 17(物理11)、BCM 18(物理12)、BCM 16(物理36)**这三个引脚,我给你一步步排查和解决的方法:
1. 优先排查内核模块占用(最可能的原因)
树莓派的音频驱动snd_bcm2835默认会占用BCM18作为PWM输出(用于模拟音频),哪怕你在raspi-config里关闭了音频接口,这个模块可能依然后台加载着,直接锁定引脚电平。
先临时卸载模块测试:
sudo rmmod snd_bcm2835卸载后再尝试拉低引脚:
gpio write GPIO.0 0 gpio write GPIO.1 0 gpio write GPIO.27 0运行
gpio readall看电压是否变为0。如果有效,说明就是音频模块在搞鬼。永久禁用音频模块:
创建或编辑黑名单配置文件:sudo nano /etc/modprobe.d/blacklist-rpi-audio.conf添加以下内容:
blacklist snd_bcm2835保存退出后,再编辑
/boot/config.txt彻底关闭音频:sudo nano /boot/config.txt添加或修改:
dtparam=audio=off重启树莓派后,引脚应该能正常控制了。
2. 用sysfs直接控制验证硬件
如果上面的方法无效,我们可以绕过wiringPi,用Linux原生的sysfs接口直接操作引脚,排除工具本身的问题:
以BCM17为例:
# 导出引脚到用户空间 echo 17 | sudo tee /sys/class/gpio/export # 设置为输出模式 echo out | sudo tee /sys/class/gpio/gpio17/direction # 设置为低电平 echo 0 | sudo tee /sys/class/gpio/gpio17/value # 查看当前电平值 cat /sys/class/gpio/gpio17/value
如果这里输出还是1,那就要参考BCM2835手册检查引脚的硬件复用功能,确认是否被设置为GPIO之外的其他功能。
3. 检查设备树和后台服务
- 查看
/boot/config.txt里有没有加载额外的设备树overlay,比如dtoverlay=pwm、dtoverlay=i2c-rtc之类的,这些可能偷偷占用引脚。如果有,先注释掉(加#)再重启测试。 - 检查有没有进程占用GPIO资源:
如果输出有进程ID,用fuser /dev/gpiomemps aux | grep <PID>查看是什么进程,停止它再测试引脚控制。
4. 强制设置引脚为普通GPIO模式
根据BCM2835手册,这三个引脚有多种复用功能,你可以用raspi-gpio命令强制设置为普通输出模式:
# 分别设置三个引脚为普通输出 raspi-gpio set 17 op raspi-gpio set 18 op raspi-gpio set 16 op
设置完成后再尝试拉低引脚,应该就能正常工作了。
内容的提问来源于stack exchange,提问作者Anonymgibtsnich




