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

【STM32】GPIO

目录

    • 1、什么是GPIO
    • 2、什么是GPIO组
    • 3、GPIO的基本结构
    • 4、GPIO位结构
    • 5、GPIO八种工作模式
    • 6、GPIO相关寄存器
      • 1. 端口配置低寄存器`GPIO[x]_CRL`和端口配置高寄存器`GPIO[x]_CRH`, Config Register High和Config Register Low)
      • 2. 端口输入数据寄存器(GPIO[x]_IDR)
      • 3. 端口输出数据寄存器`GPIO[x]_ODR`, Output Data Register
      • 4. 端口位设置/清除寄存器`GPIO[x]_BSRR` Bit Set Reset Register
      • 5. 端口位清除寄存器`GPIO[x]_BRR`, Bit Reset Regsiter
      • 6、影子寄存器

1、什么是GPIO

GPIO(General Purpose Input/Output通用输入输出 )

通用输入输出 的缩写,是微控制器(MCU)或处理器中用于与外部设备或电路进行交互的 基本硬件接口

如果某一个引脚支持GPIO功能, 则可以将其配置为输入或者输出.

  • 数字输入:接收高电平(1)或低电平(0)信号。
    • 典型如按钮输入, 将按钮连接到 GPIO 输入引脚,微控制器可以读取按钮按下或松开的状态。
  • 输出模式:输出高电平(1)或低电平(0)信号。
    • 典型的LED控制, 将 LED 连接到 GPIO 输出引脚,通过设置引脚的电平来控制 LED 的开关。

2、什么是GPIO组

STM32 的 GPIO 端口通常命名为 GPIOA、GPIOB、GPIOC … 依次类推,每个端口最多包含 16 个引脚,编号从 0 到 15

  • GPIOA: PA0 ~ PA15
  • GPIOB: PB0 ~ PB15
  • GPIOC: PC0 ~ PC15

并非所有组的所有编号都可用, 需要查看手册
在这里插入图片描述
我的来自stm32F103VET6的原理图

3、GPIO的基本结构

在这里插入图片描述

4、GPIO位结构

在这里插入图片描述

5、GPIO八种工作模式

  • 输入模式

    • 输入浮空(Floating Input)

      • 特点:引脚无内部上拉或下拉电阻,仅作为输入,悬空时状态不确定,容易受到干扰。

      • 适用场景:需要外部电路(如 按键、传感器)来确定电平,或用于复用功能(如 USART RX)。

    • 输入上拉(Input Pull-Up)**

      • 特点:内部连接 上拉电阻,默认状态为 高电平(1),外部需要拉低才能改变状态。
      • 适用场景:按键检测(常见的 低电平触发按键)。
    • 输入下拉(Input Pull-Down)

      • 特点:内部连接 下拉电阻,默认状态为 低电平(0),外部需要拉高才能改变状态。
      • 适用场景:按键检测(常见的 高电平触发按键)。
    • 模拟输入(Analog Input)

      • 特点:引脚连接到 ADC(模数转换器),无数字输入特性,可接收 模拟信号
      • 适用场景:ADC(模拟传感器、电位器) 输入信号。
  • 输出模式

    • 开漏输出(Open-Drain Output)

      • 特点:只能输出 低电平(0)高阻态(Hi-Z)需要外部上拉电阻才能输出高电平(1)。

      • 适用场景:适用于多个设备共享信号线。

        • I2C 通信(总线仲裁机制需要开漏)。
        • 驱动大电流外设(如 LED、继电器,上拉到 5V 或更高电压)。
    • 推挽式输出(Push-Pull Output)

      • 特点:可以直接输出 高电平(1)或低电平(0),不需要额外的上拉电阻,驱动能力强。

      • 适用场景:

        • 普通数字信号输出(控制 LED、继电器)。
        • 高速信号输出(如 SPI、USART TX)。
  • 复用模式

    • 推挽式复用功能(Alternate Function Push-Pull)

      • 特点 :引脚用于 外设功能(如 USART、SPI、I2C),输出方式为 推挽模式,能提供稳定的高/低电平。
      • 适用场景:USART TX、SPI、PWM 输出
    • 开漏复用功能(Alternate Function Open-Drain)

      • 特点:引脚用于 外设功能,输出方式为 开漏模式,通常需要 外部上拉
      • 适用场景:
        • I2C(SDA、SCL) 需要 开漏 以支持多主机通信。
        • 某些低功耗通信 场景。
模式默认状态是否需要外部电阻主要用途
输入浮空悬空可能需要接受外部信号,无内部上拉/下拉
输入上拉高电平(1)按键检测(低电平触发)
输入下拉低电平(0)按键检测(高电平触发)
模拟输入模拟信号ADC 采样
开漏输出高阻需要上拉电阻I2C 总线、驱动高电压负载
推挽输出0/1直接驱动 LED、继电器等
推挽复用0/1SPI、USART TX、PWM
开漏复用高阻需要上拉电阻I2C(SDA/SCL)

6、GPIO相关寄存器

1. 端口配置低寄存器GPIO[x]_CRL和端口配置高寄存器GPIO[x]_CRH, Config Register High和Config Register Low)

在这里插入图片描述
在这里插入图片描述

  • bit位说明:

    • 每四个bit位决定一个端口的状态
    • 每个寄存器共32bit, 可以决定8个端口的状态
    • 每个端口组需要两个寄存器来配置, 也就是每个端口组都有一个CRLCRH寄存器
    • 寄存器为RW权限
  • 低两位**MODE[y](mode=模式)**决定输入和输出状态, 以及输出速率(速率越高, 功耗越高, 波形越不平滑)

    • 00: 输入
    • 01: 输出10MHz
    • 10: 输出2MHz
    • 11: 输出50MHz
  • 高两位**CNF[y](CNF=config配置)**决定具体模式

    • 输入模式
      • 00: 模拟输入
      • 01: 输入浮空
      • 10: 上拉下拉
      • 11: 保留
    • 输出模式
      • 00: 通用推挽
      • 01: 通用开漏
      • 10: 复用推挽
      • 11: 复用开漏

2. 端口输入数据寄存器(GPIO[x]_IDR)

在这里插入图片描述

  • 说明:
    • 每一个寄存器bit记录了一个端口的输入状态
    • 每个端口组需要最多16个bit, 因此只需要IDR的低16bit就可以了
    • 寄存器为R权限
  • bit值为1说明输入为高
  • bit值为0说明输入为低

3. 端口输出数据寄存器GPIO[x]_ODR, Output Data Register

在这里插入图片描述

  • 同输入类似,RW权限

4. 端口位设置/清除寄存器GPIO[x]_BSRR Bit Set Reset Register

在这里插入图片描述

  • 同样可以实现拉高拉低输出的效果, 但是权限是W
  • 低16bit写入1, 会拉高某个引脚
  • 高16bit写入1, 会拉低某个引脚
  • 写入0, 不会影响其他引脚

5. 端口位清除寄存器GPIO[x]_BRR, Bit Reset Regsiter

在这里插入图片描述

  • BSRR, 权限同样是W, 但是只能拉低
  • 低16bit写入1, 会拉低某个引脚
  • 低16bit写入0, 不起作用
  • 高16bit不起作用

相关术语:

  • Set = 将输出设置为高电平 = 拉高 = 置位 = 置为1 = 输出1 = 使能
  • Reset = 将输出设置为低电平 = 拉低 = 复位 = 置为0 = 输出0 = 禁用

输出相关的寄存器逻辑:

  • 正常来说, ODR可以直接控制某个引脚高低

    // 正确的操作方式, 注意操作符是 |= 和 &=
    GPIOA->ODR |= (1 << 5);  // 拉高 PA5
    GPIOA->ODR &= ~(1 << 5); // 拉低 PA5
    
  • 但是对ODR直接操作, 可能有意无意修改到其他引脚的状态

    GPIOA->ODR = (1 << 5);// 此时PA5被置为1, 但是PA的其他端口被置为0
    
  • STM32于是设置了一个BSRR寄存器, 操作BSRR可以间接控制端口

    GPIOA->BSRR = (1 << 5);// 此时PA5被置为1, 其他端口不受影响
    GPIOA->BSRR = (1 << (5 + 16)); // // 此时PA5被置为0, 其他端口不受影响
    
  • BSRR对于拉高的操作比较方便 , 某组BSRR = (1 << 引脚编号);即可, 但是拉低操作稍显复杂, 需要使用某组BSRR = (1 << (引脚编号 + 16));来操作, 于是又设置了一个BRR, 专门用来简化拉低操作

    GPIOA->BSRR = (1 << 5); // 用BSRR来拉高引脚
    GPIOA->BRR = (1 << 5); // 用BRR拉低引脚
    

6、影子寄存器

BSRRBRR实际都是一种叫做影子寄存器Shadow Register的寄存器类型

影子寄存器在硬件上实际没有真正对应的寄存器, 硬件会自动将对影子寄存器的操作转换为对其他寄存器的操作, 所以大多数影子寄存器写10都不用考虑之后其状态如何, 是否需要复位和置位等, 对影子寄存器的每次操作都是独立的, 不受前后代码影响

影子寄存器通常只能写

相关文章:

  • GMII 接口
  • 泛目录程序,无极泛目录是如何搭建强大站群的?
  • mac部署CAT监控服务
  • 构建可扩展、可靠的网络抓取、监控和自动化应用程序的终极指南
  • Go常用的设计模式
  • C++:动态内存管理(含五大内存分区区分)详解
  • F.binary_cross_entropy与sklearn.metric.log_loss的比较
  • 排序算法(插入,希尔,选择,冒泡,堆,快排,归并)
  • 智慧养老时代:老年人慢性病预防与生活方式优化
  • vscode在使用 alt + tab 切换程序窗口时,输入法总是自动变为中文模式
  • 并查集(Union-Find)数据结构详解
  • Realsense-D400 系列手动曝光控制
  • 【01】噩梦终结flutter配安卓android鸿蒙harmonyOS 以及next调试环境配鸿蒙和ios真机调试环境-flutter项目安卓环境配置
  • 质量工程:数字化转型时代的质量体系重构
  • 分布式锁,rediss,redisson,看门狗,可重入,可重试
  • ArcGIS 10.8.1之后发布栅格数据的MapServer 动态工作空间 替换数据源渲染问题
  • 基于Spring AI开发本地Jenkins MCP Server服务
  • JAVA中synchronized重量级锁加锁和释放锁的机制
  • Golang中间件的原理与实现
  • Linux 配置NFS服务器
  • 中国人保聘任田耕为副总裁,此前为工行浙江省分行行长
  • 习近平在上海考察
  • 柳州警方通报临牌车撞倒行人:扣留涉事车辆,行人无生命危险
  • 上海112位全国劳动模范和先进工作者接受表彰,樊振东榜上有名
  • 第二艘国产大型邮轮实现坞内起浮,重点强化邮轮供应链本土化建设
  • 上海数学教育及数学科普专家陈永明去世,享年85岁