良许Linux教程网 干货合集 一文全面掌握stm32的GPIO知识

一文全面掌握stm32的GPIO知识

1 初学者重要提示

  1. 本文主要介绍STM32H7系列的GPIO相关内容。
  2. 推荐将不使用的引脚设置为模拟模式并悬空。
  3. 在使用高速模式的GPIO时,最好打开IO补偿单元以提高稳定性。

2 GPIO功能简介

STM32H7的GPIO具备以下特性:

  • 输出状态:可以选择开漏或推挽模式,同时支持上拉或下拉电阻。
  • 通过输出数据寄存器GPIOx_ODR或外设(当GPIO设置为复用模式时)输出数据。
  • 可以设置GPIO速度等级。
  • 输入状态:可以设置为浮空、上拉或下拉模式,或模拟模式。
  • 通过输入数据寄存器GPIOx_IDR或外设(当GPIO设置为复用模式时)输入数据。
  • 可以通过寄存器GPIOx_BSRR对GPIOx_ODR进行位操作。
  • 支持通过配置寄存器GPIOx_LCKR实现锁定IO口配置。
  • 每2个时钟周期可以翻转一次IO口状态。
  • 引脚复用功能灵活,允许IO口既充当GPIO口也可以作为功能复用口。

综上所述,STM32H7系列的GPIO具备高度的灵活性和可扩展性,可以满足各种应用的需求。对于初学者来说,学习并掌握GPIO的使用是非常重要的。

3 GPIO功能模式分析(重要)

STM32H7的GPIO端口可以配置为如下的8种模式:

  • 输入浮空
  • 输入上拉
  • 输入下拉
  • 模拟功能
  • 具有上拉或下拉功能的开漏输出
  • 具有上拉或下拉功能的推挽输出
  • 具有上拉或下拉功能的复用功能推挽
  • 具有上拉或下拉功能的复用功能开漏

由于上拉和下拉是可选配置,对应的HAL库配置使用下面6种就可以表示:

  • GPIO_MODE_INPUT 输入模式
  • GPIO_MODE_OUTPUT_PP 推挽输出
  • GPIO_MODE_OUTPUT_OD 开漏输出
  • GPIO_MODE_AF_PP 复用推挽
  • GPIO_MODE_AF_OD 复用开漏
  • GPIO_MODE_ANALOG 模拟模式

3.1 推挽输出

image-20240107202750797
image-20240107202750797

推挽电路是两个参数相同的三极管或 MOSFET,以推挽方式存在于电路中。电路工作时,两只对称的开关管每次只有一个导通,导通损耗小、效率高。输出既可以向负载灌电流,也可以从负载抽取电流。推拉式输出级提高电路的负载能力。相对于开漏输出模式,推挽输出最大优势是输出高电平时,上升时间快,电压驱动能力强。

3.2 开漏输出

image-20240107202754322
image-20240107202754322

开漏端相当于 MOS 管的漏极(三极管的集电极),要得到高电平状态必须外接上拉电阻才行,因此输出高电平的驱动能力完全由外接上拉电阻决定,但是其输出低电平的驱动能力很强。开漏形式的电路有以下几个特点:

  1. 输出高电平时利用外部电路的驱动能力,减少 IC 内部的驱动。
  2. 开漏是用来连接不同电平的器件,匹配电平用的,因为开漏引脚不连接外部的上拉电阻时,只能输出低电平。如果需要同时具备输出高电平的功能,则需要接上拉电阻,很好的一个优点是通过改变上拉电源的电压,便可以改变传输电平。上拉电阻的阻值决定了逻辑电平转换的速度。阻值越大,速度越低,功耗越小。
  3. 开漏输出提供了灵活的输出方式,但是也有其弱点,就是带来上升沿的延时。因为上升沿是通过外接上拉无源电阻对负载充电,所以当电阻选择小时延时就小,但功耗大;反之延时大功耗小。所以如果对延时有要求,则建议用下降沿输出。
  4. 可以将多个开漏输出连接到一条线上。通过一只上拉电阻,在不增加任何器件的情况下,形成“与逻辑”关系,即“线与”。可以简单的理解为:在所有引脚连在一起时,外接一上拉电阻,如果有一个引脚输出为逻辑 0,相当于接地,与之并联的回路“相当于被一根导线短路”,所以外电路逻辑电平便为 0,只有都为高电平时,与的结果才为逻辑 1。

3.3 复用推挽和开漏

复用指的是GPIO切换到CPU内部设备(比如SPI,I2C,UART等电路),也就是GPIO不是作为普通IO使用,是由内部设备直接驱动。推挽和开漏的特征同上。

3.4 四种输入模式

image-20240107202758445
image-20240107202758445

通过上面的引脚结构图可以得到如下三种方式

  • 浮空输入:CPU内部的上拉电阻、下拉电阻均断开的输入模式。
  • 下拉输入:CPU内部的下拉电阻使能、上拉电阻断开的输入模式。
  • 上拉输入:CPU内部的上拉电阻使能、下拉电阻断开的输入模式。

而模拟输入模式是GPIO引脚连接内部ADC。

image-20240107202801975
image-20240107202801975

4 GPIO的拉电流负载和灌电流负载能力

这里先普及点小知识,什么是拉电流负载,什么是灌电流负载。

  • 拉电流负载:一种负载电流从驱动门流向外电路,称为拉电流负载。比如使用STM32H7的GPIO直接驱动LED就是拉电流形式。
image-20240107202806325
image-20240107202806325
  • 灌电流负载:负载电流从外电路流入驱动门,称为灌电流负载。比如下面这种形式的LED驱动电路
image-20240107202810044
image-20240107202810044

有了上面这些知识后再来看STM32H7的IO驱动能力(截图来自STM32H7参考手册):

image-20240107202813020
image-20240107202813020

通过上面的截图可知:STM32H7总的拉电流和灌电流不可超过140mA,单个引脚最大不可超过20mA,这个知识点,大家要知道。

5 IO补偿单元,用于高速

IO补偿单元用于控制I/O通信压摆率(tfall / trise)以此来降低I/O噪声。当前STM32H7的速度等级可以配置为以下四种:

图片
图片
/** @defgroup GPIO_speed_define  GPIO speed define
  * @brief GPIO Output Maximum frequency
  * @{
  */  
#define  GPIO_SPEED_FREQ_LOW         ((uint32_t)0x00000000U)  /*!
#define  GPIO_SPEED_FREQ_MEDIUM      ((uint32_t)0x00000001U)  /*!
#define  GPIO_SPEED_FREQ_HIGH        ((uint32_t)0x00000002U)  /*!
#define  GPIO_SPEED_FREQ_VERY_HIGH   ((uint32_t)0x00000003U)  /*!
图片
图片

使用后两种速度等级的话,最好使能IO补偿单元。

6 GPIO兼容CMOS和TTL电平

CMOS和TTL电平兼容问题也是一个比较重要的知识点

image-20240107202816240
image-20240107202816240

7 不使用的引脚推荐设置为模拟模式

主要从功耗和防干扰考虑。

  • 所有用作带上拉电阻输入的 I/O都会在引脚外部保持为低时产生电流消耗。此电流消耗的值可通过使用的静态特性中给出的上拉 / 下拉电阻值简单算出。
  • 对于输出引脚,还必须考虑任何外部下拉电阻或外部负载以估计电流消耗。
  • 若外部施加了中间电平,则额外的 I/O 电流消耗是因为配置为输入的 I/O。此电流消耗是由用于区分输入值的输入施密特触发器电路导致。除非应用需要此特定配置,否则可通过将这些I/O 配置为模拟模式以避免此供电电流消耗。ADC 输入引脚应配置为模拟输入就是这种情况。
  • 任何浮空的输入引脚都可能由于外部电磁噪声,成为中间电平或意外切换。为防止浮空引脚相关的电流消耗,它们必须配置为模拟模式,或内部强制为确定的数字值。这可通过使用上拉 / 下拉电阻或将引脚配置为输出模式做到。

综上考虑,不使用的引脚设置为模拟模式,悬空即可。

以上就是良许教程网为各位朋友分享的Linu系统相关内容。想要了解更多Linux相关知识记得关注公众号“良许Linux”,或扫描下方二维码进行关注,更多干货等着你 !

137e00002230ad9f26e78-265x300
本文由 良许Linux教程网 发布,可自由转载、引用,但需署名作者且注明文章出处。如转载至微信公众号,请在文末添加作者公众号二维码。
良许

作者: 良许

良许,世界500强企业Linux开发工程师,公众号【良许Linux】的作者,全网拥有超30W粉丝。个人标签:创业者,CSDN学院讲师,副业达人,流量玩家,摄影爱好者。
上一篇
下一篇

发表评论

联系我们

联系我们

公众号:良许Linux

在线咨询: QQ交谈

邮箱: yychuyu@163.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

关注微博
返回顶部