GPIO(通用输入输出端口)详细介绍

news2025/4/23 11:00:42

一、基本概念

GPIO(General - Purpose Input/Output)即通用输入输出端口,是微控制器(如 STM32 系列)中非常重要的一个外设。它是一种软件可编程的引脚,用户能够通过编程来控制这些引脚的输入或输出状态。在嵌入式系统里,GPIO 引脚如同微控制器与外部世界沟通的桥梁,可连接各种外部设备,像按键、LED 灯、传感器等。

二、GPIO 引脚特点

(一)可编程性

可以借助软件配置每个 GPIO 引脚的工作模式,涵盖输入模式、输出模式、复用功能模式和模拟模式等。

(二)多用途

既能够作为简单的数字信号输入输出接口,也能通过复用功能达成更复杂的通信协议,例如 I2C、SPI、UART 等。

(三)电平驱动能力

不同的 GPIO 引脚具备不同的电平驱动能力,能够提供一定的电流以驱动外部设备。

(四)硬件相关补充

  1. 引脚保护
    GPIO 引脚易受静电、过压、过流等因素影响而损坏。可在引脚外部添加保护电路,如用压敏电阻、TVS(瞬态电压抑制器)防止过压冲击,用限流电阻限制流入引脚的电流。例如,连接按键到 GPIO 引脚时,在按键和引脚间串联几百欧姆的限流电阻,防止按键按下瞬间的浪涌电流损坏引脚。

  2. 引脚复用冲突
    当多个外设需复用同一个 GPIO 引脚时会产生冲突。设计电路和编写代码时,要仔细查看芯片的数据手册,了解引脚复用优先级和冲突解决办法。有些芯片会提供专门寄存器配置引脚复用功能,确保不同外设互不干扰。

  3. 引脚电气特性
    除电平驱动能力外,还需考虑引脚的输入电容、输出电阻等电气特性。输入电容影响信号上升和下降时间,尤其是高速信号传输时;输出电阻影响输出信号质量和驱动能力。例如,设计高速通信接口时,要根据引脚输入电容选择合适的上拉/下拉电阻,保证信号稳定性。

三、GPIO 工作模式

(一)输入模式

  1. 浮空输入:引脚处于浮空状态,电平不确定,一般用于外部按键输入。

  2. 上拉输入:引脚内部连接上拉电阻,默认电平为高电平,当外部信号为低电平时,引脚电平被拉低。

  3. 下拉输入:引脚内部连接下拉电阻,默认电平为低电平,当外部信号为高电平时,引脚电平被拉高。

  4. 模拟输入:用于读取模拟信号,通常用于连接模拟传感器。

(二)输出模式

  1. 开漏输出:只能输出低电平,若要输出高电平,需要外接上拉电阻。常用于 I2C 等通信总线。

    • 上拉电阻选择:开漏输出模式下,上拉电阻的选择影响信号上升时间和功耗。电阻值越小,信号上升时间越短,但功耗增加;电阻值越大,功耗越小,但信号上升时间变长。一般在低速通信场景下,可选 10kΩ - 100kΩ 的上拉电阻;高速通信场景下,选 1kΩ - 10kΩ 的上拉电阻。

  2. 推挽输出:可以输出高电平和低电平,具有较强的驱动能力,常用于驱动 LED 等负载。

  3. 复用功能模式:引脚用于实现特定的外设功能,如 USART、SPI 等。在这种模式下,引脚的控制权由相应的外设接管。

    • 配置细节:不同外设复用功能可能需不同配置步骤。例如使用 USART 复用功能时,除配置 GPIO 引脚为复用模式外,还需配置 USART 外设的波特率、数据位、停止位等参数,通常要参考芯片数据手册和外设驱动库文档完成详细配置。

  4. 模拟模式:引脚用于模拟信号的输入输出,此时引脚与数字电路断开,用于 ADC、DAC 等模拟外设。

    • 精度和噪声处理:模拟模式下,引脚精度和噪声影响模拟信号采集和处理。为提高精度,可选择合适的 ADC 分辨率并校准;为降低噪声,可使用滤波电路,如 RC 滤波器。例如采集温度传感器模拟信号时,用 RC 滤波器减少外界干扰。

四、GPIO 在 STM32 中的使用步骤及示例代码

(一)使用步骤

  1. 使能 GPIO 时钟:在使用 GPIO 之前,需要先使能相应的 GPIO 端口时钟。

  2. 配置 GPIO 引脚模式:根据需要选择输入或输出模式。

  3. 控制 GPIO 引脚电平:在输出模式下,可以通过写入寄存器来控制引脚的电平;在输入模式下,可以通过读取寄存器来获取引脚的电平。

(二)示例代码

1. 简单示例代码
#include "stm32f4xx.h"

int main(void)
{
    // 使能 GPIOD 时钟
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE);

    GPIO_InitTypeDef GPIO_InitStructure;
    // 配置 PD12 为推挽输出模式
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
    GPIO_Init(GPIOD, &GPIO_InitStructure);

    while (1)
    {
        // 点亮 LED
        GPIO_SetBits(GPIOD, GPIO_Pin_12);
        for (int i = 0; i < 1000000; i++); // 简单延时

        // 熄灭 LED
        GPIO_ResetBits(GPIOD, GPIO_Pin_12);
        for (int i = 0; i < 1000000; i++); // 简单延时
    }
}
2. 优化延时函数示例代码
#include "stm32f4xx.h"

void delay_ms(uint32_t ms)
{
    TIM_TimeBaseInitTypeDef TIM_InitStructure;
    // 使能 TIM2 时钟
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);

    // 配置定时器
    TIM_InitStructure.TIM_Period = ms - 1;
    TIM_InitStructure.TIM_Prescaler = SystemCoreClock / 1000 - 1;
    TIM_InitStructure.TIM_ClockDivision = 0;
    TIM_InitStructure.TIM_CounterMode = TIM_CounterMode_Up;
    TIM_TimeBaseInit(TIM2, &TIM_InitStructure);

    // 使能定时器
    TIM_Cmd(TIM2, ENABLE);

    // 等待定时器计数完成
    while (!TIM_GetFlagStatus(TIM2, TIM_FLAG_Update));
    TIM_ClearFlag(TIM2, TIM_FLAG_Update);

    // 关闭定时器
    TIM_Cmd(TIM2, DISABLE);
}

int main(void)
{
    // 使能 GPIOD 时钟
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE);

    GPIO_InitTypeDef GPIO_InitStructure;
    // 配置 PD12 为推挽输出模式
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
    GPIO_Init(GPIOD, &GPIO_InitStructure);

    while (1)
    {
        // 点亮 LED
        GPIO_SetBits(GPIOD, GPIO_Pin_12);
        delay_ms(1000); // 延时 1 秒

        // 熄灭 LED
        GPIO_ResetBits(GPIOD, GPIO_Pin_12);
        delay_ms(1000); // 延时 1 秒
    }
}
3. 代码模块化示例代码
#include "stm32f4xx.h"

void GPIO_LED_Init(void)
{
    // 使能 GPIOD 时钟
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE);

    GPIO_InitTypeDef GPIO_InitStructure;
    // 配置 PD12 为推挽输出模式
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
    GPIO_Init(GPIOD, &GPIO_InitStructure);
}

void LED_On(void)
{
    GPIO_SetBits(GPIOD, GPIO_Pin_12);
}

void LED_Off(void)
{
    GPIO_ResetBits(GPIOD, GPIO_Pin_12);
}

int main(void)
{
    GPIO_LED_Init();

    while (1)
    {
        LED_On();
        for (int i = 0; i < 1000000; i++); // 简单延时

        LED_Off();
        for (int i = 0; i < 1000000; i++); // 简单延时
    }
}

五、GPIO 应用场景

  1. 状态指示:除控制 LED 灯,还可用于其他状态指示。如工业控制中,用 GPIO 引脚连接蜂鸣器,系统出现故障时,控制引脚电平触发蜂鸣器报警。

  2. 数据采集:可使用 GPIO 引脚连接传感器,通过读取引脚电平采集传感器数据。例如连接振动传感器,检测到振动时传感器输出高电平,读取 GPIO 引脚电平判断是否发生振动。

  3. 设备控制:在智能家居系统中,用 GPIO 引脚控制继电器,实现对电器设备的开关控制。如通过控制引脚电平打开或关闭空调、灯光等设备。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2340712.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

深度学习-全连接神经网络(过拟合,欠拟合。批量标准化)

七、过拟合与欠拟合 在训练深层神经网络时&#xff0c;由于模型参数较多&#xff0c;在数据量不足时很容易过拟合。而正则化技术主要就是用于防止过拟合&#xff0c;提升模型的泛化能力(对新数据表现良好)和鲁棒性&#xff08;对异常数据表现良好&#xff09;。 1. 概念认知 …

系统架构设计师:流水线技术相关知识点、记忆卡片、多同类型练习题、答案与解析

流水线记忆要点‌ ‌公式 总时间 (n k - 1)Δt 吞吐率 TP n / 总时间 → 1/Δt&#xff08;max&#xff09; 加速比 S nk / (n k - 1) | 效率 E n / (n k - 1) 关键概念 周期&#xff1a;最长段Δt 冲突‌&#xff1a; ‌数据冲突&#xff08;RAW&#xff09; → 旁路/…

复刻低成本机械臂 SO-ARM100 3D 打印篇

视频讲解&#xff1a; 复刻低成本机械臂 SO-ARM100 3D 打印篇 清理了下许久不用的3D打印机&#xff0c;挤出机也裂了&#xff0c;更换了喷嘴和挤出机夹具&#xff0c;终于恢复了正常工作的状态&#xff0c;接下来还是要用起来&#xff0c;不然吃灰生锈了&#xff0c;于是乎想起…

Flutter IOS 真机 Widget 错误。Widget 安装后系统中没有

错误信息&#xff1a; SendProcessControlEvent:toPid: encountered an error: Error Domaincom.apple.dt.deviceprocesscontrolservice Code8 "Failed to show Widget com.xxx.xxx.ServerStatus error: Error DomainFBSOpenApplicationServiceErrorDomain Code1 "T…

Spring之我见 - Spring MVC重要组件和基本流程

核心组件详解 前端控制器 - DispatcherServlet 作用&#xff1a;所有请求的入口&#xff0c;负责请求分发和协调组件。 public class DispatcherServlet extends HttpServlet {// 核心服务方法protected void doService(HttpServletRequest request, HttpServletResponse re…

使用 Axios 进行 API 请求与接口封装:打造高效稳定的前端数据交互

引言 在现代前端开发中&#xff0c;与后端 API 进行数据交互是一项核心任务。Axios 作为一个基于 Promise 的 HTTP 客户端&#xff0c;以其简洁易用、功能强大的特点&#xff0c;成为了前端开发者处理 API 请求的首选工具。本文将深入探讨如何使用 Axios 进行 API 请求&#x…

理解字符设备、设备模型与子系统:以 i.MX8MP 平台为例

视频教程请关注 B 站&#xff1a;“嵌入式 Jerry” Linux 内核驱动开发中&#xff0c;很多人在接触字符设备&#xff08;char device&#xff09;、设备模型&#xff08;device model&#xff09;和各种子系统&#xff08;subsystem&#xff09;时&#xff0c;往往会感到概念混…

鸿蒙Flutter仓库停止更新?

停止更新 熟悉 Flutter 鸿蒙开发的小伙伴应该知道&#xff0c;Flutter 3.7.12 鸿蒙化 SDK 已经在开源鸿蒙社区发布快一年了&#xff0c; Flutter 3.22.x 的鸿蒙化适配一直由鸿蒙突击队仓库提供&#xff0c;最近有小伙伴反馈已经 2 个多月没有停止更新了&#xff0c;不少人以为停…

网络基础概念(下)

网络基础概念&#xff08;上&#xff09;https://blog.csdn.net/Small_entreprene/article/details/147261091?sharetypeblogdetail&sharerId147261091&sharereferPC&sharesourceSmall_entreprene&sharefrommp_from_link 网络传输的基本流程 局域网网络传输流…

一个关于相对速度的假想的故事-4

回到公式&#xff0c; 正写速度叠加和倒写速度叠加的倒写相等&#xff0c;这就是这个表达式所要表达的意思。但倒写叠加用的是减法&#xff0c;而正写叠加用的是加法。当然是这样&#xff0c;因为正写叠加要的是单位时间上完成更远的距离&#xff0c;而倒写叠加说的是单位距离需…

Idea创建项目的搭建方式

目录 一、普通Java项目 二、普通JavaWeb项目 三、maven的JavaWeb项目 四、maven的Java项目 一、普通Java项目 1. 点击 Create New Project 2. 选择Java项目&#xff0c;选择JDK&#xff0c;点击Next 3. 输入项目名称&#xff08;驼峰式命名法&#xff09;&#xff0c;可选…

【DeepSeek 学习推理】Llumnix: Dynamic Scheduling for Large Language Model Serving实验部分

6.1 实验设置 测试平台。我们使用阿里云上的16-GPU集群&#xff08;包含4个GPU虚拟机&#xff0c;类型为ecs.gn7i-c32g1.32xlarge&#xff09;。每台虚拟机配备4个NVIDIA A10&#xff08;24 GB&#xff09;GPU&#xff08;通过PCI-e 4.0连接&#xff09;、128个vCPU、752 GB内…

Kubernetes相关的名词解释kubeadm(19)

kubeadm是什么&#xff1f; kubeadm 是 Kubernetes 官方提供的一个用于快速部署和管理 Kubernetes 集群的命令行工具。它简化了集群的初始化、节点加入和升级过程&#xff0c;特别适合在生产环境或学习环境中快速搭建符合最佳实践的 Kubernetes 集群。 kubeadm 的定位 不是完整…

什么是负载均衡?NGINX是如何实现负载均衡的?

大家好&#xff0c;我是锋哥。今天分享关于【什么是负载均衡&#xff1f;NGINX是如何实现负载均衡的&#xff1f;】面试题。希望对大家有帮助&#xff1b; 什么是负载均衡&#xff1f;NGINX是如何实现负载均衡的&#xff1f; 1000道 互联网大厂Java工程师 精选面试题-Java资源…

基于Python(Django)+SQLite实现(Web)校园助手

校园助手 本校园助手采用 B/S 架构。并已将其部署到服务器上。在网址上输入 db.uplei.com 即可访问。 使用说明 可使用如下账号体验&#xff1a; 学生界面: 账号1&#xff1a;123 密码1&#xff1a;123 账户2&#xff1a;201805301348 密码2&#xff1a;1 # --------------…

从零开始搭建Django博客②--Django的服务器内容搭建

本文主要在Ubuntu环境上搭建&#xff0c;为便于研究理解&#xff0c;采用SSH连接在虚拟机里的ubuntu-24.04.2-desktop系统搭建&#xff0c;当涉及一些文件操作部分便于通过桌面化进行理解&#xff0c;通过Nginx代理绑定域名&#xff0c;对外发布。 此为从零开始搭建Django博客…

【读论文】HM-RAG:分层多智能体多模态检索增强生成

如何在多模态信息检索和生成中&#xff0c;通过协作式多智能体系统来处理复杂的多模态查询。传统的单代理RAG系统在处理需要跨异构数据生态系统进行协调推理的复杂查询时存在根本性限制:处理多种查询类型、数据格式异质性和检索任务目标的多样性&#xff1b;在视觉内容和文本内…

文件操作和IO(上)

绝对路径和相对路径 文件按照层级结构进行组织&#xff08;类似于数据结构中的树型结构&#xff09;&#xff0c;将专门用来存放管理信息的特殊文件称为文件夹或目录。对于文件系统中文件的定位有两种方式&#xff0c;一种是绝对路径&#xff0c;另一种是相对路径。 绝对路径…

JavaFX深度实践:从零构建高级打地鼠游戏(含多物品与反馈机制)

大家好&#xff01;经典的“打地鼠”游戏是许多人童年的回忆&#xff0c;也是学习 GUI 编程一个非常好的切入点。但仅仅是“地鼠出来就打”未免有些单调。今天&#xff0c;我们来点不一样的——用 JavaFX 打造一个高级版的打地鼠游戏&#xff01;在这个版本中&#xff0c;洞里钻…

Python 简介与入门

目录 一、Python 初识 1、Python 的优势 2、Python 的特性 3、Python 的应用领域 二、Linux 环境中安装 Python 1、下载 Python3.11.6 2、安装依赖包 3、解压 Python 压缩包 4、安装 Python 5、编译及安装 6、建立软链接 7、测试 Python3 运行 8、设置国内 pip 更…