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

【经验分享】STM32G4外设之GPIO

[复制链接]
STMCU小助手 发布时间:2022-7-6 14:00
一、GPIO介绍' W) }2 k4 w% T5 t5 J1 i
GPIO:General Purpose Input Output通用用途输入输出
, @; I2 X! w6 l4 Q& g& ?5 N& k& m# l1 _6 E& X
核心功能:输入、输出和高级外设的复用功能8 b; I" h; M7 F: `. p! [. C! Y) Y
( |# {) {$ |: b
COH($)Q0~L%`6%UJNEMINKA.png % I$ ~; ~" g( I: z& g. o
  g2 E$ s% B' q9 U6 I
注:使用时一定要配置好各引脚是用作普通I/O(输出0和1)还是用作复用功能/ D9 w1 \5 H3 J' u8 C! l" D
3 L& B0 h% T( V6 M7 I
STM32G431数据手册:查看STM32G4引脚复用功能  _8 C6 b+ c! h# ~- f2 z
})PW4(YGEVR52A0R)YT%N]D.png
. t& y+ @) c& D" h' I/ S- s3 n+ L# M: H' F& ~
查看对应引脚对应的复用功能:
' ]2 j9 o8 l% U" h9 F% u
# p* {7 i' E( ~' M- y $ s' G4 K7 K5 u2 u' |, d1 e

8 ?4 r1 S- [& X& n9 z: E7 a封装LQFP64 前5行 “ - ” 表示 “ 无 ” ,第1引脚从第6行开始$ C+ ]8 n5 T9 ~8 V$ i

4 m3 w; `. d' {4 R3 N" i既然有多种复用功能选择,如何指定一种相应的复用功能?. i- v( a9 a/ G+ D  A/ w: @
==控制复用功能的选择某个引脚选择第二个功能: ==$ b% }: I: K! q3 [
, q9 F0 m. b9 [
FFY7}QFZVAXPZNVP7W9]2{H.png 2 k0 h  x- u0 K

2 {* S* r" ]3 ?9 w将某一个引脚设置为一种复用功能可根据上图来看,每一行对应着不同的复用功能,将对应引脚设置为AFX对应功能所在列(将PA9设置为串口功能,只要将PA9设置为AF7即可),这里就要用使用到复用功能寄存器3 T9 w& t* a% y$ f9 J
, L% ]" g( I. A$ K# W
STM32G4系列控制器参考手册:
+ t4 m; y: E/ N5 C' B
7 _' g- e7 W5 G WG69[IU36M$_PVVNNCJPK3D.png
+ r7 @) e! S0 Z! L' ]/ L6 R0 j  s8 J. I
[]]L38A65666RW4`TGT$`SO.png - i6 a3 u  q, J

' g3 z' U+ z( a, K- I这个是低位寄存器对应PA0-PA7, 还有一个高位寄存器对应PA8-PA15
) k/ n5 S8 a8 A2 X- L. ?' e4 ^' A! I: ?/ F4 P* |* A3 P# R
XYAV{6THSI0L4$@@@46C1OF.png
# @  R/ s. s5 o9 W* Y) m1 e; G, O- C
所以,将PAx引脚设置为AFx引脚只需要像AFRL/AFRH寄存器写入相应的值) I7 g2 y5 \5 o5 X; ~( j1 q, o5 D

8 u0 X( X( }9 r3 f将PA9设置为串口功能,只需要将GPIO A_AFRH 写入0111( PA9 对应 GPIO A_AFRH 中的 AFSEL9[3:0] ): ]+ l6 x8 o& O4 G% D% p
# p/ E! l! M& D/ n* d
二、GPIO的基本结构
* Q  z. w) P. o; D  }2 Z1.IO口内部电路结构
1 M( J2 N, x8 L2 F9 T% ]: N

! k7 z# l9 U" ^ 3$%GSR6U)4LTCQBP_B0OZNH.png
1 Y8 @& I9 ?8 B  C9 M, b
# F% i8 ?) ^9 H2 Y3 u% vI/O口的基本结构可分为上下两部分,下半部分为输出驱动器 ,上半部分为输入驱动器5 x$ [  q$ `9 }3 M/ a- X2 z

3 J: t5 ?; Y$ h" g6 B3 @! E6 j: i2.IO输入输出
( l% l  Z8 j& O5 T/ B% [9 b1.普通IO输出& E( H0 {; i) V1 Z0 N* t
6 V" _5 a* x1 M5 j% {2 R
X@$S%B$OORXAQ@NCL9NAOCB.png 9 o4 e* V7 |$ N3 N

- Z! T/ ^6 m2 M! R1 ?3 G(1)通过置位/复位寄存器和 输出数据寄存器的共同作用输出0或1
$ l" S1 K: Q  A7 ~8 G; r) f3 l- B9 ?6 {4 ]
(2)在选择器处选择普通I/O输出( 或复用功能输出)
2 ^. l! X- {+ M8 j# j. @; A9 p, d
( X7 H$ x' l( x(3)通过反相器将前面输出的0或1转换为1或0
3 _6 J  n4 A: F0 C- L
: [6 ?8 q. ~8 ~(4)通过P-MOS管和N-MOS管两个MOS管决定输出逻辑0还是逻辑1
# m+ t& b* N( ^! R+ O$ ^1 u; n, ^& {2 x
- E2 {' w: w5 ?P-MOS管 为低电平导通,导通后输出逻辑1, X6 v5 w" }/ b9 K
N-MOS管 为高电平导通,导通后输出逻辑0
& w0 q$ m0 r) I  s9 B
! ]  O0 e$ W4 d8 ]" {+ t+ r; s7 v2.复用功能功能输出
' D7 X. }& Z) V  n/ _  u
; A- m6 |! g; B/ l. B  Z1 } K}{LG8(RUG)$NGB3QTVON(8.png
! T6 h5 \% n' x' r0 l# s8 S2 v' B& P# \/ N! w% w+ B
与普通IO输出相比,选择器选择复用功能输出7 y/ R3 S/ X4 e5 F+ _, X& D( Y, k. Q
( F4 T/ O1 L1 A- P$ O) Q! X
3.普通IO输入: A3 F1 {' m! o+ y1 b5 R0 D
输入为低电平0时,上下拉电阻处于关闭状态,施密特触发器为打开状态
# v# g8 Y3 O- d: X+ a0 N% V
, R7 g, f0 \" f6 ~" ?* U @$Q@N{~OP~Q1F@EM{(NGXVM.png & U3 R/ m2 C' f- j% m6 r1 K

3 O' {% c6 y0 O但是,若输入为高电平时要考虑输入电压的大小,如果电压过大必须进行稳压,否则会烧坏电路,这就是包含二极管的作用8 y4 C5 i" q" O4 R" v: y  n( _  d
/ y, ^9 X& y$ q
(1)输入的高电平为3.3V:能够直接通过I/O引脚进入内部电路! u! K, S$ t5 J. ~

* f. E5 C: N5 E$ v, f& J# _# I0 |(2)输入的高电平为5V: 要用到 5V容错I/O端口 其中 VDD_FT(3.3V)
6 W, a  O/ z- @  Z当输入为+5V​时,上面的二极管导通,连接 VDD_FT(3.3V),将输入的5V​稳压到3.3V​,从而保护了电路) ^, B& n3 v6 h! k& f' N3 `

/ \3 M; |" m4 Z1 c P@ZRXCS4)B4@ZM`7WJORM02.png
" ^# v6 C4 Z' ?8 N
/ l7 p. |- X: Q  D  a(3)当输入为-5V​时(和5V方向相反),下面二极管导通,连接VSS(0V),将输入的-5V​稳压到0V​,从而保护电路
% h$ [' Q- D. M( p/ D* i  }
+ l' H6 ~9 \3 v, ` )97MCXMPI9VFCKEZHAKI9(G.png
! D3 |" s+ E1 e$ @( N8 L5 k
% a% o; h3 F$ I) }; }1 T3 R上下拉电阻
% v" _( w/ T" Y9 R. i: g* f当某个引脚处于悬空时,其输入电平不能确定,既不是高电平也不是低电平
; h. M/ b) @% W- r" r, K9 A  J: g
上拉下拉电阻用于处理IO口不确定的电平状态,强制性的将电平拉上或拉下  d! `' }& o; M9 ^) ~9 h- p6 C
1 W" c& n) H5 ^: `/ z" Y7 p
注:当输入为确定的高电平或低电平时,上拉下拉电阻将不起作用9 ~3 m& a1 K. N" g/ |

5 t2 K. ?; D. b( i+ S0 G7 ]4 o上拉和下拉都各有一个开关,当输入电平不确定时且上拉或下拉开关闭合时,不确定的电平就被强制性的转换为高电平(上拉开关闭合)或低电平(下拉开关闭合)
; [/ g: {7 ~% t/ [3 ~" ?* C7 U' T4 g0 m0 U0 O9 ]9 b
上拉电阻:将上拉开关闭合,输入的不确定电平被强制上拉为高电平
: h. k9 ~7 C& \  C  W) k4 `/ T9 I: n% _8 K
0 `" l& I3 ]: W) r% c' O

4 |% A8 R9 U7 u8 q. P下拉电阻:将下拉开关闭合,输入的不确定电平被强制下拉为低电平
9 X, \3 S# `% J) S' T" r* X0 T7 o) S! Y+ O, E$ D3 W# K
YOQUVW0S]8MH49B{)$CZ``B.png 4 v9 G, I+ a7 b, y; ]" }- R

; e7 _6 j& X" D1 H0 _3 Z  q小结:" B7 [( }5 ?& t. F6 [+ d$ p

0 c) Z; Y0 t( J, a$ D. ?5 f& \ 2$$OR)67$L1ZFHEVQHO_UJO.png ! M7 e% n: d& X" u1 H8 W" ?% J
3 N. P5 T5 c' l/ z: R3 p( v
三、GPIO工作模式
1 i' l+ p8 l2 q. E* v, |8 z为实现不同的工作要求,GPIO有8种工作模式。每个I/O口可以自由编程,但I/O寄存器必须按32位字被访问。: Q+ f; W: L. Y) `3 T( E$ s2 B- j
- A+ d# H$ h: W. @2 R8 C6 Q
8%~B~J2{6Y98XLX~Q3[B`{E.png
4 J9 X( e7 V$ J7 p5 S' a9 S2 T* O- o3 D2 f; ]
1.浮空输入
" _; Z  a4 b) S! r浮空输入:复位上电的时,引脚不确定电平的高低(既不接电源,也不接地% b; G4 T5 w. d: b  K( ]
  ^' g: q3 |, K6 Q

  ~6 ?. V. K# h' v3 g5 i( e% V  V5 b7 [' A* H
(1)外部通过IO口输入电平(上下拉电阻处于关闭状态)/ G: y# f! e" ]! _/ E! Z

3 r, k: g7 k' y! r7 w) V+ n8 `0 E(2)传输到施密特触发器(此时施密特触发器为打开状态)- K3 ]* J! C- S* s* N; d+ _2 q
( }9 _. t& r+ |! ~2 h; K
(3)继续传输到输入数据寄存器IDR9 P8 ?( |6 x2 V- [
! v  `. _5 u: a( {' m. a
(4)CPU通过读输入数据寄存器IDR实现读取外部输入电平值2 |7 C; J; _2 Q4 _) r0 @, N, M; j  v

- E/ p  ~0 K, l: m2.输入上拉模式
5 ?. y( o8 A) N( X0 Y输入上拉模式:与输入浮空模式相比较,不同之处在于内部有一个上拉电阻连接到 VDD(输入上拉模式下,上拉电阻开关接通,阻值约 30-50K)" `" s% J! N. t$ i8 U

! ^- \; Z2 @9 z/ R1 p HZ)I56NI_[O9XG(9JKVW20G.png $ N7 _( e$ h* @8 ^% l8 y" z

6 N" q, b5 i8 ?$ Y外部输入通过上拉电阻,施密特触发器存入输入数据寄存器 IDR,被 CPU 读取,当输入管脚悬空时不受外部噪声信号干扰。) f' t) Q- p5 O- K* i3 x8 V

1 P- r8 k: {9 v4 `8 F无论输入管脚悬空或者被高电平驱动时,读取的都是1. 只有在输入端为0的时,读取到的值才是0。因此采取的是非0输入模式。即若读取非0,即为1,若读取为0,即为0。强制上拉,一般是为了输入强高电平
) V+ ]$ _& x' ]# K
, D7 A4 _. g3 O4 X& ?" ^* Q3.输入下拉模式' a/ P: d. d- H3 j1 H
输入下拉模式: 与输入浮空模式相比较,不同之处在于内部有一个下拉电阻连接到 VSS(输入下拉模式下,下拉电阻开关接通,阻值约 30-50K)
' E# W( d3 @* o  G  ]" z6 {/ Z7 A$ o$ H& u" ^- R
_M(P9B}M9E%HZM2C@Z]$AII.png ( s# ~/ \1 I2 q$ z7 a: W' }

) T2 J3 z" f, q9 p外部输入通过下拉电阻,施密特触发器存入输入数据寄存器 IDR,被 CPU 读取,强制下拉,一般是为了输入强低电平
$ v8 x  @  S" ^% C3 k& K$ J7 g
1 O  I' X; p5 y. z& E4.模拟输入模式
& q7 y) i7 K3 W9 G
% ^& [( Q' P9 B: C4 b1 f: [. n% X) s P}YCDKRYGE2PANM~(V[0EDR.png
. e! r& `$ N! K" f上拉和下拉部分均为关闭状态,施密特触发器为截止状态,通过模拟输入通道输入到 CPU,IO 口外部电压为模拟量(电压形式非电平形式), 作为模拟输入范围一般为 0~3.3V
! C& I  W/ X; {8 y7 l% N" U0 a6 J
将IO口作为模拟输入接口,输入的可能是变化的值,接收外部的模拟信号输入, Z! Q6 Z. k1 R3 O. p4 u" Y3 n

& e. |$ J: e" H5.开漏输出模式
) G* X& @+ V' a# G开漏输出即三极管的集电极或者MOS管的漏极进行输出4 {! u: R- V7 G2 [
! a* K5 {8 X$ n% t8 m' b
开漏输出可以实现线与功能。开漏输出只能输出强低电平,高电平需要依靠外部上拉电子拉高,适合做电流型驱动,吸收电流能力较强3 j* E# ^7 B: q# R2 i- ]* s& n
% N0 _: \1 w# Q, g" @% L
注: 在输出模式下TTL施密特触发器为开启状态,所以输出模式下仍存在输入0 X) {) B; @. @8 z' q8 a3 f  A6 Y
! x) v, ^: Q( ^. p; ]
1TR45RR1)%@~ORX`09ASU4R.png 8 p: Z! o( j. Z- v' c0 m7 g

! U0 W  @+ h1 F' J" A' g; L(1)CPU写入位设置/清除寄存器BSRR,映射到输出数据寄存器ODR
, Q* L& q+ F% r1 g" K0 N% b: `4 T* u$ W. ~5 z
(2)联通到输出控制电路(也就是ODR的电平)
/ T* H% J! i- f6 U+ P8 [' O* |
8 h- B6 W, W1 Z: j(3)ODR电平通过输出控制电路进入N-MOS管! Q1 l' x% ^: Z+ q
6 l1 T0 H5 l& A8 B
开漏不使用 P-MOS(输出1) ,故输出不为 “0” 或 “1”,而是 “0” 或 “浮空”
. v% L9 y4 ?( U" U, V% i" i7 }2 {* p9 ^  `2 l) B5 `
(1)写0传输到MOS管处,N-MOS 导通,输出为0
' u7 L% d& W4 c! [(2)写1传输到MOS管处,P-MOS 和 N-MOS 都不导通,输出浮空
' j9 u& A, J1 I% z* p7 V0 r% X7 a0 i" n& Z  J3 b- U
(1)ODR输出0:
4 V+ e7 G! f1 n# z$ FN-MOS截止,IO端口电平不会由ODR输出决定,而由外部上拉/下拉决定; I  R& s9 D8 i

; G5 J; ~( h# A5 \+ O2 w7 l: \在输出状态下,输出的电平可以被读取,数据存入输入数据寄存器,由CPU读取,实现CPU读取输出电平
) n6 N- N0 B0 E" j6 c6 O% J0 H/ r' G$ E* ~# O) f
所以,当N-MOS截止时,如果读取到输出电平为1,不一定是我们输出的1,有可能是外部上拉产生的1
6 u4 @; W+ @; x- Q; B$ k& c' |
9 H# \. V( h. m+ S6 g  z& g(2)ODR输出1:( G5 R# {: Y$ z. ~2 L1 F
N-MOS开启,IO端口电平被N-MOS管拉倒VSS,使IO输出低电平。此时输出的低电平同样可以被CPU读取到! e5 s' g" t& T1 K

, X1 _2 ^4 c/ q0 N# S4 M+ R# K) o开漏输出为不确定状态,不具有驱动能力
! W, @; m" V9 j, Y2 X0 k' P' m$ w& {+ q5 d- U) H
6.推挽输出模式

4 v% U% e! K/ j7 S) o推挽输出使用 P-MOS和N-MOS ,输出为0或1/ b4 Y3 v- D1 `* @
8 u7 w! s6 @+ E/ ?# O4 n
YC9V7@3~P~A)B}%9R3(AB}N.png
) r, L6 m$ }" _/ c  \& ?& _- q& a9 C! l2 ?+ ?, N
推挽输出可以采取强高/强低输出,可以连接数字电路- ^% g' g& @. H, s1 O

$ e. p, f# h( b3 e9 O" A4 o7.推挽复用输出模式9 P1 e1 g% G- u3 n2 G

& v* p& Z4 y1 m' U( H+ c LELCOLXI2`S)TGG_FGM1902.png " c( ~7 j2 X. o% v! {
与推挽输出模式唯一的区别在于输出控制电路之前电平的来源. S. b; u# r5 b7 K/ T# U; t$ x
推挽输出模式的输出电平是由CPU写入输出数据寄存器控制的,推挽复用输出模式的输出电平是由复用功能外设输出决定的" o; _) {' \5 i% |8 M# k/ \6 K7 h

- {+ G. _( N2 u0 G2 T0 g1 p$ D8.开漏复用输出模式
- e. h; G# U3 q5 Q
! A* T! p: h- R8 |
V236_PO}@JP$B[WVSSQ5EVM.png
0 f. P) y# Q$ o4 G- x与开漏输出模式唯一的区别在于输出控制电路之前电平的来源/ x& v1 c6 W) q
开漏输出模式的输出电平是由CPU写入输出数据寄存器控制的,开漏复用输出模式的输出电平是由复用功能外设输出决定的% \) l8 l4 J7 ]* ]; p& O

$ ?7 n, j' R. r+ m0 @小结:* k8 J: W; e5 z" m, J+ o; x! h
(1)推挽结构:两个参数相同的三极管或MOS管分别受两互补信号的控制,总是在一个三极管或MOS管导通的时候另一个截止。高低电平由输出电平决定
; p% k: `8 M* I$ o' M) n; \- H3 b  C; b/ _3 g
(2)开漏输出:只可以输出强低电平,高电平得靠外部电阻拉高。输出端相当于三极管的集电极。适合于做电流型的驱动,其吸收电流的能力相对强, 由于输出电平完全由上拉电阻连接的电源电平决定,很方便的调节电平转换7 N8 @& x. c0 V: ?% N; f9 n2 q+ x

3 v4 D& }4 x- k7 V# r可以实现"线与"功能,"线与"指的是多个信号线直接连接在一起,只有当所有信号全部为高电平时,合在一起的总线为高电平;只要有任意一个或者多个信号为低电平,则总线为低电平5 \4 W5 ]( V" F5 Q! K6 x
) m" O: o* v: [7 P/ a
(3)推挽输出:可以输出强高、低电平,都具有驱动能力,可以连接数字器件' s1 U2 r5 i7 P9 h. X! O6 d
" }  h# c6 J/ W
四、GPIO寄存器组

8 W' ?; Q: s; v+ qSTM32G4系列控制器参考手册 : 查看GPIO寄存器
- d) B% L" i4 ]  U' n
. R9 o, L+ O! k; x8 w( X S]}D5NI2GRL$A@~UO}0FC%S.png # S9 r6 O% S1 t: y( i

* {5 f+ Y, x7 ^, F( }+ y) v2 X每个GPIO包括10个寄存器来配置GPIO的具体功能(每个引脚功能都是完全可以独立配置,互不影响):* r8 I9 B" ^8 L/ n" [

8 |6 s4 }: }% u0 A# dGPIOx_MODER:GPIO 端口模式寄存器1 R) ?! l7 Q1 u/ x
GPIOx_OTYPER :GPIO 端口输出类型寄存器
( N& Q" H  G5 l) sGPIOx_OSPEEDR :GPIO 端口输出速度寄存器
$ n. a5 G: |  ~+ z( _, }/ fGPIOx_PUPDR :GPIO 端口上拉/下拉寄存器$ W4 ^+ ]5 C) |. V2 h% r  m9 C
GPIOx_IDR :GPIO 端口输入数据
1 |" v1 ?0 I8 V7 A) D* l- NGPIOx_ODR :GPIO 端口输出数据寄存器
9 K) ~; ^. T, I- I5 {% t$ x& IGPIOx_BSRR :GPIO 端口置位/复位寄存器
. F' n1 O' O- B1 _  X7 g6 u0 L& |GPIOx_LCKR :GPIO 端口配置锁定寄存器" v8 Q' l  _: I" n! q
GPIOx_AFRL :GPIO 复用功能低位寄存器
) ]" u; Q0 j( @2 xGPIOx_AFRH :GPIO 复用功能高位寄存器. h+ C# E( Q2 r
GPIOx_BRR:GPIO位复位寄存器2 X: V) O5 ]8 ~% M: a
/ S$ |4 H; c* J& b6 G
)N$%}HJMVIYZNOC~M]C~V.png 1 T" r6 M4 L1 {
* _% V- y) h$ D3 Q( m
' E6 o% h/ m: Z
  R, @7 [+ N( V3 B& C
1 }; U! ?- m: D3 [3 C
5 |; L8 x0 v; W& s* T. \# L
收藏 1 评论0 发布时间:2022-7-6 14:00

举报

0个回答

所属标签

相似技术帖

官网相关资源

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