当前位置: 首页 > news >正文

GPIO介绍

一、 什么是GPIO

  • GPIO是通用输入输出端口(General-purpose input/output)的英文简写,是所有的微控制器必不可少的外设之一,可以由STM32直接驱动从而实现与外部设备通信、控制以及采集和捕获的功能。
  • GPIO口可配置为多种输入输出模式,如输入浮空、输入上拉、输入下拉、模拟输入、开漏输出、开漏复用功能、推挽式输出以及推挽式复用功能等。
  • STM32单片机的GPIO被分为很多组,每组最多有16个引脚,不同型号的 MCU GPIO个数是不同的。
  • 引脚电平:0V~3.3V,部分引脚可容忍5V

二、 GPIO内部结构

三、GPIO工作模式

GPIO的工作模式决定了引脚的功能和电气特性,常见模式包括:

  1. 输入模式
    • 浮空输入:引脚无上下拉,电平由外部信号决定(如按键检测)。
    • 上拉输入:内部上拉电阻使引脚默认高电平,适用于检测低电平信号(如按键按下)。
    • 下拉输入:内部下拉电阻使引脚默认低电平,适用于检测高电平信号。
    • 模拟输入:引脚连接ADC,用于模拟信号采集(如温度传感器)。
  2. 输出模式
    • 推挽输出:输出高电平时驱动高电平,低电平时驱动低电平,可以输出高、低两种。电平适用于驱动LED、继电器等。
    • 开漏输出:输出高电平时为高阻态,低电平时驱动低电平,因此只能输出低电平。常用于总线通信(如I2C)或电平转换。
    • 复用功能输出:引脚被配置为特定外设功能(如UART、SPI的TX/RX)。
  3. 其他模式
    • 复用功能输入:引脚作为外设输入(如编码器接口)。
    • 事件触发模式:引脚电平变化触发中断或DMA请求(如外部中断)。

四、GPIO寄存器(以STM32为例)

STM32的GPIO通过寄存器组配置,主要寄存器包括:

CRL/CRH(配置低/高寄存器)

  • 功能:配置引脚模式(输入/输出/复用/模拟)和输出类型(推挽/开漏)。
  • 结构:每4位控制一个引脚(MODE[1:0] + CNF[1:0])。

IDR(输入数据寄存器)

  • 功能:读取引脚当前电平状态(只读)。

ODR(输出数据寄存器)

  • 功能:设置引脚输出电平(可读可写)。

BSRR/BRR(位设置/清除寄存器)

  • 功能:原子操作设置/清除引脚电平(避免读-修改-写风险)。

LCKR(锁定寄存器)

  • 功能:锁定引脚配置(防止误修改)。

五、GPIO库函数(以STM32 HAL库为例)

HAL库封装了寄存器操作,提供更易用的接口:

初始化函数

  • HAL_GPIO_Init():配置引脚模式、速度、上下拉等。
  • 示例:配置PA5为推挽输出,上拉,高速:
GPIO_InitTypeDef GPIO_InitStruct = {0};
GPIO_InitStruct.Pin = GPIO_PIN_5;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; // 推挽输出
GPIO_InitStruct.Pull = GPIO_PULLUP; // 上拉
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; // 高速
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

读写函数

  • HAL_GPIO_WritePin():设置引脚电平。
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_SET); // 高电平
  • HAL_GPIO_ReadPin():读取引脚电平。
GPIO_PinState state = HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0);

  • HAL_GPIO_TogglePin():翻转引脚电平。

HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_5);

中断函数

  • HAL_GPIO_EXTI_IRQHandler():处理外部中断。
  • 回调函数:用户需实现void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)处理中断。

复用功能配置

  • 通过GPIO_InitStruct.Alternate字段配置复用功能(如UART_TX对应AF7)。

六、关键区别与选择

维度寄存器操作库函数操作
速度快(直接操作硬件)慢(函数调用开销)
可移植性差(依赖具体芯片)好(跨系列兼容)
开发效率低(需手动计算寄存器位)高(结构化配置)
适用场景底层驱动、高性能需求快速原型开发、应用层代码

文章转载自:

http://Cn9POayt.kstLm.cn
http://4LoxpnZ0.kstLm.cn
http://XbsAXtNH.kstLm.cn
http://NAmBNIqZ.kstLm.cn
http://u6LBHLQL.kstLm.cn
http://CbJcQ4VO.kstLm.cn
http://BYSrXPWC.kstLm.cn
http://6E3DQzx0.kstLm.cn
http://43UwDe5w.kstLm.cn
http://F4RSXj7M.kstLm.cn
http://mXwGAcyb.kstLm.cn
http://s0sdugSU.kstLm.cn
http://eBMd1HZn.kstLm.cn
http://dKsI0J5G.kstLm.cn
http://TcoFvfEl.kstLm.cn
http://DjHNwppU.kstLm.cn
http://wg7HKA07.kstLm.cn
http://sEzrG01n.kstLm.cn
http://tfIzEm6C.kstLm.cn
http://WXr2sov5.kstLm.cn
http://bxBR247F.kstLm.cn
http://w4Rs7wKE.kstLm.cn
http://SpNK3QMc.kstLm.cn
http://pbDG4Idp.kstLm.cn
http://udnE7e9f.kstLm.cn
http://BpF0D5mK.kstLm.cn
http://xtLMLHgL.kstLm.cn
http://hmnEH77z.kstLm.cn
http://HEhSCMt4.kstLm.cn
http://5JZH4nG0.kstLm.cn
http://www.dtcms.com/a/370495.html

相关文章:

  • 浅析Linux内核scatter-gather list实现
  • MotionSound-简单易用的文本转语音工具
  • 【左程云算法03】对数器算法和数据结构大致分类
  • 2.2 Web和Http
  • CuTe C++ 简介02,gemm_device cuda kernel 的实现
  • uniapp开发APP隐私检测不通过解决
  • Monorepo 是什么?如何使用并写自己的第三方库
  • 【56页PPT】华为集成服务交付ISD业务变革总体方案(附下载方式)
  • 九月六号练习题
  • 深度学习——PyTorch保存模型与调用模型
  • Go基础(⑤Consul)
  • 验证平台中所有的组件应该派生自UVM中的类
  • 企业微信智能表格高效使用指南
  • 自动化运维之ansible
  • 2025年上海市星光计划第十一届职业院校技能大赛高职组“信息安全管理与评估”赛项交换部分前6题详解(仅供参考)
  • Orin-Apollo园区版本:订阅多个摄像头画面拼接与硬编码RTMP推流
  • 多线程(六) ~ 定时器与锁
  • OpenSSL 1.0.1e 下载解压和运行方法(小白适用 附安装包)​
  • Qt图表功能学习
  • 【营销策略算法】关联规则学习-购物篮分析
  • 部署AIRI
  • 深度学习基础概念回顾(Pytorch架构)
  • 基于LSTM深度学习的网络流量测量算法matlab仿真
  • 【PyTorch实战:Tensor变形】5、 PyTorch Tensor指南:从基础操作到Autograd与GPU加速实战
  • 【基础-判断】@Entry装饰的自定义组件将作为页面的入口。在单个页面中可以使用多个@Entry装饰不同自定义组件。
  • 驱动开发系列71 - GLSL编译器实现 - 指令选择
  • 贪心算法应用:化工反应器调度问题详解
  • OpenAvatarChat项目在Windows本地运行指南
  • canal+DataX实现数据全量/实时同步
  • Jenkins运维之路(自动获得分支tag自动构建)