|
1 初学者重要提示2 GPIO功能简介 STM32H7的GPIO特性如下: 输出状态:开漏/推挽 + 上拉/下拉电阻。 通过输出数据寄存器(GPIOx_ODR)或者外设(GPIO设置为复用模式时)输出数据。 GPIO速度等级设置。 输入状态:浮空,上拉/下拉,模拟。 通过输入数据寄存器(GPIOx_IDR)或者外设(GPIO设置为复用模式)输入数据。 通过寄存器GPIOx_BSRR实现对寄存器GPIOx_ODR的位操作。 通过配置寄存器GPIOx_LCKR的锁机制,实现冻结IO口配置。 每两个时钟周期就可以翻转一次IO。 高度灵活的引脚复用功能,允许IO引脚既可以做GPIO也可以做功能复用。 ' M% [4 U! r9 B' _5 F
. J7 D2 P& `0 H; C3 y4 _, s: O2 I
3 GPIO功能模式分析(重要)STM32H7的GPIO端口可以配置为如下的8种模式: 输入浮空 输入上拉 输入下拉 模拟功能 具有上拉或下拉功能的开漏输出 具有上拉或下拉功能的推挽输出 具有上拉或下拉功能的复用功能推挽 具有上拉或下拉功能的复用功能开漏
7 t6 S) i' v ?: R* a
由于上拉和下拉是可选配置,对应的HAL库配置使用下面6种就可以表示: GPIO_MODE_INPUT 输入模式 GPIO_MODE_OUTPUT_PP 推挽输出 GPIO_MODE_OUTPUT_OD 开漏输出 GPIO_MODE_AF_PP 复用推挽 GPIO_MODE_AF_OD 复用开漏 GPIO_MODE_ANALOG 模拟模式
5 h+ C+ S, x# p! E9 L( U- t
/ q$ u9 [4 |* c8 `$ J; n, ~6 X5 Q* T3.1 推挽输出
, l1 H' N9 Q1 a, i$ Z$ K9 S. J' ~7 w: R
推挽电路是两个参数相同的三极管或 MOSFET,以推挽方式存在于电路中。电路工作时,两只对称的开关管每次只有一个导通,导通损耗小、效率高。输出既可以向负载灌电流,也可以从负载抽取电流。推拉式输出级提高电路的负载能力。相对于开漏输出模式,推挽输出最大优势是输出高电平时,上升时间快,电压驱动能力强。
4 H; c9 ~2 L( }1 i3.2 开漏输出, R+ \# A+ K$ a0 G' F- U
9 e8 S) o0 T; |1 _" _
开漏端相当于 MOS 管的漏极(三极管的集电极),要得到高电平状态必须外接上拉电阻才行,因此输出高电平的驱动能力完全由外接上拉电阻决定,但是其输出低电平的驱动能力很强。开漏形式的电路有以下几个特点: 输出高电平时利用外部电路的驱动能力,减少 IC 内部的驱动。 开漏是用来连接不同电平的器件,匹配电平用的,因为开漏引脚不连接外部的上拉电阻时,只能输出低电平。如果需要同时具备输出高电平的功能,则需要接上拉电阻,很好的一个优点是通过改变上拉电源的电压,便可以改变传输电平。上拉电阻的阻值决定了逻辑电平转换的速度。阻值越大,速度越低,功耗越小。 开漏输出提供了灵活的输出方式,但是也有其弱点,就是带来上升沿的延时。因为上升沿是通过外接上拉无源电阻对负载充电,所以当电阻选择小时延时就小,但功耗大;反之延时大功耗小。所以如果对延时有要求,则建议用下降沿输出。 可以将多个开漏输出连接到一条线上。通过一只上拉电阻,在不增加任何器件的情况下,形成“与逻辑”关系,即“线与”。可以简单的理解为:在所有引脚连在一起时,外接一上拉电阻,如果有一个引脚输出为逻辑 0,相当于接地,与之并联的回路“相当于被一根导线短路”,所以外电路逻辑电平便为 0,只有都为高电平时,与的结果才为逻辑 1。
* z: h8 \4 U1 n' o
; m% L' a% k- _3.3 复用推挽和开漏复用指的是GPIO切换到CPU内部设备(比如SPI,I2C,UART等电路),也就是GPIO不是作为普通IO使用,是由内部设备直接驱动。推挽和开漏的特征同上。 ( f* q# m- w, j- K* @ }
3.4 四种输入模式
! l' Y8 M- U4 F5 i- T# y5 B* R. q
* r7 Y! Z3 m1 {通过上面的引脚结构图可以得到如下三种方式 浮空输入:CPU内部的上拉电阻、下拉电阻均断开的输入模式。 下拉输入:CPU内部的下拉电阻使能、上拉电阻断开的输入模式。 上拉输入:CPU内部的上拉电阻使能、下拉电阻断开的输入模式。 ) h2 u: D9 J0 |" W
而模拟输入模式是GPIO引脚连接内部ADC。 9 y& f; O4 u( }5 I/ ?
2 t, [ P2 P: K, B3 R3 s
; @: P: y' \+ \- @) ^9 r2 J6 Y8 j4 GPIO的拉电流负载和灌电流负载能力这里先普及点小知识,什么是拉电流负载,什么是灌电流负载。
4 w$ C: }, _4 B# J! U; B: Y) S
4 d e" w8 W) b有了上面这些知识后再来看STM32H7的IO驱动能力(截图来自STM32H7参考手册): , d ^ r9 e& w& t6 y O( n) ^
& J8 I C% E8 }" T F6 `
通过上面的截图可知:STM32H7总的拉电流和灌电流不可超过140mA,单个引脚最大不可超过20mA,这个知识点,大家要知道。
" x2 {# u8 t: z1 b% Z2 A P7 w; B 5 IO补偿单元,用于高速IO补偿单元用于控制I/O通信压摆率(tfall / trise)以此来降低I/O噪声。当前STM32H7的速度等级可以配置为以下四种: - /** @defgroup GPIO_speed_define GPIO speed define
, Y. S; c& L7 S+ ?3 h, R - * @brief GPIO Output Maximum frequency2 S! _# _) F H/ X3 G1 R
- * @{
Y: o# J6 y4 r: N) { - */
7 [$ ~/ V7 Y7 f0 D; l% o4 q5 |) j - #define GPIO_SPEED_FREQ_LOW ((uint32_t)0x00000000U) /*!< Low speed */- m4 W" M: c# ]
- #define GPIO_SPEED_FREQ_MEDIUM ((uint32_t)0x00000001U) /*!< Medium speed *// G, H' }! Q/ D7 W9 m8 Q
- #define GPIO_SPEED_FREQ_HIGH ((uint32_t)0x00000002U) /*!< Fast speed */
- R+ B* R# `' L1 k - #define GPIO_SPEED_FREQ_VERY_HIGH ((uint32_t)0x00000003U) /
复制代码 ' b! Y9 c# G2 Z6 a; r2 S7 v- \; c
使用后两种速度等级的话,最好使能IO补偿单元。
4 J+ t7 H& f; M/ ~( X+ s; q6 GPIO兼容CMOS和TTL电平CMOS和TTL电平兼容问题也是一个比较重要的知识点 ; t4 G) |2 F& p4 e, U+ |7 O/ d
; _5 X8 }/ D. v0 D" g7 不使用的引脚推荐设置为模拟模式主要从功耗和防干扰考虑。 所有用作带上拉电阻输入的 I/O都会在引脚外部保持为低时产生电流消耗。此电流消耗的值可通过使用的静态特性中给出的上拉 / 下拉电阻值简单算出。 对于输出引脚,还必须考虑任何外部下拉电阻或外部负载以估计电流消耗。 若外部施加了中间电平,则额外的 I/O 电流消耗是因为配置为输入的 I/O。此电流消耗是由用于区分输入值的输入施密特触发器电路导致。除非应用需要此特定配置,否则可通过将这些I/O 配置为模拟模式以避免此供电电流消耗。ADC 输入引脚应配置为模拟输入就是这种情况。 任何浮空的输入引脚都可能由于外部电磁噪声,成为中间电平或意外切换。为防止浮空引脚相关的电流消耗,它们必须配置为模拟模式,或内部强制为确定的数字值。这可通过使用上拉 / 下拉电阻或将引脚配置为输出模式做到。 $ |* U) V1 m' H+ l- l# w( _
综上考虑,不使用的引脚设置为模拟模式,悬空即可。 4 H8 L7 X. a$ a5 T9 W; B
转载自:硬件攻城狮 如有侵权请联系删除& j. B" ?+ u( ~$ f# D w
! G; {- `- K# K6 E: Q3 |* R
|