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

【经验分享】STM32G4外设之GPIO

[复制链接]
STMCU小助手 发布时间:2022-7-6 14:00
一、GPIO介绍
- S+ `, _" T4 @1 z6 V. mGPIO:General Purpose Input Output通用用途输入输出
$ j3 p+ D* x# S! a# C$ L* [4 [& }
+ D- L4 X8 j$ m5 h: `核心功能:输入、输出和高级外设的复用功能
5 t( a# ~; g" P% g" a4 |3 @/ _4 T0 m& E* d! @. b% G) U
COH($)Q0~L%`6%UJNEMINKA.png - j2 G8 u! [' Y7 _( g5 p
; `8 l0 O, y) ^0 l& k0 m/ p! [+ R
注:使用时一定要配置好各引脚是用作普通I/O(输出0和1)还是用作复用功能
  n2 k2 o4 t1 i3 N1 C. d. L
% ~2 R  |" Q% F/ W: H! c5 B) sSTM32G431数据手册:查看STM32G4引脚复用功能* a! |  c& ~. b. B4 j6 r4 _+ _
})PW4(YGEVR52A0R)YT%N]D.png
* u+ M" h9 e* W0 K8 E/ W2 P7 {
( T/ m' B4 N# }' W* K* N查看对应引脚对应的复用功能:; z1 ]/ _1 h. o4 Z
, ^$ k3 Q: R# }0 p8 y% q$ j

0 }8 B% W+ p8 M" H: |
: y" p! v# D6 f封装LQFP64 前5行 “ - ” 表示 “ 无 ” ,第1引脚从第6行开始7 Y7 ~& q$ M/ c  P3 n

$ {: ?$ r# |( @: U! h8 Z既然有多种复用功能选择,如何指定一种相应的复用功能?
0 D% e+ U  _+ a4 y) A% D==控制复用功能的选择某个引脚选择第二个功能: ==9 j* S1 q+ G  q8 _; M/ i

1 d' q: h- m+ P% k+ u) x FFY7}QFZVAXPZNVP7W9]2{H.png 6 }  M% F0 x( H  L/ ~, }% o  J/ Y

! y# q* V! {6 e& v! N将某一个引脚设置为一种复用功能可根据上图来看,每一行对应着不同的复用功能,将对应引脚设置为AFX对应功能所在列(将PA9设置为串口功能,只要将PA9设置为AF7即可),这里就要用使用到复用功能寄存器/ h7 d; `0 b, L
( X8 Q: m$ l0 c! B; [. }
STM32G4系列控制器参考手册:7 T5 o' g/ N, v2 m& _# c( S
: o. N; n: U- q$ I- Q
WG69[IU36M$_PVVNNCJPK3D.png 6 ^9 Y9 w- B, ]" c2 I, B# P! m/ f/ o
- M, k6 e; y% H
[]]L38A65666RW4`TGT$`SO.png 4 }  s5 o, u3 j, ~7 Z

4 I; P/ d  G6 y( V2 P; [& w这个是低位寄存器对应PA0-PA7, 还有一个高位寄存器对应PA8-PA15
0 Y  R, f. [* D. ~7 W9 @" m; |; H- {' z! \
XYAV{6THSI0L4$@@@46C1OF.png
: G" W) z# W# H* |2 |0 N/ t$ Y- }  [
所以,将PAx引脚设置为AFx引脚只需要像AFRL/AFRH寄存器写入相应的值
$ s5 K6 q( y2 K; f. T. J+ K. X/ \0 W( Q/ [/ o
将PA9设置为串口功能,只需要将GPIO A_AFRH 写入0111( PA9 对应 GPIO A_AFRH 中的 AFSEL9[3:0] )
3 {, T6 q  o( H( m- n+ S5 s* W: @; C: G4 q4 }9 [% ?7 ?. M5 Z
二、GPIO的基本结构
/ o* b: m( ^7 d$ {$ |1.IO口内部电路结构

/ H1 i1 w' ?2 r( G
' t5 p% x4 @# t* X; [3 U 3$%GSR6U)4LTCQBP_B0OZNH.png 4 {$ A* {+ p9 k0 L
0 X/ E& k4 k4 R, |+ J, j& u# L* y
I/O口的基本结构可分为上下两部分,下半部分为输出驱动器 ,上半部分为输入驱动器
+ t. I2 i# n/ C4 L: ]
! M/ u% F1 s7 Z$ x2 ?8 L2.IO输入输出
, W- {/ F) A* `$ }& i+ O$ I1.普通IO输出8 W- U8 b" a4 f  i" U% n( {; [2 o9 o
, g" o5 T) I- e
X@$S%B$OORXAQ@NCL9NAOCB.png
$ ?1 F1 L" ]4 [7 r0 @. M5 d1 ^: M* G7 u, X# G% I" v- K
(1)通过置位/复位寄存器和 输出数据寄存器的共同作用输出0或1
# H6 q( q% p5 P. ]$ E
9 l6 {* N* b' k(2)在选择器处选择普通I/O输出( 或复用功能输出)
( a3 Q+ z+ }, Y: u- c
1 @5 m3 }: P4 w- L. V* w9 g(3)通过反相器将前面输出的0或1转换为1或0
, {$ F( V) ~) d, x( s; O. v* A7 Q! W# F+ S+ v% _6 k3 q
(4)通过P-MOS管和N-MOS管两个MOS管决定输出逻辑0还是逻辑1! C' i( c4 ]6 I+ [) S/ E
7 x$ w( a5 y( M
P-MOS管 为低电平导通,导通后输出逻辑1: M7 I$ F1 u( N% d0 m
N-MOS管 为高电平导通,导通后输出逻辑0
! {$ b7 p5 r8 P; X/ _: Q. \1 v6 H8 _/ o8 X3 p
2.复用功能功能输出# v' M, @8 H5 @! W

: h0 e; Y, u" w9 P K}{LG8(RUG)$NGB3QTVON(8.png 6 [! n* {4 N6 ?  p

$ v  R6 v6 s' T与普通IO输出相比,选择器选择复用功能输出
' R/ A2 p7 t- ?: e' h  N$ w8 F) m& A, j* l/ p. X. {  D: ?8 ?
3.普通IO输入
  T7 R- F& [! }: i9 K5 |* f: _输入为低电平0时,上下拉电阻处于关闭状态,施密特触发器为打开状态+ q; u5 u) h( k/ V$ _$ F
$ m# H1 Z  x8 I
@$Q@N{~OP~Q1F@EM{(NGXVM.png 2 ~6 f1 f) A! ]0 u7 F2 R6 V+ z' I

  W7 D$ f7 p& J) H2 C# q4 e. X  r; t2 t但是,若输入为高电平时要考虑输入电压的大小,如果电压过大必须进行稳压,否则会烧坏电路,这就是包含二极管的作用
. g' K! C" c$ b3 `% p( f. V+ O& T1 J) o5 i
(1)输入的高电平为3.3V:能够直接通过I/O引脚进入内部电路
, M' ~: V8 s0 k
3 F6 ], z2 Y, j  G+ q(2)输入的高电平为5V: 要用到 5V容错I/O端口 其中 VDD_FT(3.3V)
5 o' S$ T- e- P/ Y" M当输入为+5V​时,上面的二极管导通,连接 VDD_FT(3.3V),将输入的5V​稳压到3.3V​,从而保护了电路
7 y  V8 b0 F& X% w
/ m$ O+ o$ Z' V3 [, C8 ?& y2 h P@ZRXCS4)B4@ZM`7WJORM02.png * ~6 G( J  U0 f

9 _1 J7 `, v; Q" d(3)当输入为-5V​时(和5V方向相反),下面二极管导通,连接VSS(0V),将输入的-5V​稳压到0V​,从而保护电路
# E, W" N* a0 v' R' n& R- D
. U% [+ P4 @& w- a$ m )97MCXMPI9VFCKEZHAKI9(G.png
# V+ b' f( C, ]- @* ?( {2 a: q; C$ v1 ?" ?- B. P# z
上下拉电阻
* J# x# O. Q4 D+ \+ c* z5 ~/ {当某个引脚处于悬空时,其输入电平不能确定,既不是高电平也不是低电平$ R9 n' h, x# e9 ^9 m: A8 T0 r1 c
/ `/ u; p4 K* v" F. ?* R
上拉下拉电阻用于处理IO口不确定的电平状态,强制性的将电平拉上或拉下' w( }+ ]# ~4 E3 i
2 ~0 T6 F% S3 v' K% c
注:当输入为确定的高电平或低电平时,上拉下拉电阻将不起作用  v9 \/ `; x  e1 U8 i6 v
" S; Q3 U# Q/ _7 o2 f
上拉和下拉都各有一个开关,当输入电平不确定时且上拉或下拉开关闭合时,不确定的电平就被强制性的转换为高电平(上拉开关闭合)或低电平(下拉开关闭合)
- K  n1 c2 Z4 [% P3 J3 @
# J  Q) `9 a, Q+ Y, M) K8 l& I上拉电阻:将上拉开关闭合,输入的不确定电平被强制上拉为高电平0 W: _* w) l1 Z  M) y

! [* j  U: D0 x
; o  _1 f6 R6 O: r# f. A" b* [' l* N1 S
下拉电阻:将下拉开关闭合,输入的不确定电平被强制下拉为低电平
6 v! k3 j  |2 u2 C7 p" i
8 g, z- x, ]; I4 d  s# Z, l YOQUVW0S]8MH49B{)$CZ``B.png 7 V% e& V6 z9 }4 `- s6 C' v* Z
, A+ \5 g3 U8 b* v5 q$ W
小结:( _& `' {: q  d! o# t! S
; ^6 x; i; Z! x2 G2 d! X
2$$OR)67$L1ZFHEVQHO_UJO.png * R  X: y2 n) P5 c7 ^* V5 J6 K  N

) o/ X4 \) O0 B  ~三、GPIO工作模式
& X7 s$ N) Q7 H; ~* P, O4 `! p( h  R为实现不同的工作要求,GPIO有8种工作模式。每个I/O口可以自由编程,但I/O寄存器必须按32位字被访问。2 m9 P# F( d" }- S

8 a: m, b1 z, y/ ] 8%~B~J2{6Y98XLX~Q3[B`{E.png
/ G6 H! V/ f0 N, t1 }% S9 ?+ Q: B: s0 r6 B
1.浮空输入
! N8 }- J3 m4 C/ d浮空输入:复位上电的时,引脚不确定电平的高低(既不接电源,也不接地
2 U9 k* s3 \7 r1 q3 r$ ]$ _9 v# O) d0 j  S2 c% N

& a5 K" c' B" X: U- ~( {5 a. v+ p9 y
(1)外部通过IO口输入电平(上下拉电阻处于关闭状态)+ V0 @  G1 l2 p: Y  U1 ~7 H

. k- y$ r$ E5 F0 s) P9 e(2)传输到施密特触发器(此时施密特触发器为打开状态)" J0 j' Z& l8 u7 |

( S: ], c7 W' U9 x) L: Z(3)继续传输到输入数据寄存器IDR
" Z+ v4 P# ]: Y
- _6 p" T9 H- A# k2 P1 o(4)CPU通过读输入数据寄存器IDR实现读取外部输入电平值7 V' ~( n8 b7 b7 v/ }) B) f- y  h

' m; p5 t! T" x/ o9 h; o' D( h2.输入上拉模式
( P1 V' z& U: n& D7 v7 X输入上拉模式:与输入浮空模式相比较,不同之处在于内部有一个上拉电阻连接到 VDD(输入上拉模式下,上拉电阻开关接通,阻值约 30-50K)) M3 m4 N  t: t; ]
9 d1 s, L+ L9 d/ a7 W. X' g. g% a
HZ)I56NI_[O9XG(9JKVW20G.png
7 k! M! A) \; ~" s5 z
( k: o/ y( `1 p9 q' ~+ ?外部输入通过上拉电阻,施密特触发器存入输入数据寄存器 IDR,被 CPU 读取,当输入管脚悬空时不受外部噪声信号干扰。6 d. [" O3 ~2 k$ Y
9 d! K- e' Q+ V6 L) J( `- g" T
无论输入管脚悬空或者被高电平驱动时,读取的都是1. 只有在输入端为0的时,读取到的值才是0。因此采取的是非0输入模式。即若读取非0,即为1,若读取为0,即为0。强制上拉,一般是为了输入强高电平$ E  E, S8 f& |4 ?6 `2 F& u! O
0 n* Z9 y; V# j! o2 K; d
3.输入下拉模式
" Y& e8 Y9 `8 G; R" q% Y, Y+ K输入下拉模式: 与输入浮空模式相比较,不同之处在于内部有一个下拉电阻连接到 VSS(输入下拉模式下,下拉电阻开关接通,阻值约 30-50K)
9 \* [8 e3 `3 Z) R9 N. I0 h) m& J
: B0 u/ Q) G5 w3 d  P1 } _M(P9B}M9E%HZM2C@Z]$AII.png # R& V( A4 j6 y) z# B
' T, V* L. V: d8 t, O  Y. z" }
外部输入通过下拉电阻,施密特触发器存入输入数据寄存器 IDR,被 CPU 读取,强制下拉,一般是为了输入强低电平
* Y2 v7 z8 w+ H# M( d
/ S& @1 w1 ]6 q9 }) U4.模拟输入模式1 I3 c9 _5 |3 K/ _2 m

; b/ C- ?: b, p0 I/ s& ] P}YCDKRYGE2PANM~(V[0EDR.png 8 \* Q# L( T6 y" n
上拉和下拉部分均为关闭状态,施密特触发器为截止状态,通过模拟输入通道输入到 CPU,IO 口外部电压为模拟量(电压形式非电平形式), 作为模拟输入范围一般为 0~3.3V5 j, p" {7 Y- ?0 S" G- [0 O

9 o5 c+ D, w, W9 V- u+ g将IO口作为模拟输入接口,输入的可能是变化的值,接收外部的模拟信号输入5 t- k9 D# f- i- j/ w2 P$ k

, v2 n1 T  I6 W& D3 @5.开漏输出模式9 h" D& z$ k0 W7 ^  l& h! [
开漏输出即三极管的集电极或者MOS管的漏极进行输出
+ D* C9 N9 M5 u) o0 ~1 A+ w
. @/ R# P, ^9 @开漏输出可以实现线与功能。开漏输出只能输出强低电平,高电平需要依靠外部上拉电子拉高,适合做电流型驱动,吸收电流能力较强" z/ F" W  v! y) g* C- Y. }; J

- p- j6 L6 Z$ ]注: 在输出模式下TTL施密特触发器为开启状态,所以输出模式下仍存在输入
+ S+ m% D! r7 V. m1 O0 W, p  ?1 O6 R* F! Q" W. D+ d) z
1TR45RR1)%@~ORX`09ASU4R.png
9 r. i  r1 k  |+ b& N; K
- B$ c: ^% S" K7 [3 A/ H. \, i(1)CPU写入位设置/清除寄存器BSRR,映射到输出数据寄存器ODR" \9 Y$ C! y8 p/ M% d

4 x& X  U$ n) ~0 n(2)联通到输出控制电路(也就是ODR的电平)
0 D) W- t, w3 z1 v6 `
, A0 f. U8 a% l  {7 |9 b( V9 G(3)ODR电平通过输出控制电路进入N-MOS管+ H6 U% {- d7 D6 g0 l, ~
: z( l9 G; I0 k0 H0 B' e, r
开漏不使用 P-MOS(输出1) ,故输出不为 “0” 或 “1”,而是 “0” 或 “浮空”
, i& B7 @& Q, j. M( S  b& F2 E, ]: j6 H# q$ X  T+ O
(1)写0传输到MOS管处,N-MOS 导通,输出为0
9 u: h1 {" B! f) Z7 P(2)写1传输到MOS管处,P-MOS 和 N-MOS 都不导通,输出浮空7 M+ p  y$ D9 N. f' |

7 Q9 @: I8 ]( {5 @  D; R2 H& {(1)ODR输出0:  t" r; z; e; E& m6 n
N-MOS截止,IO端口电平不会由ODR输出决定,而由外部上拉/下拉决定
' Z: H8 [' Z" m4 |; f, x; n3 \( y8 M0 \) C; K# U
在输出状态下,输出的电平可以被读取,数据存入输入数据寄存器,由CPU读取,实现CPU读取输出电平
' @! |& {, A( h& s
2 C! ~" ^) x' @( Q  I3 U3 g所以,当N-MOS截止时,如果读取到输出电平为1,不一定是我们输出的1,有可能是外部上拉产生的1
, k. h6 D( e5 c; A
3 S$ z) y. ]' h& s' a(2)ODR输出1:
7 Y( o# K  s0 L! v- q5 ^& c0 q, lN-MOS开启,IO端口电平被N-MOS管拉倒VSS,使IO输出低电平。此时输出的低电平同样可以被CPU读取到4 Q4 p; X4 O/ b. P- u
- A* \: L. q7 [+ R  h' p' W6 P/ c2 s
开漏输出为不确定状态,不具有驱动能力
" n6 R% `  p5 B8 a1 C- n
5 v( ?  w$ m: D7 B3 N6.推挽输出模式
7 `) M6 ]( S6 C& s4 Q; E8 P
推挽输出使用 P-MOS和N-MOS ,输出为0或1
- F9 {! M! l' _9 L# Z# F5 `1 i/ ^0 T6 l: O3 Z+ V
YC9V7@3~P~A)B}%9R3(AB}N.png $ n3 [3 F6 k! b7 i& o& Y

3 `' Q6 S0 `3 C4 T. \推挽输出可以采取强高/强低输出,可以连接数字电路
) s* j9 h$ |& Q: G9 G$ {& [0 C: |  Q* [6 z+ `' F
7.推挽复用输出模式
, X8 V: p) Z1 F7 z( X) t% N8 M) q
- s7 Q! `$ T& n, Q* p7 x- P LELCOLXI2`S)TGG_FGM1902.png 8 s/ x3 ^" B, J% D6 ]9 ?
与推挽输出模式唯一的区别在于输出控制电路之前电平的来源
! \+ ~* K, Q  P7 ?# A* u* ]推挽输出模式的输出电平是由CPU写入输出数据寄存器控制的,推挽复用输出模式的输出电平是由复用功能外设输出决定的! T% G1 V+ I. d! J( P

4 \  _# _6 ^" A& `0 ~! ~, {  S8.开漏复用输出模式
. n1 m2 ^8 |4 c, [4 z1 W

  e! ]; K" q9 [/ ~1 u V236_PO}@JP$B[WVSSQ5EVM.png
- w# e( {# K, C0 T# z  A与开漏输出模式唯一的区别在于输出控制电路之前电平的来源
: F6 W# M# T8 q' W开漏输出模式的输出电平是由CPU写入输出数据寄存器控制的,开漏复用输出模式的输出电平是由复用功能外设输出决定的
9 I0 [! j* v, U* w" t  e% _4 D1 F# W' Z; l8 ]) W! @
小结:
' L7 T" S  X, k2 N1 R(1)推挽结构:两个参数相同的三极管或MOS管分别受两互补信号的控制,总是在一个三极管或MOS管导通的时候另一个截止。高低电平由输出电平决定- q/ S8 D5 L' H8 U! o
6 t  @+ f" [, S, q( E' k9 ]
(2)开漏输出:只可以输出强低电平,高电平得靠外部电阻拉高。输出端相当于三极管的集电极。适合于做电流型的驱动,其吸收电流的能力相对强, 由于输出电平完全由上拉电阻连接的电源电平决定,很方便的调节电平转换; r' O4 k7 W! R% x% R  H5 Y6 K, P

& J) l5 ]+ P; W: M' H) `3 t! j8 F可以实现"线与"功能,"线与"指的是多个信号线直接连接在一起,只有当所有信号全部为高电平时,合在一起的总线为高电平;只要有任意一个或者多个信号为低电平,则总线为低电平
- @+ n8 X! J; z" j& E% l
& U) C- h6 P) l: S(3)推挽输出:可以输出强高、低电平,都具有驱动能力,可以连接数字器件
& ]4 O  {! ^% \* N
+ t8 d1 L3 d6 k5 y2 G  |7 o四、GPIO寄存器组
6 V' G$ l  J+ r) T7 C* ?
STM32G4系列控制器参考手册 : 查看GPIO寄存器1 G, b0 j4 R3 h% P- e0 O
; C: ]& x6 s, Z0 G: b5 J
S]}D5NI2GRL$A@~UO}0FC%S.png * h" W) {7 |( I) C# b

' {; l  F9 n3 b9 c/ g) W# ^每个GPIO包括10个寄存器来配置GPIO的具体功能(每个引脚功能都是完全可以独立配置,互不影响):
6 H( X& \( W( a1 ]* ?
3 q" S7 M' N$ h4 P9 U4 t+ J( o0 nGPIOx_MODER:GPIO 端口模式寄存器1 d2 g: l( N4 T* d* k5 t9 H+ {
GPIOx_OTYPER :GPIO 端口输出类型寄存器9 I& |. `( r) \1 n
GPIOx_OSPEEDR :GPIO 端口输出速度寄存器
0 m* Q3 I" P/ w! yGPIOx_PUPDR :GPIO 端口上拉/下拉寄存器: _4 D( A3 L# ~
GPIOx_IDR :GPIO 端口输入数据
0 E# ~8 L6 d2 BGPIOx_ODR :GPIO 端口输出数据寄存器: i+ `6 J& s* n! ?% k$ y* U# r3 @
GPIOx_BSRR :GPIO 端口置位/复位寄存器& n& d# I  \( h& I4 [  [5 a+ q" [' g6 {
GPIOx_LCKR :GPIO 端口配置锁定寄存器
3 q- ?: ]% _* p, A" U6 L3 [+ KGPIOx_AFRL :GPIO 复用功能低位寄存器
) o, e; x8 N/ {& DGPIOx_AFRH :GPIO 复用功能高位寄存器
. C1 g/ v5 E( B* t" MGPIOx_BRR:GPIO位复位寄存器
/ O  x2 b6 U2 B$ \' Z( X$ Z" [/ C+ ~4 w( }) a+ P' q; ~
)N$%}HJMVIYZNOC~M]C~V.png
3 u1 P( k( N8 }6 o$ }1 u/ [( Q! T9 J; S& U- s5 G  p& U

  h, Q4 K- w) Q6 U
5 v- K% @8 t, S/ r$ S8 a1 Q7 s$ H, U9 r  y. q9 z

) ^" ]- V0 ?/ K+ }
收藏 1 评论0 发布时间:2022-7-6 14:00

举报

0个回答

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版