GPIO控制
1. 本节介绍
📝本节您将学习如何通过控制开发板的GPIO引脚,明白GPIO的输入输出,实现对板载LED灯和按键的控制。
🏆学习目标
1️⃣如何将GPIO引脚配置为输出模式,通过引脚电平来控制LED灯的亮灭变化。
2️⃣如何将GPIO引脚配置为输入模式,来检测按键是否按下或松开,去改变LED灯的亮灭。
2. GPIO的基本概念
引脚编号与功能
RP2350为由树莓派设计的双核微控制器,在软件操作上基本兼容RP2040。
RP2350分有两种封装,QFN-60
的 RP2350A
,QFN-80
的 RP2350B
。开发板的主控就选型为RP2350A。
![]() | ![]() |
---|---|
关于芯片上各个信号的功能说明(单击展开)
信号名称 | 描述 |
---|---|
GPIOx | 通用数字输入和输出。可以连接内部外设或直接从软件控制。 |
GPIOx/ADCy | 通用数字输入核输出,但是具有模数转换功能。RP2350 ADC有一个模拟多路复用器来选择这些引脚进行电压采样。 |
QSPIx | 支持 SPI,Dual-SPI,或 Quad-SPI接口。用于连接外部的flash或PSRAM设备,作为芯片内存来支持代码执行。如果不需要作为内存访问,那么可以作为软件控制的GPIO。 |
USB_DM and USB_DP | USB控制器,支持全速设备和全速/低速主机。每个USB引脚上需要接入27Ω的终端电阻。上拉和下拉电阻是内部提供的。如果不需要USB,那么可以作为GPIO使用。 |
XIN and XOUT | 连接一个晶振到 RP2350 的该引脚。XIN也可以作为CMOS时钟的输入。默认使用 12 MHz 晶振 或 12MHz 时钟输入。 |
RUN | 复位引脚。低电平芯片复位,高电平芯片正常运行。如果不需要外部控制,可以直接绑定到IOVDD。 |
SWCLK and SWDIO | 访问内部SWD串行调试总线,用于调试访问和代码下载。 |
GND | 接地 |
IOVDD | 数字GPIO电源,标称电压1.8V至3.3V。 |
USB_OTP_VDD | 内部USB全速PHY和OTP存储的电源,标称电压3.3V。 |
ADC_AVDD | 模数转换器电源,标称电压3.3V。 |
QSPI_IOVDD | QSPI的IO电源,标称电压1.8V至3.3V。 |
VREG_AVDD | 芯片内部稳压器模拟电源,标称电压3.3V。 |
VREG_PGND | 芯片内部稳压器的GND |
VREG_LX | 芯片内部稳压器电压调节器的开关模式输出,连接到外部电感。最大电流 200mA,滤波后标称电压1.1V。 |
VREG_VIN | 芯片内部稳压器电压调节器的电源输入,标称电压2.7V至5.5V。 |
VREG_FB | 芯片内部稳压器电压调节器的电压反馈,连接到滤波后的 VREG 输出(例如用于供应DVDD)。 |
DVDD | 数字核心电源,标称电压1.1V。必须外部连接,无论是电压调整器输出或外部板级电源。 |
关于芯片的引脚介绍就到这里。我们主要了解如何使用开发板上的GPIO。
开发板的引脚功能示意图如下:
引出的GPIO一共有25个。
还有一个 GPIO25
接到板载的绿色LED灯。
输入/输出模式
GPIO 输入模式
当 GPIO 引脚被配置为输入模式
时,它可以读取外部信号的状态,通常是高电平或低电平。 这种模式常用于以下场景:
- 读取开关/按钮状态:例如,检测一个按钮是否被按下。
- 接收信号:从其他设备(如传感器、其他微控制器)接收数字信号。
- 中断触发:配置为输入的 GPIO 引脚可以用于触发中断,响应外部事件。
在输入模式下,GPIO 引脚通常具有
高阻态
,以防止对连接的设备造成影响。
GPIO 输出模式
当 GPIO引 脚被配置为输出模式
时,它可以输出高电平或低电平,用于控制外部设备。 这种模式常用于以下场景:
- 驱动LED:通过输出高电平或低电平来控制LED的亮灭。
- 控制继电器:通过输出信号来控制继电器的开关。
- 通信:在诸如I2C、SPI等通信协议中,GPIO引脚用于输出时钟信号或数据。
在输出模式下,GPIO 引脚可以提供一定的驱动能力,以驱动外部负载。
高电平与低电平
高电平
与低电平
是数字电路中的基本概念,用于表示电路中的两种不同的电压状态,这两种状态通常用于表示二进制数据中的 1
和 0
。
高电平(High Level / 1)
- 定义:在数字电路中,高电平通常表示一种较高的电压状态。
- 电压范围:具体的电压范围取决于所使用的逻辑电路标准。在RP2350A中,IO电平IOVDD接入的是3.3V,那么输出的高电平就是IOVDD。
- 表示:在数字逻辑中,高电平通常表示 “1” 或 “真(True)” 状态。
低电平(Low Level / 0)
- 定义:与高电平相对,低电平表示一种较低的电压状态。
- 电压范围:同样,具体的电压范围取决于逻辑电路标准。在RP2350A中,低电平是接近 地 电位的值(如0V)。
- 表示:在数字逻辑中,低电平通常表示 “0” 或 “假(false)” 状态。
注意事项
- 不同的电子设备可能使用不同的电平标准,因此在连接不同设备时需要确保电平兼容。比如芯片的IO是3.3V,当它需要接入到5V的传感器时,就需要考虑电平兼容问题。但是在RP2350A中,除了带有ADC功能的引脚外,其他的GPIO都兼容5V电平。
- 在实际电路中,由于噪声的存在,高电平和低电平之间需要有一定的电压差(称为噪声容限)来确保电路的稳定工作。
3. GPIO电气特性
省流总结
除 GPIO26\27\28\29 外,其他 GPIO 的最大输入电压为 5.5V
,GPIO26\27\28\29 最大输入电压为 3.3+0.5V。
全部 GPIO 最大的总输出电流之和为 100 mA
; 全部 GPIO 最大的总输入电流之和为 100mA
。
引出的全部 GPIO 在复位\上电后默认为 低电平状态
。
最大电流与电压
电压信号说明
Voltage at IO(FT)
表示的是容忍GPIO。在RP2350A中,除了带有ADC功能的引脚外,其他的GPIO都有容忍功能。
电流信号说明
Maximum Total IOVDD current
IOVDD的最大总输出电流。由GPIO引脚提供的所有电流之和。
Maximum Total VSS current due to GPIO(IOVSS)
GPIO产生的最大总电流。所有注入GPIO引脚的电流之和。
GPIO的默认状态
GPIO名称 | QFN-60 引脚号 | QFN-80 引脚号 | 引脚类型 | 电源领域 | 复位状态 | 说明 |
---|---|---|---|---|---|---|
GPIO0 | 2 | 77 | Digital IO (FT) | IOVDD | Pull-Down | User IO |
GPIO1 | 3 | 78 | Digital IO (FT) | IOVDD | Pull-Down | User IO |
GPIO2 | 4 | 79 | Digital IO (FT) | IOVDD | Pull-Down | User IO |
GPIO3 | 5 | 80 | Digital IO (FT) | IOVDD | Pull-Down | User IO |
GPIO4 | 7 | 1 | Digital IO (FT) | IOVDD | Pull-Down | User IO |
GPIO5 | 8 | 2 | Digital IO (FT) | IOVDD | Pull-Down | User IO |
GPIO6 | 9 | 3 | Digital IO (FT) | IOVDD | Pull-Down | User IO |
GPIO7 | 10 | 4 | Digital IO (FT) | IOVDD | Pull-Down | User IO |
GPIO8 | 12 | 6 | Digital IO (FT) | IOVDD | Pull-Down | User IO |
GPIO9 | 13 | 7 | Digital IO (FT) | IOVDD | Pull-Down | User IO |
GPIO10 | 14 | 8 | Digital IO (FT) | IOVDD | Pull-Down | User IO |
GPIO11 | 15 | 9 | Digital IO (FT) | IOVDD | Pull-Down | User IO |
GPIO12 | 16 | 11 | Digital IO (FT) | IOVDD | Pull-Down | User IO |
GPIO13 | 17 | 12 | Digital IO (FT) | IOVDD | Pull-Down | User IO |
GPIO14 | 18 | 13 | Digital IO (FT) | IOVDD | Pull-Down | User IO |
GPIO15 | 19 | 14 | Digital IO (FT) | IOVDD | Pull-Down | User IO |
GPIO16 | 27 | 16 | Digital IO (FT) | IOVDD | Pull-Down | User IO |
GPIO17 | 28 | 17 | Digital IO (FT) | IOVDD | Pull-Down | User IO |
GPIO18 | 29 | 18 | Digital IO (FT) | IOVDD | Pull-Down | User IO |
GPIO19 | 31 | 19 | Digital IO (FT) | IOVDD | Pull-Down | User IO |
GPIO20 | 32 | 20 | Digital IO (FT) | IOVDD | Pull-Down | User IO |
GPIO21 | 33 | 21 | Digital IO (FT) | IOVDD | Pull-Down | User IO |
GPIO22 | 34 | 22 | Digital IO (FT) | IOVDD | Pull-Down | User IO |
GPIO23 | 35 | 23 | Digital IO (FT) | IOVDD | Pull-Down | User IO |
GPIO24 | 36 | 25 | Digital IO (FT) | IOVDD | Pull-Down | User IO |
GPIO25 | 37 | 26 | Digital IO (FT) | IOVDD | Pull-Down | User IO |
GPIO26_ADC0 | 40 | - | Digital IO / Analogue | IOVDD / ADC_AVDD | Pull-Down | User IO or ADC input |
GPIO27_ADC1 | 41 | - | Digital IO / Analogue | IOVDD / ADC_AVDD | Pull-Down | User IO or ADC input |
GPIO28_ADC2 | 42 | - | Digital IO / Analogue | IOVDD / ADC_AVDD | Pull-Down | User IO or ADC input |
GPIO29_ADC3 | 43 | - | Digital IO / Analogue | IOVDD / ADC_AVDD | Pull-Down | User IO or ADC input |
其他引脚内容说明请参考RP2350数据手册的 14.8.2. Pin Definitions 章节内容。
4. GPIO 使用指南
使用machine.Pin
machine.Pin
类是 MicroPython 中用于控制输入/输出引脚的核心模块。通过该模块,我们可以轻松地管理微控制器上的 GPIO 引脚,进行基础的输入输出操作。
要使用 machine.Pin
,首先需要导入该模块:
from machine import Pin
构造函数
pin = machine.Pin(id, mode=- 1, pull=- 1, *, value, drive, alt)
用于构造pin对象,可同时对引脚进行初始化。
参数说明
id
: 要控制的引脚编号,例如GPIO1就填入1,GPIO12就填入12。mode
: 引脚的模式,支持输入模式Pin.IN
、输出模式Pin.OUT
和 开漏输出模式Pin.OPEN_DRAIN
。pull
: 内部上下拉电阻的配置 (可不配置),Pin.PULL_UP
为开启上拉电阻,Pin.PULL_DOWN
为开启下拉电阻,默认为不使用内部上下拉电阻None
。value
: 仅对输出
和开漏输出
模式有效,如果给定,则指定初始输出引脚电平,否则引脚外设的状态保持不变。drive
: 驱动能力配置 (可不配置),可以是以下之一:Pin.LOW_POWER
,Pin.MED_POWER
或Pin.HIGH_POWER
。实际的当前驱动能力取决于端口。并非所有端口都实现此参数。
上下拉电阻是什么❓
- 上拉电阻:将信号的输出端通过一个电阻让其保持在一个高电平的状态;
- 下拉电阻:将信号的输出端通过一个电阻让其保持在一个低电平的状态;
示例:
# 实例化GPIO25为输出,其他设置为默认
pin = Pin(25, Pin.OUT)
2
方法总结
重新初始化引脚配置
Pin.init(mode=- 1, pull=- 1, *, value, drive, alt)
使用给定的参数重新初始化引脚。只会设置那些指定的参数。其余引脚外设状态将保持不变。
例如引脚原本是设置为输出模式,则可以通过该方法 Pin.init
设置为输入模式。
有关参数的详细信息,请参阅构造函数小节的参数说明。
设置和获取引脚高低电平状态
Pin.value([x])
此方法允许设置和获取引脚的值,具体取决于是否x提供参数。
例如
Pin.value(1)
则表示是输出高电平,Pin.value(0)
则表示是输出低电平;state = Pin.value()
则表示获取该 Pin 的引脚状态赋值给 state。
输出高电平
Pin.on()
将引脚设置为 “1” 输出电平。
输出低电平
Pin.off()
将引脚设置为“0”输出电平。
设置引脚中断
Pin.irq(handler=None, trigger=Pin.IRQ_FALLING | Pin.IRQ_RISING, *, priority=1, wake=None, hard=False)
配置在引脚的触发源处于活动状态时要调用的中断处理程序。如果引脚模式为 Pin.IN
则触发源为引脚上的外部值。如果引脚模式为 Pin.OUT
则触发源为引脚的输出缓冲器。否则,如果引脚模式是 Pin.OPEN_DRAIN
则触发源是状态“0”的输出缓冲器和状态“1”的外部引脚值。
参数说明:
参数 | 说明 | 可选值 |
---|---|---|
handler | 中断触发时要调用的可选函数。处理程序必须只采用一个参数,即 Pin实例。 | 函数名 |
trigger | 配置可以产生中断的事件。(值可以通过“或”运算来触发多个事件) | Pin.IRQ_FALLING 下降沿中断 Pin.IRQ_RISING 上升沿中断 Pin.IRQ_LOW_LEVEL 低电平中断 Pin.IRQ_HIGH_LEVEL 高电平中断 |
priority | 设置中断的优先级。更高的值总是代表更高的优先级。 | 整数值 |
wake | 选择此中断可以唤醒系统的电源模式。也可以将这些值进行“或”运算,使一个引脚在一种以上的电源模式下产生中断。 | machine.IDLE, machine.SLEEP, machine.DEEPSLEEP |
hard | 如果为真,则使用硬件中断。这减少了引脚更改和被调用的处理程序之间的延迟。硬中断处理程序可能不分配内存;请参阅 编写中断处理程序。并非所有端口都支持此参数。 | True, False |
此方法返回一个回调对象。
5. GPIO控制实验
🏆实验目标
1️⃣将 GPIO25 引脚配置为输出模式,通过引脚电平来控制LED灯的亮灭变化。
2️⃣将 GPIO引脚配置为输入模式,来检测按键是否按下或松开,去改变LED灯的亮灭。
了解硬件
LED灯的驱动
开发板上自带了一个可用户控制的绿色LED。
LED 灯驱动原理(点击展开)
LED 驱动指的是通过稳定的电源为 LED 提供合适的电流和电压,使其正常工作点亮。
LED 驱动方式主要有恒流和恒压两种。限定电流的恒流驱动是最常见的方式,因为 LED 灯对电流敏感,电流大于其额定值可能导致损坏。恒流驱动保证了稳定的电流,从而确保了 LED 安全。
LED 灯的驱动比较简单,只需要给将对应的正负极接到单片机的GPIO即可驱动。
LED的接法也分有两种,灌入电流和输出电流。
灌入电流指的是LED的供电电流是由外部提供电流,将电流灌入我们的MCU;风险是当外部电源出现变化时,会导致MCU的引脚烧坏。
输出电流指的是由MCU提供电压电流,将电流输出给LED;如果使用 MCU的GPIO 直接驱动 LED,则驱动能力较弱,可能无法提供足够的电流驱动 LED(我们只是一个简单的LED没有事,如果用的大功率灯珠可能就不行了)。
需要注意的 是 LED 灯的颜色不同,对应的电压也不同。电流不可过大,通常需要接入220欧姆到10K欧姆左右的限流电阻,限流电阻的阻值越大,LED的亮度越暗。
在开发板的原理图中,LED的正极接入限流电阻R1再到GPIO25引脚,负极接入到GND。通过LED灯的驱动原理可以知道,我们只要控制开发板的GPIO25引脚输出高电平,即可点亮LED。
按键驱动
独立按键原理主要是基于机械触点和电气触点之间的关系。当按键未被按下时,通常触点是分开的,电路是断开的。当用户按下按键时,触点在弹簧和导电片的作用下形成闭合,这时电路连通,微控制器能够读取到该按键触发的信号。
独立按键驱动是为了让微控制器能识别按键的状态,而微控制器正好可以识别高电平和低电平,所以大多数的按键都是通过给按键的一端接入高电平,一端接入GPIO;或者是给按键的一端接入低电平,一端接入GPIO。通过检测连接按键的引脚有没有发生电平变化,就可以知道按键是否按下。
遗憾的是开发板上的两个按键都没有接入到GPIO,所以不能用于实验。需要我们自己外部搭建按键电路。
接线图
实物图
在以上电路中,我们只要控制开发板的GPIO17引脚为带有内部上拉电阻的输入模式,当按键被按下时GPIO17被按键导通到GND变成低电平;当按键没有按下时GPIO17为默认状态,而因为我们开启了内部上拉电阻,故默认状态变成了高电平。
按下为低电平,未按下为高电平。
代码验证
代码目标
将 GPIO25
引脚配置为输出模式,通过引脚电平来控制LED灯的亮灭变化。
import machine
# 初始化 GPIO25 引脚为输出模式
led = machine.Pin(25, machine.Pin.OUT)
led.value(1) # 点亮LED
# led.value(0) # 熄灭LED
2
3
4
5
6
7
8
将以上代码运行,将会看到开发板上的LED被点亮。
在烧录代码验证前,请确保你已经按照 环境搭建 章节的内容,将MicroPython 固件烧录到开发板中。不然将无法下载代码。
代码目标
将 GPIO17
引脚配置为输入模式,来检测按键是否按下或松开,去改变LED灯的亮灭。
from machine import Pin
# 初始化 GPIO25 引脚为输出模式
led = machine.Pin(25, Pin.OUT)
# 初始化 GPIO17 引脚为上拉输入模式
key = machine.Pin(17, Pin.IN, pull=Pin.PULL_UP)
while(True):
#如果按键引脚返回的是False
#表示按键被按下 引脚接通到了GND 变成了低电平
if key.value() == False:
led.value(1) # 点亮LED
else:
led.value(0) # 熄灭LED
2
3
4
5
6
7
8
9
10
11
12
13
14
将以上代码运行,按下按键将会看到开发板上的LED被点亮;松开按键开发板上的LED将会熄灭。
在烧录代码验证前,请确保你已经按照 环境搭建 章节的内容,将MicroPython 固件烧录到开发板中。不然将无法下载代码。