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

【经验分享】STM32G4外设之GPIO

[复制链接]
STMCU小助手 发布时间:2022-7-6 14:00
一、GPIO介绍& O$ U# Z1 L1 J: F/ A4 b5 k
GPIO:General Purpose Input Output通用用途输入输出% Q, F- E0 U& y3 G: J& c' V

% R0 C1 [; G6 x( J2 Y0 k: u! [核心功能:输入、输出和高级外设的复用功能/ q  @% j4 q! B
" B! Y- }2 H  b5 s5 T
COH($)Q0~L%`6%UJNEMINKA.png
- N5 Z7 d- Q7 q  E4 E
6 ~6 a4 L3 W: ^: {2 C' x注:使用时一定要配置好各引脚是用作普通I/O(输出0和1)还是用作复用功能: o! l7 L) @- a1 w

; P& T$ }& h; q" Y) n/ Y8 TSTM32G431数据手册:查看STM32G4引脚复用功能
$ h/ G2 z: j: H; l; |$ V })PW4(YGEVR52A0R)YT%N]D.png " Y+ O+ ~+ w9 k; k/ K2 Y& c

" K% C5 J, w4 |& D! R' V查看对应引脚对应的复用功能:" O  u6 J  l! m8 I

5 X+ Y; Y4 `4 {" D3 A0 a0 [- f; V
+ o. j$ x7 J& E9 s6 N" s" K; r
& W% q6 O# U) T% d% P1 r! [% R' L8 B封装LQFP64 前5行 “ - ” 表示 “ 无 ” ,第1引脚从第6行开始6 S  `2 k- ]8 q4 R
9 w- F: j2 E: e! N! u1 a  K+ e
既然有多种复用功能选择,如何指定一种相应的复用功能?# ]8 ?! v6 C. W! {/ J. t$ ?
==控制复用功能的选择某个引脚选择第二个功能: ==. j$ `; z. j4 }" V% j1 P0 g9 l
8 w1 ?7 q; {( {2 M% G5 i
FFY7}QFZVAXPZNVP7W9]2{H.png " \6 _- l# ]# U' R6 C$ C
1 z; B- [& m9 q: ]8 v! `
将某一个引脚设置为一种复用功能可根据上图来看,每一行对应着不同的复用功能,将对应引脚设置为AFX对应功能所在列(将PA9设置为串口功能,只要将PA9设置为AF7即可),这里就要用使用到复用功能寄存器5 F5 Z# Y3 ]$ f- R# M

( ?& v1 M  w1 ^* g2 J1 ]9 ~. B+ u3 wSTM32G4系列控制器参考手册:# k2 V4 K. ]5 f8 s: O
& D, q# V; s; v" W" J
WG69[IU36M$_PVVNNCJPK3D.png
$ i% y/ `7 q6 O, {/ t8 Y' `1 O+ z0 [& D' M' O8 y! C4 k
[]]L38A65666RW4`TGT$`SO.png * {+ O: P  D8 l- a6 D% @

- g2 D4 `: a/ K; p, ?0 S这个是低位寄存器对应PA0-PA7, 还有一个高位寄存器对应PA8-PA15& y# J3 ]4 u% e, n# n$ h; ~' W

) ^' D; G! J# @8 b% u. ]$ ] XYAV{6THSI0L4$@@@46C1OF.png
" w6 a4 C0 b1 M" O/ n
; S! V+ L/ U0 ]1 u& {所以,将PAx引脚设置为AFx引脚只需要像AFRL/AFRH寄存器写入相应的值, z5 l% z/ g% U! S3 q

" y) t* S, i6 z! p4 `) j) c将PA9设置为串口功能,只需要将GPIO A_AFRH 写入0111( PA9 对应 GPIO A_AFRH 中的 AFSEL9[3:0] )
- j, N8 B. q' D' X! q6 J$ E0 Z
3 n4 d* }. p& A* T, \二、GPIO的基本结构
8 r  `" U2 }/ ~' v# U1.IO口内部电路结构
! O; C0 a9 J0 d+ q6 Q3 c
6 a3 X/ u0 K8 B4 v1 w- A& |
3$%GSR6U)4LTCQBP_B0OZNH.png
6 O: t+ T8 a) w  u1 P* K; ]
# I5 `1 l, A$ @' K9 x$ R4 jI/O口的基本结构可分为上下两部分,下半部分为输出驱动器 ,上半部分为输入驱动器
! B6 Y2 n: h3 T: d& Q* l, K; T- z5 ?: h8 }
2.IO输入输出/ C& h! e( U5 ^# S: G3 E
1.普通IO输出' n$ w- W# q! P  a8 d* c# b

  {! f  v1 r& O$ T! C( l6 H& b X@$S%B$OORXAQ@NCL9NAOCB.png
' W3 L. o$ V4 M0 ^& i( `
, v' E. E& J6 l; `(1)通过置位/复位寄存器和 输出数据寄存器的共同作用输出0或18 W1 q- E' K. _. h6 Z
1 v6 ^/ X! A( C
(2)在选择器处选择普通I/O输出( 或复用功能输出)( O) T! I+ l, c0 i2 y
. |! Y& N) H* e1 s% u
(3)通过反相器将前面输出的0或1转换为1或0
& r4 F, P0 m6 Q
6 M) o% \" }9 n' A(4)通过P-MOS管和N-MOS管两个MOS管决定输出逻辑0还是逻辑1  o. b% g% B7 d. B; P
8 t: C1 u/ s1 c" Q% \9 S
P-MOS管 为低电平导通,导通后输出逻辑1  O& E- s% S- A. h
N-MOS管 为高电平导通,导通后输出逻辑0
6 [' `8 H* b, {7 o! C( E1 m$ C7 f( Q. X; |) _/ j7 L
2.复用功能功能输出( b5 d$ X. {) F) u& i  ]1 @- ^
" J  v. ~: ]. ]3 z! I  h1 h5 O3 A
K}{LG8(RUG)$NGB3QTVON(8.png
8 w$ p2 ?: X6 ~8 ]5 j, r+ e5 A  N: \5 p1 b+ K6 _& o& Y
与普通IO输出相比,选择器选择复用功能输出! p3 X# {" s2 }1 h" n  F0 |1 B! n* E
6 R$ M9 z4 m* R: d% g
3.普通IO输入
9 H0 E+ _; p( ^- W  Q输入为低电平0时,上下拉电阻处于关闭状态,施密特触发器为打开状态
/ q, {3 r1 G" H6 J) y; I- h, ^+ r( R7 a
@$Q@N{~OP~Q1F@EM{(NGXVM.png # A* \8 O. e. y/ ]' ~/ w; z3 _9 h
% f7 T/ g2 Z! N
但是,若输入为高电平时要考虑输入电压的大小,如果电压过大必须进行稳压,否则会烧坏电路,这就是包含二极管的作用1 n& K2 _3 J6 \
* `( [) i( \% Q* d! I1 F2 T
(1)输入的高电平为3.3V:能够直接通过I/O引脚进入内部电路
/ ^5 n7 Y$ [% X: x- }3 x0 S. Z9 i# l' h  M1 w6 |4 [
(2)输入的高电平为5V: 要用到 5V容错I/O端口 其中 VDD_FT(3.3V)
0 J' ]0 {. p7 Z/ q# i当输入为+5V​时,上面的二极管导通,连接 VDD_FT(3.3V),将输入的5V​稳压到3.3V​,从而保护了电路
" @6 a, E; M+ H* m
$ _* c/ V$ Y9 n: P  D P@ZRXCS4)B4@ZM`7WJORM02.png
/ g9 R2 v# H- o2 v" `* J( |
' l6 x! o: R1 H& W0 V+ @(3)当输入为-5V​时(和5V方向相反),下面二极管导通,连接VSS(0V),将输入的-5V​稳压到0V​,从而保护电路. m$ J' A5 b  c& A. ^1 ]( H; A
( a$ m" U3 z6 T
)97MCXMPI9VFCKEZHAKI9(G.png
  H( v4 y: f* z# w) T$ o# w" w" Q3 [* u, W
上下拉电阻
" G; @* O9 j. Q当某个引脚处于悬空时,其输入电平不能确定,既不是高电平也不是低电平7 p3 M2 ^. n4 }# A: m) N% F6 i

& n( j9 @( f, J7 q( |5 e" `+ e上拉下拉电阻用于处理IO口不确定的电平状态,强制性的将电平拉上或拉下
/ ], k; x: t- {$ G7 N
# Z* ~2 K7 V- t; k: _/ Z1 c. z' y! M注:当输入为确定的高电平或低电平时,上拉下拉电阻将不起作用
; V( _; E# u6 {$ i: z/ G5 d9 G, }
' V  W! }4 v' a! ?3 b9 r1 u% Y上拉和下拉都各有一个开关,当输入电平不确定时且上拉或下拉开关闭合时,不确定的电平就被强制性的转换为高电平(上拉开关闭合)或低电平(下拉开关闭合)
. h# `2 o* ]  n0 K$ ^9 W
5 ?+ k$ S0 \3 }- A! [上拉电阻:将上拉开关闭合,输入的不确定电平被强制上拉为高电平8 k& t/ Q4 i0 [
; `9 Q: U6 A0 B) [# g

% h2 L0 r2 }  J, C0 X; P  u! L5 t9 r7 W7 T
下拉电阻:将下拉开关闭合,输入的不确定电平被强制下拉为低电平
2 m; e8 c& K7 Z0 t0 e% M
+ L7 l; }0 P8 Q- H( j. T* G. k$ V YOQUVW0S]8MH49B{)$CZ``B.png ; E7 r0 Q6 p  m, ]6 y; _) m
3 F2 [& T6 r, i) [9 {  ~; |
小结:
/ G+ s. ~5 R; T7 E  }) E) w/ G& j: c3 y) }' f$ s  r6 t5 Z
2$$OR)67$L1ZFHEVQHO_UJO.png % ]" |  f  [) J( {6 n) i
6 T3 i$ O" u( y6 H3 D7 c
三、GPIO工作模式- O. G: \8 b  s' r; V% k
为实现不同的工作要求,GPIO有8种工作模式。每个I/O口可以自由编程,但I/O寄存器必须按32位字被访问。
3 n! m' L$ v/ V9 B7 z
" I8 H7 @* P% x: I8 Y 8%~B~J2{6Y98XLX~Q3[B`{E.png 1 R3 v2 X! A% `
/ L8 Q7 l8 ]3 Z- s, j# U
1.浮空输入
5 S  \9 B9 c( ]9 Q+ f浮空输入:复位上电的时,引脚不确定电平的高低(既不接电源,也不接地
, i# q% h, D2 n
, S" m1 b9 V" N' u0 Z4 @+ L % H5 _5 u; {4 d/ Z( o, K
2 @3 t1 d8 a; b. ]
(1)外部通过IO口输入电平(上下拉电阻处于关闭状态)" J/ s! n' x4 Z* Q1 r

. p; w4 o8 A0 m. c1 \* j(2)传输到施密特触发器(此时施密特触发器为打开状态)
2 A$ C3 ?, w. w7 d5 Q
  }' D# ?9 t  d(3)继续传输到输入数据寄存器IDR, ^; L9 o+ f1 K5 n: q8 y6 Y; ~1 C6 s
& V4 W6 C7 t4 L
(4)CPU通过读输入数据寄存器IDR实现读取外部输入电平值
. M0 z& w: |( U$ v, d/ G$ S% C+ r" K
2.输入上拉模式
" Y# @' a0 d. V# d  q" {3 ]8 }输入上拉模式:与输入浮空模式相比较,不同之处在于内部有一个上拉电阻连接到 VDD(输入上拉模式下,上拉电阻开关接通,阻值约 30-50K)4 d- \6 O: J6 @6 N2 o* d

' |' G! M3 N9 p, D: Z# h3 y( T/ ]) Q HZ)I56NI_[O9XG(9JKVW20G.png & M: s  ]$ z; \4 r; V4 F' Q
, v5 @1 _$ E% h3 K' a% E, l9 j
外部输入通过上拉电阻,施密特触发器存入输入数据寄存器 IDR,被 CPU 读取,当输入管脚悬空时不受外部噪声信号干扰。) g1 a. w: O6 G+ c7 j# I8 x

$ V1 F% }3 a, Y) O& P6 B无论输入管脚悬空或者被高电平驱动时,读取的都是1. 只有在输入端为0的时,读取到的值才是0。因此采取的是非0输入模式。即若读取非0,即为1,若读取为0,即为0。强制上拉,一般是为了输入强高电平
. T# Y, z. M7 l$ s. v& @7 x
7 I, |# ~4 S8 c5 Z( e; j3.输入下拉模式+ O  J+ [" ^: p) R
输入下拉模式: 与输入浮空模式相比较,不同之处在于内部有一个下拉电阻连接到 VSS(输入下拉模式下,下拉电阻开关接通,阻值约 30-50K)! P- r  q) k, v$ e

' F8 K" U& a# `: f) j _M(P9B}M9E%HZM2C@Z]$AII.png
, Z! w9 G& a7 }# q* S  @% H' J/ _5 E: I# F; n6 N! X
外部输入通过下拉电阻,施密特触发器存入输入数据寄存器 IDR,被 CPU 读取,强制下拉,一般是为了输入强低电平( C7 B5 P' k. g, p

' k. B, [" v6 X5 S4.模拟输入模式6 c) S$ W% a6 x
9 [; v" V* v; u6 j. x2 k
P}YCDKRYGE2PANM~(V[0EDR.png 5 w0 D* V1 g4 C
上拉和下拉部分均为关闭状态,施密特触发器为截止状态,通过模拟输入通道输入到 CPU,IO 口外部电压为模拟量(电压形式非电平形式), 作为模拟输入范围一般为 0~3.3V+ O. D" t$ c( ?8 a8 h7 b
; y7 |, u5 t* [; M. E
将IO口作为模拟输入接口,输入的可能是变化的值,接收外部的模拟信号输入
# G" n5 t# Z8 M9 U7 q. L" O$ N( E" X) i6 a: l
5.开漏输出模式
$ T( ?& y5 h, P. D开漏输出即三极管的集电极或者MOS管的漏极进行输出0 ], Y( Z4 e# v% {

: `) Q1 m4 f$ T. o: T# E' N6 O开漏输出可以实现线与功能。开漏输出只能输出强低电平,高电平需要依靠外部上拉电子拉高,适合做电流型驱动,吸收电流能力较强
% q+ d8 r, l" `- e1 _5 y/ p. n
  S! i. g5 M7 Y! i: t注: 在输出模式下TTL施密特触发器为开启状态,所以输出模式下仍存在输入
+ |" R8 X! ]: b- Q# N) H0 C) H) D0 G* ^4 f/ X
1TR45RR1)%@~ORX`09ASU4R.png 1 ?# ^3 _; l/ L0 f% p5 s8 y

& ~4 `7 N2 y  S1 s! _(1)CPU写入位设置/清除寄存器BSRR,映射到输出数据寄存器ODR: @0 R8 B6 k/ Z: \
& s) W( \9 {9 {# M' z
(2)联通到输出控制电路(也就是ODR的电平)
- q; K4 L4 z+ q4 A. O% k: c) O; H& D$ g6 c
(3)ODR电平通过输出控制电路进入N-MOS管
0 U8 c+ A8 A' z  d4 r# I
* ]% h! x  l% O$ _% q) K& @8 Z" g! f开漏不使用 P-MOS(输出1) ,故输出不为 “0” 或 “1”,而是 “0” 或 “浮空”4 Q0 N& z0 k5 f- `) P$ [3 y
+ n# ~- g7 c% G* U3 Q5 h" F; }
(1)写0传输到MOS管处,N-MOS 导通,输出为0% T% \8 T7 k# l1 U" c1 f
(2)写1传输到MOS管处,P-MOS 和 N-MOS 都不导通,输出浮空
& X2 v+ ~) k8 I1 u0 p+ K! e# h$ ^8 I" M3 F
(1)ODR输出0:
0 P/ g% Q1 v3 d% Z7 tN-MOS截止,IO端口电平不会由ODR输出决定,而由外部上拉/下拉决定" d3 E' X3 n( Y+ b: I
8 I* \2 [& }7 b& b7 ]8 r2 f4 w, L3 Z
在输出状态下,输出的电平可以被读取,数据存入输入数据寄存器,由CPU读取,实现CPU读取输出电平
; r* H. U; H( e, C8 f  r9 a% F! k3 d/ Y% Z1 {. n! A; H# u
所以,当N-MOS截止时,如果读取到输出电平为1,不一定是我们输出的1,有可能是外部上拉产生的1. @. _' m7 A( S- U2 [

5 T; \9 y: y1 g, S5 ~(2)ODR输出1:
. H2 O7 D& h2 l1 ^9 C% R+ oN-MOS开启,IO端口电平被N-MOS管拉倒VSS,使IO输出低电平。此时输出的低电平同样可以被CPU读取到
. X: L$ O8 o/ q
( m! G) w" I' Q+ y8 W* k, B开漏输出为不确定状态,不具有驱动能力
  \$ u! V1 K- d# E6 C" x( e3 V; b2 N
* f2 P+ p8 }: T& g2 V6.推挽输出模式
: h& S" A" }& c. k& h
推挽输出使用 P-MOS和N-MOS ,输出为0或1  G6 Z8 q" T1 `, b0 u: L  Z
4 q  C4 X8 f+ k6 Z1 n0 t! K9 @1 B
YC9V7@3~P~A)B}%9R3(AB}N.png
% Q( c3 \7 M# j' G; z) v3 `+ E! ~( {3 @" \! G' ~; S  b
推挽输出可以采取强高/强低输出,可以连接数字电路
1 c7 ]' V2 f. `' t: ?- S
0 h* B2 N* |& e8 _: J7.推挽复用输出模式
' `+ l3 S* Y1 W( B
' P6 D- F  P- R! T* Y, l* u LELCOLXI2`S)TGG_FGM1902.png $ {8 Q2 ]# {6 _" L, C# c
与推挽输出模式唯一的区别在于输出控制电路之前电平的来源
0 N; R/ U: y2 h$ W1 O! n推挽输出模式的输出电平是由CPU写入输出数据寄存器控制的,推挽复用输出模式的输出电平是由复用功能外设输出决定的
2 I( k, u; Z% `7 }2 O; H" F4 y0 {' ?! t2 g
8.开漏复用输出模式
' d6 Y3 ?" U( |9 G

2 {1 x6 I  [% l; M V236_PO}@JP$B[WVSSQ5EVM.png
: u1 ]3 h2 S7 U/ K与开漏输出模式唯一的区别在于输出控制电路之前电平的来源0 e9 w% F# g1 m" T
开漏输出模式的输出电平是由CPU写入输出数据寄存器控制的,开漏复用输出模式的输出电平是由复用功能外设输出决定的  b7 g# D& v6 ]. m
% K$ L7 ^2 m/ R; T
小结:
% x7 S8 u  m/ v: ?8 M( O4 \(1)推挽结构:两个参数相同的三极管或MOS管分别受两互补信号的控制,总是在一个三极管或MOS管导通的时候另一个截止。高低电平由输出电平决定
1 X$ j) ~4 h) J* I8 V" _) \; J* Q2 o; w
(2)开漏输出:只可以输出强低电平,高电平得靠外部电阻拉高。输出端相当于三极管的集电极。适合于做电流型的驱动,其吸收电流的能力相对强, 由于输出电平完全由上拉电阻连接的电源电平决定,很方便的调节电平转换: x: g6 C% y  X
( p. x7 _) N" t  Y4 C. n
可以实现"线与"功能,"线与"指的是多个信号线直接连接在一起,只有当所有信号全部为高电平时,合在一起的总线为高电平;只要有任意一个或者多个信号为低电平,则总线为低电平% G" @2 k! l! c

% E  @+ U4 V- `! M- O* U( K(3)推挽输出:可以输出强高、低电平,都具有驱动能力,可以连接数字器件8 U: Z/ N$ o7 w* T, h+ k
1 }# L, q# P# K, V
四、GPIO寄存器组

7 \. H% P3 z1 H/ kSTM32G4系列控制器参考手册 : 查看GPIO寄存器+ w2 i* A" U- R" f! I" o8 _# z
7 B/ V/ F, O, M! w6 q
S]}D5NI2GRL$A@~UO}0FC%S.png & @9 m% m3 Y7 P" Y: `: |

- Z* Y1 J! v0 N! a每个GPIO包括10个寄存器来配置GPIO的具体功能(每个引脚功能都是完全可以独立配置,互不影响):
/ ^8 X8 y$ Q+ H2 p" ?" [
6 T& {7 K1 a# G  lGPIOx_MODER:GPIO 端口模式寄存器
9 S: L: D( C4 PGPIOx_OTYPER :GPIO 端口输出类型寄存器
+ D3 c! D0 G, i+ i1 W: g0 xGPIOx_OSPEEDR :GPIO 端口输出速度寄存器
/ ?' Y, y  Q; m0 L0 w# s* h/ jGPIOx_PUPDR :GPIO 端口上拉/下拉寄存器9 l# A" ^" g5 ~- n
GPIOx_IDR :GPIO 端口输入数据/ n1 I3 [( ~# O3 d
GPIOx_ODR :GPIO 端口输出数据寄存器
& u4 V; ^0 X5 L( @- R6 C2 nGPIOx_BSRR :GPIO 端口置位/复位寄存器
' a1 h# w5 W' qGPIOx_LCKR :GPIO 端口配置锁定寄存器+ \' {5 b, r8 U' O7 N% f! W
GPIOx_AFRL :GPIO 复用功能低位寄存器6 U# M$ R" ~5 c- v
GPIOx_AFRH :GPIO 复用功能高位寄存器
8 }+ x5 m1 x* h2 h9 VGPIOx_BRR:GPIO位复位寄存器' U4 o& V* {" r' q. k7 Z+ F4 b

$ x" A/ f+ T9 r" J! M. ^ )N$%}HJMVIYZNOC~M]C~V.png
5 g. ~+ Z6 U9 x: |. D2 `" i3 J7 A
- P6 j3 b; x5 A$ e  \, K# F, s* W0 D2 B6 A3 t

- ]  y- t& {. e- b* A, @1 _; p' J9 B- Y0 I. l; m& J

$ z& v& `# [' T4 o
收藏 1 评论0 发布时间:2022-7-6 14:00

举报

0个回答

所属标签

相似分享

官网相关资源

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