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

【经验分享】STM32G4外设之GPIO

[复制链接]
STMCU小助手 发布时间:2022-7-6 14:00
一、GPIO介绍) N3 K: e5 f" t" T
GPIO:General Purpose Input Output通用用途输入输出$ E% s2 a2 L9 s: Q9 t) J( r
, Y8 G" @2 A' y* m. k4 s2 F
核心功能:输入、输出和高级外设的复用功能) q* s7 u/ I9 ?) Q. i, d6 t
' ?9 k* G7 _& N9 y3 }' p
COH($)Q0~L%`6%UJNEMINKA.png . S" m% v( `! T7 N

2 P, P2 ^  ~2 q) A. Q9 Y注:使用时一定要配置好各引脚是用作普通I/O(输出0和1)还是用作复用功能
/ R4 o: Y! c8 h4 \( z- q; t& }3 m: y
8 m" }- L/ N/ X% Z  BSTM32G431数据手册:查看STM32G4引脚复用功能
0 [: P! y1 d# \+ R7 h  z })PW4(YGEVR52A0R)YT%N]D.png # V! x. P# I2 U, I0 r: o  X

- ]( ?& u1 T  k1 ~4 j查看对应引脚对应的复用功能:
) B1 t# I: I  K) G! Z' }( Y6 K; |2 I
5 B( i2 C# U% {  H& q; G5 \
& _9 t# `0 R# z: j- c) S# v0 Q1 x% }" u- P4 A; v4 H& S) y
封装LQFP64 前5行 “ - ” 表示 “ 无 ” ,第1引脚从第6行开始' y8 j$ i, x( I( l+ k6 K
3 ^* \, b; b5 A9 Z  G. D: r+ F
既然有多种复用功能选择,如何指定一种相应的复用功能?
% ^( Y7 i4 F3 {0 y! t6 A) A==控制复用功能的选择某个引脚选择第二个功能: ==
% B( ?4 r: Y- t, o  {. `9 P4 B3 L2 f' c1 R* B. e
FFY7}QFZVAXPZNVP7W9]2{H.png
7 q4 ]* Z$ |' h2 P- ]
2 l. h3 z/ g; B7 q0 }; @, @2 K, ^将某一个引脚设置为一种复用功能可根据上图来看,每一行对应着不同的复用功能,将对应引脚设置为AFX对应功能所在列(将PA9设置为串口功能,只要将PA9设置为AF7即可),这里就要用使用到复用功能寄存器( L: G" j& K  t& C! c5 z/ Y5 F

& t. {/ g- N- f# c' t; B) M% f7 rSTM32G4系列控制器参考手册:2 i* u+ X1 b0 ~3 _3 P

7 Y6 d. R8 C$ L. H* x% B0 z WG69[IU36M$_PVVNNCJPK3D.png 9 f1 s: I+ o: W( l
! c& [; i% f8 f3 G+ r- H) t
[]]L38A65666RW4`TGT$`SO.png
0 Z* C& G# P: g# n6 q, V$ j  ~. P8 r5 G% ?
这个是低位寄存器对应PA0-PA7, 还有一个高位寄存器对应PA8-PA157 t; D+ }5 \. T. e( C- X1 t7 y

. D$ _9 \( j$ C& O" w, k XYAV{6THSI0L4$@@@46C1OF.png 6 t" O' T: b8 b8 j1 k
3 g2 M/ Z# m- e. l9 }
所以,将PAx引脚设置为AFx引脚只需要像AFRL/AFRH寄存器写入相应的值
, e0 K0 y* k1 i4 z6 m) y4 @9 g6 u& j% A. Q2 m1 w
将PA9设置为串口功能,只需要将GPIO A_AFRH 写入0111( PA9 对应 GPIO A_AFRH 中的 AFSEL9[3:0] )  g. |' V8 N6 D) X
) e$ A% r) f' u5 E- i
二、GPIO的基本结构) E/ _- Q# L3 `
1.IO口内部电路结构

$ q7 B# s1 S' G; o2 b9 d( D2 i" I6 T. H, r) X5 h! s
3$%GSR6U)4LTCQBP_B0OZNH.png   N) s/ h, X' `# m7 ~& k

$ d5 b* y  f9 V- F. ZI/O口的基本结构可分为上下两部分,下半部分为输出驱动器 ,上半部分为输入驱动器
7 Q1 Y# @7 P/ d# u+ B6 u$ _
1 c) Z0 E2 s' w2.IO输入输出
" {1 w& c! c- I; U1.普通IO输出' u1 l* I8 o# J3 D: L/ p

- q; ]4 J' [: V8 W X@$S%B$OORXAQ@NCL9NAOCB.png 1 d, N# l  W9 K& y

9 N% U. H$ X0 {  L2 y% ]4 }4 Z(1)通过置位/复位寄存器和 输出数据寄存器的共同作用输出0或1& i* @5 ^5 s" S. y
* v1 @- G4 a& ?# h
(2)在选择器处选择普通I/O输出( 或复用功能输出)# |8 m" t; ^" z& w( m

6 p3 W* T. N; i3 [(3)通过反相器将前面输出的0或1转换为1或0
% C2 p! N1 o1 e! u. ]* i+ y
- ^0 a4 v) ^! @9 E  T(4)通过P-MOS管和N-MOS管两个MOS管决定输出逻辑0还是逻辑1
- h% h/ {7 w1 v! ~; {' Z  a4 M3 n: P9 K3 x: A6 S
P-MOS管 为低电平导通,导通后输出逻辑1- @. C- W0 R2 L1 O5 E
N-MOS管 为高电平导通,导通后输出逻辑08 }  P- ~# s3 C: R# N3 I. n& c

3 B  X. P- L) A+ [% C) \2 m: p' C2.复用功能功能输出! X' S& {* c  V7 ]
% B3 ^8 s4 N( d
K}{LG8(RUG)$NGB3QTVON(8.png
) @1 p0 j) B0 z2 n7 _* g
0 W; @. a( Z  ~0 c) }3 Q- B; m与普通IO输出相比,选择器选择复用功能输出9 V' ]% y. h3 m: h% T! ]
# T% L% J# z* L
3.普通IO输入
% U; E0 Z7 H$ g. ^$ ~2 m3 Y5 `输入为低电平0时,上下拉电阻处于关闭状态,施密特触发器为打开状态
, i2 {, u" P: N4 Q: @- m1 L' l6 _+ k/ _/ [
@$Q@N{~OP~Q1F@EM{(NGXVM.png ; o1 |- O5 |8 {  i/ u

; {- l0 b$ x5 a: ^3 K8 B. ]但是,若输入为高电平时要考虑输入电压的大小,如果电压过大必须进行稳压,否则会烧坏电路,这就是包含二极管的作用( ]4 y  ~; t- k2 |: J* @$ S

9 o/ l  k$ B  n  ~4 ^(1)输入的高电平为3.3V:能够直接通过I/O引脚进入内部电路. l9 p7 M9 n3 d
% H: L$ U: T! A/ ]) Y# T2 i
(2)输入的高电平为5V: 要用到 5V容错I/O端口 其中 VDD_FT(3.3V)% u6 j8 @3 j2 X+ h
当输入为+5V​时,上面的二极管导通,连接 VDD_FT(3.3V),将输入的5V​稳压到3.3V​,从而保护了电路4 l' t$ u) Z0 W5 ~

9 I( O6 N( I+ G, `% p- U3 m P@ZRXCS4)B4@ZM`7WJORM02.png
' M7 Z6 C  h5 R8 S6 H0 n3 ]- @" I- ~
(3)当输入为-5V​时(和5V方向相反),下面二极管导通,连接VSS(0V),将输入的-5V​稳压到0V​,从而保护电路2 b* ^8 L) e$ ]3 D4 z

) {' c6 Q& y" Y# l/ R' M )97MCXMPI9VFCKEZHAKI9(G.png / Y8 u2 X. _8 Z  \5 m

2 y2 K7 O% S& b% C上下拉电阻
- K; D) v( m* {! I' k% i3 l: o当某个引脚处于悬空时,其输入电平不能确定,既不是高电平也不是低电平0 ~( T# y2 E: d3 H( e. m
* K- T- c- F" {6 I4 c; K$ I; k( i
上拉下拉电阻用于处理IO口不确定的电平状态,强制性的将电平拉上或拉下
; h: M/ a7 z4 \5 |/ n
1 I% B; F3 f! \. j注:当输入为确定的高电平或低电平时,上拉下拉电阻将不起作用
; O6 X8 i) ^- m/ B% V+ a' t9 N. P8 T) a4 q
上拉和下拉都各有一个开关,当输入电平不确定时且上拉或下拉开关闭合时,不确定的电平就被强制性的转换为高电平(上拉开关闭合)或低电平(下拉开关闭合)
9 y" E) ]( g, P, h. \! l+ y# r8 d3 T% z, ]
上拉电阻:将上拉开关闭合,输入的不确定电平被强制上拉为高电平! E/ m4 I- r( B% D# p5 E

1 Y& A# U& k/ S, _( X8 J- `
, o4 r; @% g+ g1 g9 x
/ _8 q* S+ n( k/ r下拉电阻:将下拉开关闭合,输入的不确定电平被强制下拉为低电平5 Q/ v! ^/ h! b1 z$ Y! R# M8 E
( g1 d; r% `+ d' b
YOQUVW0S]8MH49B{)$CZ``B.png
; y, }9 h( |$ K. O( Y% F. J3 B6 h# q4 Z6 e, [& V4 k9 N& K5 k
小结:
6 f6 l/ ^$ k8 e0 E3 [+ u5 V8 I6 |2 p" d' J) g. e
2$$OR)67$L1ZFHEVQHO_UJO.png
' z8 p' s+ ~9 y5 x& k
6 Q) I! [- a+ A8 e# l2 a. [, ]三、GPIO工作模式
$ N; x. _+ s* b为实现不同的工作要求,GPIO有8种工作模式。每个I/O口可以自由编程,但I/O寄存器必须按32位字被访问。# r! t, _+ O; B8 o' J0 I

- a7 ~9 R% @7 e5 k 8%~B~J2{6Y98XLX~Q3[B`{E.png
+ e0 {+ l) v5 o" _9 K- p( L
/ J; C3 I/ z" h! f. {1.浮空输入
' z2 {6 m% e+ G. ]# V8 @浮空输入:复位上电的时,引脚不确定电平的高低(既不接电源,也不接地# \6 g' U( M5 p% t0 g0 \
) k1 d& m7 ^( I* [3 `% @& X
' [- x: Y0 B1 `

8 F# B' q/ N* ?8 Y. h(1)外部通过IO口输入电平(上下拉电阻处于关闭状态)
0 @& C2 C/ x0 q/ ~! |& l4 f6 j; P
(2)传输到施密特触发器(此时施密特触发器为打开状态)
7 V5 x* {9 O. t- K- E2 s$ {, s4 e2 N# R2 S4 k1 ], T2 z5 z- v9 m. M
(3)继续传输到输入数据寄存器IDR5 }& e0 y6 W5 P2 x% \

7 I" h+ t# X+ |* x(4)CPU通过读输入数据寄存器IDR实现读取外部输入电平值) |( b: B: v6 u
5 `3 [* H8 r0 Y7 N
2.输入上拉模式. ?* i1 Q9 J; a' _9 x! t/ K
输入上拉模式:与输入浮空模式相比较,不同之处在于内部有一个上拉电阻连接到 VDD(输入上拉模式下,上拉电阻开关接通,阻值约 30-50K). \1 w3 e0 R6 }5 y5 n
# U$ B8 ^7 T! v! _* M5 ^1 Z
HZ)I56NI_[O9XG(9JKVW20G.png
1 F/ \* w" R! V" O0 X
$ S& v8 @' E  Q* L外部输入通过上拉电阻,施密特触发器存入输入数据寄存器 IDR,被 CPU 读取,当输入管脚悬空时不受外部噪声信号干扰。
5 s( t7 r" L! R* F8 M! X8 I7 @  T) W& K
无论输入管脚悬空或者被高电平驱动时,读取的都是1. 只有在输入端为0的时,读取到的值才是0。因此采取的是非0输入模式。即若读取非0,即为1,若读取为0,即为0。强制上拉,一般是为了输入强高电平
% r: s) u  E3 [" q
8 S/ p) _+ H- k  e8 H8 Y3.输入下拉模式! h1 i- g$ G. w8 @3 U# j9 i
输入下拉模式: 与输入浮空模式相比较,不同之处在于内部有一个下拉电阻连接到 VSS(输入下拉模式下,下拉电阻开关接通,阻值约 30-50K)5 b+ V7 K6 U) t4 M& s6 Z

3 v! P* L3 C3 P* G7 r _M(P9B}M9E%HZM2C@Z]$AII.png ) c1 k* o: U. v7 L8 q. u
" j8 F: P- h& y
外部输入通过下拉电阻,施密特触发器存入输入数据寄存器 IDR,被 CPU 读取,强制下拉,一般是为了输入强低电平2 k7 ~$ n/ K- M( S* ~( J

* }0 S  \/ Y: ^2 w4 C4.模拟输入模式
" E' O2 G: ^6 `9 V+ I+ k1 e9 N% {) @7 R9 e
P}YCDKRYGE2PANM~(V[0EDR.png # i+ f; `" `* E/ w) l
上拉和下拉部分均为关闭状态,施密特触发器为截止状态,通过模拟输入通道输入到 CPU,IO 口外部电压为模拟量(电压形式非电平形式), 作为模拟输入范围一般为 0~3.3V
! O" I" b# Y% \
( l. L, B) g- a7 k' L将IO口作为模拟输入接口,输入的可能是变化的值,接收外部的模拟信号输入
1 d! e' i3 i: w9 D& \  Q# n- @
) _4 d$ N) G, j8 P/ c8 y5.开漏输出模式
, l4 [3 S, p/ y/ m* }开漏输出即三极管的集电极或者MOS管的漏极进行输出
( g0 s8 \$ o8 a7 _( Q5 s) M8 H, [6 [
5 q4 d5 P$ M/ z0 k开漏输出可以实现线与功能。开漏输出只能输出强低电平,高电平需要依靠外部上拉电子拉高,适合做电流型驱动,吸收电流能力较强8 R! M1 N& V0 D3 e$ l) M4 B

6 ?. |6 P9 }3 f" o0 t注: 在输出模式下TTL施密特触发器为开启状态,所以输出模式下仍存在输入+ E- |& Q  s* P3 B2 B+ a6 X! y4 i

  B" J2 ]  B# b0 d7 F* _  w+ @, _ 1TR45RR1)%@~ORX`09ASU4R.png
6 ?+ O9 p- B6 o( U( i; P' Q$ Y/ J! ~8 B( h6 r- H( [
(1)CPU写入位设置/清除寄存器BSRR,映射到输出数据寄存器ODR
% F5 K6 |$ ]+ |' o: s, e" |& D. J$ d, ]( c
(2)联通到输出控制电路(也就是ODR的电平)
7 H1 Z: d' r. S* j+ n
' X6 j/ o4 K3 f* R, ~9 }1 B4 b6 N# \(3)ODR电平通过输出控制电路进入N-MOS管$ g8 q- p2 s5 [7 H# w0 C
6 D& a! ?# F6 ?  c" o$ K
开漏不使用 P-MOS(输出1) ,故输出不为 “0” 或 “1”,而是 “0” 或 “浮空”' d4 N" T" z9 T* X

' q( e) ~; \+ x- y. H9 m8 u4 H(1)写0传输到MOS管处,N-MOS 导通,输出为0) K, v% Y1 f. f* R
(2)写1传输到MOS管处,P-MOS 和 N-MOS 都不导通,输出浮空$ R1 m$ W% K( L9 y

% ?2 t4 f2 j" }) p% `/ {(1)ODR输出0:
) {7 u0 C) @) x9 qN-MOS截止,IO端口电平不会由ODR输出决定,而由外部上拉/下拉决定7 T9 e; e8 B  c) A

3 V9 Q, K3 U$ C( @! ]在输出状态下,输出的电平可以被读取,数据存入输入数据寄存器,由CPU读取,实现CPU读取输出电平
( E% p: V; y2 M" L2 u& z8 O
2 e" E, @4 [/ v+ G$ i- }& `" K所以,当N-MOS截止时,如果读取到输出电平为1,不一定是我们输出的1,有可能是外部上拉产生的14 V. O: }' b5 T: N! f. p( R
: u. `6 ~" {0 L
(2)ODR输出1:: X2 S3 k' O# M+ e3 D, X. z
N-MOS开启,IO端口电平被N-MOS管拉倒VSS,使IO输出低电平。此时输出的低电平同样可以被CPU读取到
9 e5 y/ i) _/ _# j  v: ~* D: n1 d- h0 S2 c
开漏输出为不确定状态,不具有驱动能力' f3 t* o- s6 U

: s( `$ O! ^- a9 r6 {  F6.推挽输出模式

' x# k, m9 V+ Q7 t/ [6 [1 x推挽输出使用 P-MOS和N-MOS ,输出为0或1) S. c; t$ O/ a) R) t3 ^

7 g2 a& D1 ?, S YC9V7@3~P~A)B}%9R3(AB}N.png : {, Q3 J1 e8 p
' |# f# L5 Q4 _" M
推挽输出可以采取强高/强低输出,可以连接数字电路- U+ }8 ?+ E- [! a) S( c
: Q' A0 B. i0 r# N- S9 h% E' d
7.推挽复用输出模式* G) u- h' l5 l, B8 w0 E0 O

5 n4 g) S& v5 p4 K. _$ G! M LELCOLXI2`S)TGG_FGM1902.png 7 Z3 u, T4 D+ f" D9 }* ]
与推挽输出模式唯一的区别在于输出控制电路之前电平的来源9 F2 e. M* ^( L1 Z+ }* O
推挽输出模式的输出电平是由CPU写入输出数据寄存器控制的,推挽复用输出模式的输出电平是由复用功能外设输出决定的
4 @% ~* W2 @2 e. v+ q: ^
3 \; M! K9 L& T4 V8.开漏复用输出模式

: Y. U- C& n2 `; g2 B
, O( X: e$ A% T9 t% v6 b V236_PO}@JP$B[WVSSQ5EVM.png
0 w% P, H" n- V- Z: T$ M- N% O( y与开漏输出模式唯一的区别在于输出控制电路之前电平的来源6 R7 W! |, J$ j1 d$ p- W4 R+ u
开漏输出模式的输出电平是由CPU写入输出数据寄存器控制的,开漏复用输出模式的输出电平是由复用功能外设输出决定的: {* t- ~0 M- _  R

$ b1 J0 Z- j! ?( M8 o% O  l小结:
9 _! D- y% f, y6 o' Q$ R. ](1)推挽结构:两个参数相同的三极管或MOS管分别受两互补信号的控制,总是在一个三极管或MOS管导通的时候另一个截止。高低电平由输出电平决定% {' a: D4 Z( Q; u+ @! d

( r7 W* @- h/ Z# r(2)开漏输出:只可以输出强低电平,高电平得靠外部电阻拉高。输出端相当于三极管的集电极。适合于做电流型的驱动,其吸收电流的能力相对强, 由于输出电平完全由上拉电阻连接的电源电平决定,很方便的调节电平转换# X0 i! ^* u" g  N$ W

( s, y/ L7 C% p- R1 q% r2 T: w可以实现"线与"功能,"线与"指的是多个信号线直接连接在一起,只有当所有信号全部为高电平时,合在一起的总线为高电平;只要有任意一个或者多个信号为低电平,则总线为低电平. a& }1 Y1 L- U5 F; ~4 N

+ n- O, I, H9 W* l! x; y0 p( p1 S(3)推挽输出:可以输出强高、低电平,都具有驱动能力,可以连接数字器件
5 G" c! E0 i% L$ h- ?. E! l' I1 D7 x8 C$ n: i" U* k# [- [
四、GPIO寄存器组
4 ^" U3 Q, T0 q# ~/ [
STM32G4系列控制器参考手册 : 查看GPIO寄存器+ ^9 w  ^5 ]# w% b+ d- \

) k) r1 E: ]/ _ S]}D5NI2GRL$A@~UO}0FC%S.png " j" E2 A, B  V( N/ d6 E% w
) P, ?, |/ P0 `2 _; C
每个GPIO包括10个寄存器来配置GPIO的具体功能(每个引脚功能都是完全可以独立配置,互不影响):
  _9 F0 G7 F, T8 X0 r& |6 `4 J+ {: E: d# z" g- L" L4 B
GPIOx_MODER:GPIO 端口模式寄存器
% Z! g2 s% p  G# s0 y! W  NGPIOx_OTYPER :GPIO 端口输出类型寄存器" Z" i, @! F& m+ U
GPIOx_OSPEEDR :GPIO 端口输出速度寄存器* f; g+ S$ V, }* k3 g3 c
GPIOx_PUPDR :GPIO 端口上拉/下拉寄存器
- ~0 w; o# _% X& U2 f# z9 o4 FGPIOx_IDR :GPIO 端口输入数据" ~% v6 P  l. Y' j/ g9 _
GPIOx_ODR :GPIO 端口输出数据寄存器$ G* |% c" y. u% j" Q, V) B9 g
GPIOx_BSRR :GPIO 端口置位/复位寄存器
2 O; f$ _9 ]  ~+ h; nGPIOx_LCKR :GPIO 端口配置锁定寄存器7 Q+ M5 H6 {3 o% a
GPIOx_AFRL :GPIO 复用功能低位寄存器  t% x+ U$ e  z6 k
GPIOx_AFRH :GPIO 复用功能高位寄存器
5 F$ ], g7 c0 q/ w, f9 I5 X+ xGPIOx_BRR:GPIO位复位寄存器* s& P; `0 e& `" b% m9 M

/ G/ H  \7 [2 }8 p* \8 _  f )N$%}HJMVIYZNOC~M]C~V.png / k+ d5 X" G; X* A

3 a5 t5 c6 k& c8 h; N9 i
( E5 [: L8 W4 g& X0 O* [' U# U# v+ D/ {2 e1 X% s

5 z! O3 q& j6 y; ~4 d  Z/ e2 S& ~7 N0 c* R. w) \! L8 D) h
赞 收藏 1 评论0 发布时间:2022-7-6 14:00

举报

0个回答

所属标签

相似技术帖

官网相关资源

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