00、配置GPIO需要了解的概念
一、什么是GPIO?
GPIO是通用输入输出引脚(General-Purpose Input/Output),是微控制器(如单片机或Linux设备)上的一个万能接口,能根据需求随时设置成输入或输出功能。
① GPIO的三大功能
- 输出 控制外部设备的开关状态,比如点亮LED灯。 (例如:让GPIO输出高电平或低电平,决定LED亮或灭)
- 输入 检测外部信号的变化,比如读取按键是否按下。 (例如:按键按下时,GPIO的电平变化会被系统捕捉)
- 中断 当GPIO的电平变化时,触发CPU执行特定操作。 (例如:按下重启键时,GPIO通知CPU执行重启操作)
② GPIO的基本特点
- 上电默认状态:所有GPIO默认设置为输入模式,防止意外操作损坏电路。
- 灵活配置:通过软件可以随时调整功能,比如设置为输出、上拉/下拉电阻、驱动电流大小等。
- 无需复杂驱动:在Linux系统中,可以直接用命令操作GPIO,甚至不需要写代码。 (例如:通过文件
/sys/class/gpio
直接控制电平)
③ 为什么Linux控制GPIO更方便?
- 跨平台兼容性: 如果你的程序是基于Linux框架写的,换到不同硬件平台(如从STM32换成RK3568)时,代码几乎不用修改。
- 简单直接: 在命令行里输入几条指令,就能控制GPIO的高低电平,比如:
④ 实际应用案例
按键检测
- 按键一端连接GPIO,另一端连接电源或地。
- 按下按键时,GPIO的电平变化会被系统检测到,从而触发相应操作(如重启)。
LED控制
- LED通过电阻连接到GPIO引脚。
- 例如:GPIO_B7输出高电平,LED亮;输出低电平,LED灭。
⑤ 简单对比:单片机 vs Linux
场景 | 单片机 | Linux |
---|---|---|
控制GPIO | 需要直接操作寄存器(写底层代码) | 可直接用命令或简单代码控制(无需写驱动) |
移植性 | 换芯片需重写代码(如STM32改51单片机) | 同一框架下,换平台几乎无需改代码 |
二、 RK3566 GPIO资源介绍
RK3566芯片有5组GPIO控制器(GPIO0到GPIO4),每组控制器包含4个端口(A/B/C/D),每个端口有8个引脚(0到7)。按理论计算,总共有 5×4×8=160个GPIO。但实际数据手册显示只有142个GPIO,这是因为:并非所有引脚都真正可用。部分GPIO被设计为专用功能(比如硬件控制信号、调试接口等),无法作为普通GPIO使用。因此,实际可用的GPIO数量会比理论值少。
三、什么是 IOMUX(复⽤)
Rockchip的引脚可以设置成不同功能。当一个硬件模块需要多个引脚选项时,会用m0、m1、m2这样的编号来区分,比如I2C控制器的I2C3_SDA_M1 和I2C3_SCL_M1。
复用功能 | GPIO | 引脚编号 | 复用功能 | 复用功能 | |
---|---|---|---|---|---|
3.3V | 3.3V | 1 | 2 | 5V | 5V |
I2C2_SDA_M0 | GPIO0_B6 | 3 | 4 | 5V | 5V |
I2C2_SCL_M0 | GPIO0_B5 | 5 | 6 | GND | GND |
GPIO | GPIO1_A4 | 7 | 8 | GPIO3_B7 | UART3_TX_M1 |
GND | GND | 9 | 10 | GPIO3_C0 | UART3_RX_M1 |
GPIO | GPIO3_A1 | 11 | 12 | GPIO3_C4 | PWM14_M0 |
GPIO | GPIO3_A2 | 13 | 14 | GND | GND |
GPIO | GPIO3_A3 | 15 | 16 | GPIO3_A4 | GPIO |
3.3V | 3.3V | 17 | 18 | GPIO3_A5 | GPIO |
SPI3_MOSI_M1 | GPIO4_C3 | 19 | 20 | GND | GND |
SPI3_MISO_M1 | GPIO4_C5 | 21 | 22 | GPIO3_A6 | GPIO |
SPI3_CLK_M1 | GPIO4_C2 | 23 | 24 | GPIO4_C6 | SPI3_CS0_M1 |
GND | GND | 25 | 26 | GPIO3_A7 | |
I2C3_SDA_M1 | GPIO3_B6 | 27 | 28 | GPIO3_B5 | I2C3_SCL_M1 |
GPIO | GPIO3_B0 | 29 | 30 | GND | GND |
GPIO | GPIO3_C2 | 31 | 32 | GPIO3_C5 | PWM15_IR_M0 |
PWM8_M0 | GPIO3_B1 | 33 | 34 | GND | GND |
PWM9_M0 | GPIO3_B2 | 35 | 36 | GPIO3_C3 | GPIO |
GPIO | GPIO0_B7 | 37 | 38 | GPIO3_B3 | GPIO |
GND | GND | 39 | 40 | GPIO3_B4 | GPIO |
四、PULL(端口上下拉)
Rockchip的IO PAD通常支持三种偏置模式:
- 悬空**(bias-disable)**:不连接,处于浮空状态。
- 上拉(bias-pull-up):启用上拉,稳定在1.8V(逻辑1)。
- 下拉(bias-pull-down):启用下拉,稳定在0V(逻辑0)。
这些设置直接作用于IO PAD,并同时影响GPIO和IOMUX的配置。
五、DRIVE-STRENGTH(端口驱动强度)
Rockchip芯片的GPIO驱动强度设置方式根据芯片型号不同有所区别:
- 早期芯片(如RK3399及更早)用毫安(mA)单位设置强度;
- 新型号芯片(从RK1808开始)改用"等级(Level)"来配置,每个等级对应一个寄存器值。
以RK3566芯片的GPIO0_B6为例:
- 软件配置只需指定等级数字(如Level5)
- 设备树中写
drive-strength=<5>
即可 - 对应的寄存器会自动写入3位二进制值(Level5对应二进制"101")
这种设计让开发者只需关注等级数字,系统会自动处理寄存器的二进制编码转换。
六、 GPIO 编号计算
RK3566 5 组 GPIO bank: GPIO0~GPIO4, 每组又以group: A0~A7, B0~B7, C0~C7, D0~D7 作为编号区分,公式计算引脚:
::: GPIO pin 脚计算公式: pin = bank * 32 + number
GPIO 小组编号计算公式: number = group * 8 + X :::
- bank 为组号
- number 为小组编号
- X具体的哪个管脚常用以下公式计算引脚:
GPIO0_B6 pin 脚计算方法:
C
bank = 0
group = 1
X = 6
故可计算得出:
number = 1*8 + 7 =15
pin = 0*32 + number = 15
1
2
3
4
5
6
2
3
4
5
6