你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

基于stm32的GPIO经验分享

[复制链接]
攻城狮Melo 发布时间:2023-4-2 14:56
1 初学者重要提示
  •   本文主要是以stm32H7系列为主。
  •   对于不使用的引脚,推荐设置为模拟模式,悬空即可。
  •   GPIO的速度等级高的时候,最好使能IO补偿单元。
    % C" D% T7 f% l
    " n6 P- q1 M; \+ ?) g& \
2 GPIO功能简介
STM32H7的GPIO特性如下:
  •   输出状态:开漏/推挽 + 上拉/下拉电阻。
  •   通过输出数据寄存器(GPIOx_ODR)或者外设(GPIO设置为复用模式时)输出数据。
  •   GPIO速度等级设置。
  •   输入状态:浮空,上拉/下拉,模拟。
  •   通过输入数据寄存器(GPIOx_IDR)或者外设(GPIO设置为复用模式)输入数据。
  •   通过寄存器GPIOx_BSRR实现对寄存器GPIOx_ODR的位操作。
  •   通过配置寄存器GPIOx_LCKR的锁机制,实现冻结IO口配置。
  •   每两个时钟周期就可以翻转一次IO。
  •   高度灵活的引脚复用功能,允许IO引脚既可以做GPIO也可以做功能复用。
    : H$ j9 G0 n2 H: q% p1 ]' l1 o9 Q

3 ?6 O2 B9 l% f  W* K) l
3 GPIO功能模式分析(重要)
STM32H7的GPIO端口可以配置为如下的8种模式:
  •   输入浮空
  •   输入上拉
  •   输入下拉
  •   模拟功能
  •   具有上拉或下拉功能的开漏输出
  •   具有上拉或下拉功能的推挽输出
  •   具有上拉或下拉功能的复用功能推挽
  •   具有上拉或下拉功能的复用功能开漏

    + \; C5 M0 U. M" g% v. q
由于上拉和下拉是可选配置,对应的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 P1 H0 O2 ?3 h- _5 ~

2 Y  q/ h( ^9 X
3.1 推挽输出
9 i4 `, w6 f2 J# z3 {9 Z4 G
微信图片_20230402145608.png

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

  i3 I2 o8 X& ]. G1 B$ [" a2 Q
3.2 开漏输出
( n& r. ^0 i# _0 q+ U5 P
微信图片_20230402145600.png
/ c2 |' k. B4 ^
开漏端相当于 MOS 管的漏极(三极管的集电极),要得到高电平状态必须外接上拉电阻才行,因此输出高电平的驱动能力完全由外接上拉电阻决定,但是其输出低电平的驱动能力很强。开漏形式的电路有以下几个特点:
  • 输出高电平时利用外部电路的驱动能力,减少 IC 内部的驱动。
  • 开漏是用来连接不同电平的器件,匹配电平用的,因为开漏引脚不连接外部的上拉电阻时,只能输出低电平。如果需要同时具备输出高电平的功能,则需要接上拉电阻,很好的一个优点是通过改变上拉电源的电压,便可以改变传输电平。上拉电阻的阻值决定了逻辑电平转换的速度。阻值越大,速度越低,功耗越小。
  • 开漏输出提供了灵活的输出方式,但是也有其弱点,就是带来上升沿的延时。因为上升沿是通过外接上拉无源电阻对负载充电,所以当电阻选择小时延时就小,但功耗大;反之延时大功耗小。所以如果对延时有要求,则建议用下降沿输出。
  • 可以将多个开漏输出连接到一条线上。通过一只上拉电阻,在不增加任何器件的情况下,形成“与逻辑”关系,即“线与”。可以简单的理解为:在所有引脚连在一起时,外接一上拉电阻,如果有一个引脚输出为逻辑 0,相当于接地,与之并联的回路“相当于被一根导线短路”,所以外电路逻辑电平便为 0,只有都为高电平时,与的结果才为逻辑 1。

    , r- Y/ v+ n8 ~) |+ }

, E4 A# X4 E* W& i+ M0 ?
3.3 复用推挽和开漏
复用指的是GPIO切换到CPU内部设备(比如SPI,I2C,UART等电路),也就是GPIO不是作为普通IO使用,是由内部设备直接驱动。推挽和开漏的特征同上。

9 F! Z3 ~" E  f! B  u- j: a, A9 v
3.4 四种输入模式
" s# s2 x5 `8 ]! s. V
微信图片_20230402145549.png

- n9 e% E, Q: C+ r% `
通过上面的引脚结构图可以得到如下三种方式
  •   浮空输入:CPU内部的上拉电阻、下拉电阻均断开的输入模式。
  •   下拉输入:CPU内部的下拉电阻使能、上拉电阻断开的输入模式。
  •   上拉输入:CPU内部的上拉电阻使能、下拉电阻断开的输入模式。

    $ J5 s/ L6 G! a2 j. [4 g
而模拟输入模式是GPIO引脚连接内部ADC。
" b' R' g# v6 U/ n0 T/ l
微信图片_20230402145543.png
" K% W% D( z3 z) O8 i* ~# K$ F
0 n! d- p* V2 G* p; d& B9 G
4 GPIO的拉电流负载和灌电流负载能力
这里先普及点小知识,什么是拉电流负载,什么是灌电流负载。
  •   拉电流负载:一种负载电流从驱动门流向外电路,称为拉电流负载。比如使用STM32H7的GPIO直接驱动LED就是拉电流形式。

    + N( M9 B% P: W/ y& V
微信图片_20230402145535.png
" a& ^# h7 C6 W4 J3 B' |
  •   灌电流负载:负载电流从外电路流入驱动门,称为灌电流负载。比如下面这种形式的LED驱动电路
    - x0 H5 j+ `; M, k# {" ~0 Y+ |: w# h) z
微信图片_20230402145508.png

8 q. ?2 ~2 m2 r( i. O% G9 n
有了上面这些知识后再来看STM32H7的IO驱动能力(截图来自STM32H7参考手册):

& c/ K' }/ P5 ^1 A0 B
微信图片_20230402145501.png

. o  C* b1 a! X  E7 [
通过上面的截图可知:STM32H7总的拉电流和灌电流不可超过140mA,单个引脚最大不可超过20mA,这个知识点,大家要知道。
$ @9 s" U5 `4 l
5 IO补偿单元,用于高速
IO补偿单元用于控制I/O通信压摆率(tfall / trise)以此来降低I/O噪声。当前STM32H7的速度等级可以配置为以下四种:
  1. /** @defgroup GPIO_speed_define  GPIO speed define
    0 v& G8 `9 Z# a* I& f$ b
  2.   * @brief GPIO Output Maximum frequency* q2 N7 n1 T9 F5 e
  3.   * @{/ S- g* O1 u, o  m
  4.   */  6 F" U7 I6 z- r% C1 J3 y
  5. #define  GPIO_SPEED_FREQ_LOW         ((uint32_t)0x00000000U)  /*!< Low speed     */+ ^+ Z& t9 _+ _+ R
  6. #define  GPIO_SPEED_FREQ_MEDIUM      ((uint32_t)0x00000001U)  /*!< Medium speed  */
    + e$ P# B# |. z) z/ \9 K" J, @$ t
  7. #define  GPIO_SPEED_FREQ_HIGH        ((uint32_t)0x00000002U)  /*!< Fast speed    */3 E. Q4 s$ ?3 A
  8. #define  GPIO_SPEED_FREQ_VERY_HIGH   ((uint32_t)0x00000003U)  /
复制代码
6 M9 A0 v- {! \$ q7 p
使用后两种速度等级的话,最好使能IO补偿单元。

$ i6 u% R8 T) J3 h2 g" b
6 GPIO兼容CMOS和TTL电平
CMOS和TTL电平兼容问题也是一个比较重要的知识点
5 W5 A& a, ^2 j, Z1 ~
微信图片_20230402145454.png
: y  |0 U8 Y& O
7 不使用的引脚推荐设置为模拟模式
主要从功耗和防干扰考虑。
  •   所有用作带上拉电阻输入的 I/O都会在引脚外部保持为低时产生电流消耗。此电流消耗的值可通过使用的静态特性中给出的上拉 / 下拉电阻值简单算出。
  •   对于输出引脚,还必须考虑任何外部下拉电阻或外部负载以估计电流消耗。
  •   若外部施加了中间电平,则额外的 I/O 电流消耗是因为配置为输入的 I/O。此电流消耗是由用于区分输入值的输入施密特触发器电路导致。除非应用需要此特定配置,否则可通过将这些I/O 配置为模拟模式以避免此供电电流消耗。ADC 输入引脚应配置为模拟输入就是这种情况。
  •   任何浮空的输入引脚都可能由于外部电磁噪声,成为中间电平或意外切换。为防止浮空引脚相关的电流消耗,它们必须配置为模拟模式,或内部强制为确定的数字值。这可通过使用上拉 / 下拉电阻或将引脚配置为输出模式做到。

    # r$ C, S/ G" ]
综上考虑,不使用的引脚设置为模拟模式,悬空即可。
; d1 `# O# g! H% P2 c
转载自:硬件攻城狮
如有侵权请联系删除
& Y: I+ @) H$ r# l0 R; r4 b

, z* X9 V. t; P3 j7 c/ g
赞 收藏 评论0 发布时间:2023-4-2 14:56

举报

0个回答

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版