OpenHarmony鸿蒙硬件-GPIO介绍 作者:马育民 • 2025-09-27 12:04 • 阅读:10001 # 介绍 GPIO(General-Purpose Input/Output,通用输入输出接口)是嵌入式系统、单片机、微控制器(MCU)及单板计算机(如树莓派)中最基础且灵活的硬件接口,用于实现设备与外部电路或模块的数字信号交互。其核心特点是“通用”——可通过软件配置为输入或输出模式,适配各类简单的数字信号场景。 [](https://www.malaoshi.top/upload/0/0/1GW1wATxg5UK.png) ### 应用场景 GPIO 是硬件交互的“万能接口”,几乎所有简单数字信号场景都依赖其实现: 1. **状态指示**:控制 LED 灯(电源指示、工作状态提示)、蜂鸣器(报警提示)。 2. **输入检测**:读取按键、拨码开关、限位开关的状态。 3. **设备控制**:驱动继电器(控制高电压设备如电机、灯具)、晶体管(放大电流后驱动大功率负载)、舵机(角度控制)。 4. **传感器交互**:连接数字传感器(如温湿度传感器 DHT11、人体红外传感器 PIR),读取其输出的数字信号。 5. **简单通信**:通过软件模拟通信协议(如单总线 1-Wire、I2C),实现设备间的数据传输(需 GPIO 支持快速电平切换)。 # 核心概念 GPIO 本质是芯片引脚引出的“可编程信号通道”,每个 GPIO 引脚可独立配置工作模式,仅处理**数字信号**(高低电平,对应二进制的 0 和 1),不直接支持模拟信号(需配合 ADC 模块转换)。 - **引脚编号**:每个 GPIO 有唯一标识,分“物理编号”(按引脚物理位置排序,如树莓派的 Pin 1~40)和“BCM编号”(按芯片寄存器映射的 GPIO 编号,如 GPIO17),需根据开发工具区分使用。 - **工作模式**:核心可配置为输入或输出,部分高级 GPIO 支持中断、复用等扩展模式。 - **电平标准**:不同芯片的 GPIO 电平不同,常见的有 3.3V(如树莓派、STM32)和 5V(如 Arduino Uno),**跨设备连接时需匹配电平,否则可能烧毁芯片**。 # 工作模式 GPIO 的功能通过软件配置实现,核心模式分为输入、输出及扩展模式,不同模式对应不同应用场景。 ### 1. 输入模式(Input) GPIO 作为“信号接收端”,检测外部电路的电平状态,常见细分模式: - **浮空输入(Floating Input)**:引脚未接外部上拉/下拉电阻,电平状态不稳定(易受干扰),仅适用于外部明确提供电平的场景(如连接传感器的数字输出端)。 - **上拉输入(Pull-Up Input)**:通过内部电阻将引脚默认拉至“高电平”(如 3.3V),当外部电路接地时,引脚变为低电平。适用于“无信号时默认高电平”的场景(如按键检测:按键未按下时高电平,按下时接地变低电平)。 - **下拉输入(Pull-Down Input)**:通过内部电阻将引脚默认拉至“低电平”(GND),外部电路接高电平时引脚变高。与上拉输入互补,适用于“无信号时默认低电平”的场景。 **应用示例**:通过上拉输入模式检测按键是否按下——按键一端接 GPIO 引脚,另一端接地,未按下时引脚为高电平,按下后为低电平,软件通过读取电平变化判断按键状态。 ### 2. 输出模式(Output) GPIO 作为“信号发送端”,主动输出高电平或低电平,控制外部设备,常见细分模式: - **推挽输出(Push-Pull Output)**:引脚可通过“推电路”(NPN 三极管)输出低电平,通过“挽电路”(PNP 三极管)输出高电平,驱动能力强(可直接驱动 LED、继电器等小功率设备),是最常用的输出模式。 - **开漏输出(Open-Drain Output)**:仅能输出低电平(通过 NPN 三极管接地),输出高电平时需外部接“上拉电阻”,否则引脚处于浮空状态。优点是可实现“电平转换”(如 3.3V GPIO 通过上拉电阻输出 5V 电平),且支持多引脚“线与”(多个开漏输出引脚接同一上拉电阻,任一引脚输出低电平则整体为低电平)。 **应用示例**:推挽输出模式控制 LED 亮灭——GPIO 引脚接 LED 正极(串联限流电阻),LED 负极接地,输出高电平时 LED 点亮,输出低电平时熄灭。 ### 3. 扩展模式(高级功能) 部分高性能 GPIO 支持复用或特殊功能,需结合芯片手册配置: - **中断模式(Interrupt)**:输入模式下,当电平发生预设变化(上升沿、下降沿、双边沿、电平触发)时,主动触发芯片中断,无需软件持续轮询。适用于“实时响应外部事件”的场景(如红外遥控接收、传感器触发信号)。 - **复用功能(Alternate Function)**:GPIO 可复用为芯片的专用接口(如 UART 的 TX/RX、I2C 的 SDA/SCL、SPI 的 MOSI/MISO),此时引脚功能由对应的外设控制器管理,而非通用 GPIO 配置。 - **模拟功能(Analog)**:部分引脚可切换为模拟模式,作为 ADC 的输入通道或 DAC 的输出通道,用于处理模拟信号(需芯片集成 ADC/DAC 模块)。 # 开发注意事项 1. **电平匹配**:不同设备的 GPIO 电平可能不同(如 3.3V 与 5V),直接连接会导致芯片损坏。需通过“电平转换模块”(如 TXS0108)或“分压电路”(电阻分压)适配电平。 2. **驱动能力限制**:GPIO 输出电流有限(通常 5~20mA),不可直接驱动大功率设备(如电机),需通过继电器、MOS 管或驱动芯片(如 L298N)扩展驱动能力。 3. **限流保护**:输出模式驱动 LED 等负载时,必须串联限流电阻(通常 220~1kΩ),否则过大电流会烧毁 GPIO 引脚。 4. **上拉/下拉电阻选择**:内部上拉/下拉电阻阻值较大(通常 10~100kΩ),若外部干扰强,可外接 1~10kΩ 电阻增强稳定性。 5. **引脚复用冲突**:同一 GPIO 可能支持多种复用功能(如 UART 和 I2C),开发时需确保仅启用一种功能,避免冲突。 # 常见平台的 GPIO 示例 不同硬件平台的 GPIO 配置逻辑一致,但工具和接口不同,以下为典型示例: | 平台 | 核心芯片 | 电平标准 | 开发工具/语言 | 配置示例(输出高电平) | |--------------|----------------|----------|---------------------|-----------------------------------------| | 树莓派 4B | Broadcom BCM2711 | 3.3V | Python(RPi.GPIO) | `GPIO.setup(17, GPIO.OUT)``GPIO.output(17, GPIO.HIGH)` | | Arduino Uno | ATmega328P | 5V | Arduino C++ | `pinMode(13, OUTPUT)``digitalWrite(13, HIGH)` | | STM32F103 | ARM Cortex-M3 | 3.3V | Keil MDK(C语言) | `GPIO_Init(GPIOA, &GPIO_InitStruct);`(配置 PA0 为推挽输出)`GPIO_SetBits(GPIOA, GPIO_Pin_0);` | # GPIO 与其他接口的区别 GPIO 是“通用基础接口”,需与专用接口区分: - **GPIO vs UART**:UART 是专用串行通信接口(有固定 TX/RX 引脚、波特率),用于设备间稳定数据传输;GPIO 需软件模拟 UART 时序,灵活性高但可靠性低。 - **GPIO vs I2C**:I2C 是两线制同步通信接口(SDA/SCL),支持多设备联网;GPIO 可模拟 I2C,但缺乏硬件时序保障,仅适用于简单场景。 - **GPIO vs ADC**:ADC 用于将模拟信号转换为数字信号;GPIO 仅处理数字信号,若需读取模拟量(如电位器电压),需 GPIO 配合 ADC 模块。 总之,GPIO 是嵌入式开发的“入门基石”,其灵活性使其适配从简单指示灯到复杂传感器交互的各类场景,掌握 GPIO 的配置与应用是硬件开发的核心技能之一。 原文出处:http://www.malaoshi.top/show_1GW1wAUOqLFM.html