Notice: Function _load_textdomain_just_in_time was called incorrectly. Translation loading for the simply-static domain was triggered too early. This is usually an indicator for some code in the plugin or theme running too early. Translations should be loaded at the init action or later. Please see Debugging in WordPress for more information. (This message was added in version 6.7.0.) in /var/www/html/wp-includes/functions.php on line 6121
设置树莓派开关机指示灯

设置树莓派开关机指示灯

https://blog.csdn.net/zhufu86/article/details/99704074

怎样在树莓派系统启动时,就改变某一个GPIO为上拉或者下拉,现在我就来举例说明。

我有一个树莓派2B,安装的Raspbian系统。

首先确保安装了wiringpi和device-tree-compiler。

pi@raspberrypi:~ $ sudo apt-get install wiringpi device-tree-compiler
Reading package lists… Done
Building dependency tree
Reading state information… Done
device-tree-compiler is already the newest version (1.4.7-3+rpt1).
wiringpi is already the newest version (2.50).
0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.
1
2
3
4
5
6
7
然后查看wringpi的版本,以及系统硬件的情况。

pi@raspberrypi:~ $ gpio -v
gpio version: 2.50
Copyright (c) 2012-2018 Gordon Henderson
This is free software with ABSOLUTELY NO WARRANTY.
For details type: gpio -warranty

Raspberry Pi Details:
Type: Pi 2, Revision: 01, Memory: 1024MB, Maker: Embest

  • Device tree is enabled.
    *–> Raspberry Pi 2 Model B Rev 1.1
  • This Raspberry Pi supports user-level GPIO access.
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    使用gpio readall可以读出所有GPIO的状态。

pi@raspberrypi:~ $ gpio readall
+—–+—–+———+——+—+—Pi 2—+—+——+———+—–+—–+
| BCM | wPi | Name | Mode | V | Physical | V | Mode | Name | wPi | BCM |
+—–+—–+———+——+—+—-++—-+—+——+———+—–+—–+
| | | 3.3v | | | 1 || 2 | | | 5v | | |
| 2 | 8 | SDA.1 | IN | 1 | 3 || 4 | | | 5v | | |
| 3 | 9 | SCL.1 | IN | 1 | 5 || 6 | | | 0v | | |
| 4 | 7 | GPIO. 7 | IN | 1 | 7 || 8 | 1 | ALT0 | TxD | 15 | 14 |
| | | 0v | | | 9 || 10 | 1 | ALT0 | RxD | 16 | 15 |
| 17 | 0 | GPIO. 0 | IN | 0 | 11 || 12 | 0 | IN | GPIO. 1 | 1 | 18 |
| 27 | 2 | GPIO. 2 | IN | 0 | 13 || 14 | | | 0v | | |
| 22 | 3 | GPIO. 3 | IN | 0 | 15 || 16 | 0 | IN | GPIO. 4 | 4 | 23 |
| | | 3.3v | | | 17 || 18 | 0 | IN | GPIO. 5 | 5 | 24 |
| 10 | 12 | MOSI | IN | 0 | 19 || 20 | | | 0v | | |
| 9 | 13 | MISO | IN | 0 | 21 || 22 | 0 | IN | GPIO. 6 | 6 | 25 |
| 11 | 14 | SCLK | IN | 0 | 23 || 24 | 1 | IN | CE0 | 10 | 8 |
| | | 0v | | | 25 || 26 | 1 | IN | CE1 | 11 | 7 |
| 0 | 30 | SDA.0 | IN | 1 | 27 || 28 | 1 | IN | SCL.0 | 31 | 1 |
| 5 | 21 | GPIO.21 | IN | 1 | 29 || 30 | | | 0v | | |
| 6 | 22 | GPIO.22 | IN | 1 | 31 || 32 | 0 | IN | GPIO.26 | 26 | 12 |
| 13 | 23 | GPIO.23 | IN | 0 | 33 || 34 | | | 0v | | |
| 19 | 24 | GPIO.24 | IN | 0 | 35 || 36 | 0 | IN | GPIO.27 | 27 | 16 |
| 26 | 25 | GPIO.25 | IN | 0 | 37 || 38 | 0 | IN | GPIO.28 | 28 | 20 |
| | | 0v | | | 39 || 40 | 0 | IN | GPIO.29 | 29 | 21 |
+—–+—–+———+——+—+—-++—-+—+——+———+—–+—–+
| BCM | wPi | Name | Mode | V | Physical | V | Mode | Name | wPi | BCM |
+—–+—–+———+——+—+—Pi 2—+—+——+———+—–+—–+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
可以看出,GPIO#6,13,19,26(BCM编号)的默认状态如下表:(GPIO的硬件接口全部悬空的情况下)

BCM GPIO # 硬件接口 # 输入输出 上下拉 值
6 31 输入 未知 1
13 33 输入 未知 0
19 35 输入 未知 0
26 37 输入 未知 0
4个GPIO都是默认输入口,值为1的可能是上拉,值为0的可能是下拉。(只是可能)

现在我要尝试把这4个GPIO的状态改变为下表所示:

BCM GPIO # 硬件接口 # 输入输出 上下拉 值
6 31 输入 下拉 0
13 33 输入 上拉 1
19 35 输出 n.a. X
26 37 输出 n.a. X
新建一个文件mygpio-overlay.dts并编辑为如下内容:

/dts-v1/;
/plugin/;

/ {
compatible = “brcm,bcm2708”;

fragment@0 {
    target = <&gpio>;
    __overlay__ {
        pinctrl-names = "default";
        pinctrl-0 = <&my_pins>;
        my_pins: my_pins {
            brcm,pins = <6 13 19 26>;     /* gpio no. */
            brcm,function = <0 0 1 1>; /* 0:in, 1:out */
            brcm,pull = <1 2 1 2>;     /* 2:up 1:down 0:none */
        };
    };
};

};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
brcm,pins = <6 13 19 26>; /* gpio no. / 一行说明要修改那几个GPIO brcm,function = <0 0 1 1>; / 0:in, 1:out / 一行为要设定的输入输出状态,0输入,1输出 brcm,pull = <1 2 1 2>; / 2:up 1:down 0:none */
一行为要设定的上拉下拉状态,2上拉,1下拉,0为悬空
我把输出也设了上拉和下拉,测试看看是什么效果。

然后将mygpio-overlay.dts文件编译为mygpio-overlay.dtb,并拷贝到/boot/overlays/目录

pi@raspberrypi:~ $ dtc -@ -I dts -O dtb -o mygpio-overlay.dtb mygpio-overlay.dts
pi@raspberrypi:~ $ sudo cp mygpio-overlay.dtb /boot/overlays/
pi@raspberrypi:~ $ sudo vi /boot/config.txt
1
2
3
编辑/boot/config.txt文件,在[pi4]部分之前加入一行device_tree_overlay=overlays/mygpio-overlay.dtb

device_tree_overlay=overlays/mygpio-overlay.dtb

[pi4]
1
2
3
如果没有[pi4],就直接在文件末尾加入这一行好了。

重启后,运行gpio readall看看。

pi@raspberrypi:~ $ gpio readall
+—–+—–+———+——+—+—Pi 2—+—+——+———+—–+—–+
| BCM | wPi | Name | Mode | V | Physical | V | Mode | Name | wPi | BCM |
+—–+—–+———+——+—+—-++—-+—+——+———+—–+—–+
| | | 3.3v | | | 1 || 2 | | | 5v | | |
| 2 | 8 | SDA.1 | IN | 1 | 3 || 4 | | | 5v | | |
| 3 | 9 | SCL.1 | IN | 1 | 5 || 6 | | | 0v | | |
| 4 | 7 | GPIO. 7 | IN | 1 | 7 || 8 | 1 | ALT0 | TxD | 15 | 14 |
| | | 0v | | | 9 || 10 | 1 | ALT0 | RxD | 16 | 15 |
| 17 | 0 | GPIO. 0 | IN | 0 | 11 || 12 | 0 | IN | GPIO. 1 | 1 | 18 |
| 27 | 2 | GPIO. 2 | IN | 0 | 13 || 14 | | | 0v | | |
| 22 | 3 | GPIO. 3 | IN | 0 | 15 || 16 | 0 | IN | GPIO. 4 | 4 | 23 |
| | | 3.3v | | | 17 || 18 | 0 | IN | GPIO. 5 | 5 | 24 |
| 10 | 12 | MOSI | IN | 0 | 19 || 20 | | | 0v | | |
| 9 | 13 | MISO | IN | 0 | 21 || 22 | 0 | IN | GPIO. 6 | 6 | 25 |
| 11 | 14 | SCLK | IN | 0 | 23 || 24 | 1 | IN | CE0 | 10 | 8 |
| | | 0v | | | 25 || 26 | 1 | IN | CE1 | 11 | 7 |
| 0 | 30 | SDA.0 | IN | 1 | 27 || 28 | 1 | IN | SCL.0 | 31 | 1 |
| 5 | 21 | GPIO.21 | IN | 1 | 29 || 30 | | | 0v | | |
| 6 | 22 | GPIO.22 | IN | 0 | 31 || 32 | 0 | IN | GPIO.26 | 26 | 12 |
| 13 | 23 | GPIO.23 | IN | 1 | 33 || 34 | | | 0v | | |
| 19 | 24 | GPIO.24 | OUT | 0 | 35 || 36 | 0 | IN | GPIO.27 | 27 | 16 |
| 26 | 25 | GPIO.25 | OUT | 0 | 37 || 38 | 0 | IN | GPIO.28 | 28 | 20 |
| | | 0v | | | 39 || 40 | 0 | IN | GPIO.29 | 29 | 21 |
+—–+—–+———+——+—+—-++—-+—+——+———+—–+—–+
| BCM | wPi | Name | Mode | V | Physical | V | Mode | Name | wPi | BCM |
+—–+—–+———+——+—+—Pi 2—+—+——+———+—–+—–+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
可以发现6,13,19,26四个GPIO的状态已经发生了变化,6的值变为0(应该是下拉了),13的值变为1(应该是上拉了)。另外可以看出,输出口指定上拉下拉是无效的,默认输出都是0。

举一反三,可以按照这个方法修改其他GPIO的状态。

【参考资料】
https://pinout.xyz
https://github.com/fivdi/onoff/wiki/Enabling-Pullup-and-Pulldown-Resistors-on-The-Raspberry-Pi

在config.txt里用gpio语法就可以给io配置的。
例如将GPIO18设为输出并置为低电平,写法如下:
gpio=18=op,dl

https://www.csdn.net/tags/OtDaAg2sMjIyMDQtYmxvZwO0O0OO0O0O.html

该指令允许在启动时将 GPIO 引脚设置为特定模式和值,这在以前需要自定义文件时是必需的。每行将相同的设置(或至少进行相同的更改)应用于一组引脚,可以是单个引脚 ()、引脚范围 (),也可以是逗号分隔的任意一个 ()。PIN 集后跟此列表中的一个或多个逗号分隔属性:gpiodt-blob.bin33-43-4,6,8=
ip- 输入
op- 输出
a0-a5- Alt0-Alt5
dh- 高电平驱动(用于输出)
dl- 低电平驱动(用于输出)
pu- 上拉
pd- 下拉
pn/np- 无拉
gpio设置按顺序应用,因此稍后出现的设置将覆盖较早出现的设置。