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

STM32 GPIO的工作原理和配置

[复制链接]
STMCU小助手 发布时间:2023-2-1 21:37
一、GPIO是什么?
9 o( S7 d3 K. N+ p1 V  GPIO,全称为General Purpose Input Output Ports(通用输入输出端口),也就是通用IO口。) L! M% }/ `1 @

1 {0 U$ P2 c$ T  GPIO是控制或者采集外部器件的信息的外设,可以由软件程序控制,用于输出或者输入高低电平。5 M" j& T# P" X' H0 [6 Z$ x- D

3 T: S; t* X6 B# S; L9 c6 E  GPIO的使用非常广泛。可以与硬件进行数据交互(如UART),控制硬件工作(如LED、蜂鸣器等),读取硬件的工作状态信号(如中断信号)等。
3 T4 S9 a! u6 y- z

$ u2 e* C/ L/ _( p/ \4 v& N0 S  GPIO按组分配,每组16个I/O口,组数视芯片而定。' ?5 B3 k4 L0 a/ T8 ~* o4 {7 y
  以STM32F429IGT6为例:
( I; {& ^7 d7 i    ① 一共有9组IO,PA~PI。
: e" D/ V4 Z) |) L! ~: H+ b# c    ② 一共有140个IO口,其中PA~PH每组有16个IO,PI只有12个IO口。
6 V8 l7 e% g" f3 }8 Q

2 A4 {: D  h! O* r+ h% R  注意:芯片的数据手册中,引脚标注为 FT 的,是可以兼容 5V 电平的。* V& u0 {3 @8 l% F

8 b. E  N9 N. [' IST官方提供的GPIO基本结构图
3 N  t4 o- g# _! u- B) Y3 I" Q
4 P4 Q  K  P, j8 v( }
8bea383ab6aa44cfa614f58d126c5b6e.png
! z( b% n' s0 W* S
; d5 ~. W! K3 H* H+ A  M; Z8 M
二、GPIO的8种工作模式
! ^1 _3 s) {# |# f% `: I  8种工作模式,分为4种输入模式和4种输出模式。( Z3 S5 s$ w- n' G" T' [: ?
# d; H. D  S; V! M+ k& u  E
1. 浮空输入模式(GPIO_Mode_IN_FLOATING)& e; O. x, m0 `$ Z
  浮空输入模式下,上拉/下拉电阻为断开状态,施密特触发器为开启状态,I/O引脚的输出功能被禁止。
, c8 z$ `+ ^9 z) f$ M' }& F# Q
; l6 T# O+ @# Y  Z) N# ]' \- `
  该模式下,外部的电平信号通过①(I/O引脚)进入MCU,先经过②(施密特触发器)的整形后,再进入③(输入数据寄存器),最后MCU可以在④(输入数据寄存器的另一端)随时读取I/O引脚的电平。
, l/ U* G7 Z& n" o6 U0 q+ Q  即,整形后的I/O引脚的电平信号直接进入输入数据寄存器,MCU直接读取I/O引脚的电平。
# Q# @  N1 ]& H+ j2 {: ~/ T
$ Q2 L# i4 E. P
  如果I/O引脚无输入时,MCU读取到的电平状态是不确定的。所以引脚不建议悬空,易受干扰。- U) O! j1 X9 Y7 V* }+ ^
  如果I/O引脚输入高电平时,MCU读取到高电平1。' Z! J% A; c2 y( h, Z
  如果I/O引脚输入低电平时,MCU读到低电平0。) I% p" m/ X4 U* Z3 U- w9 @; }

7 n4 [, ]& p* D2 d  q
  总结,浮空输入模式:; y) s1 D9 L7 K, w
    I/O引脚输入什么电平信号,MCU就读取到什么电平信号;/ b/ H  |" ?5 U) `
    无信号输入(默认)时,MCU读取到的电平信号是不确定的。
, p3 [- F% |# H6 f* z$ ~4 N$ p0 T( q5 {3 _" T2 t
  浮空输入模式,可以用于KEY识别,RX1等。
9 H: u1 L. N1 ]1 S
6 k8 O1 r4 T" o
fabbb1f2acbd43b1bba7afe5fa5077e5.png
' Z$ r. {; T' w- L  I! d: \) H. H5 }

7 @: l5 u- R# Y9 m
2. 上拉输入模式(GPIO_Mode_IPU)
# s8 p+ M) v- E2 U  上拉输入模式下,上拉电阻导通,施密特触发器处于开启状态,I/O引脚的输出功能被禁止。
! p: z" Y" o2 a6 U, m  GPIO的内部上拉电阻的阻值较大,所以通过内部上拉输出的电流是很弱的,即“弱电流”。0 }+ b3 I" u& j7 ]
  如果需要大电流用作电流型驱动输出,还是要用外部上拉电阻。
/ T: r$ h% z  [: H! t& c5 R
; c! C' Y7 C- B$ K  I
       上拉输入模式与浮空输入模式不同之处,是在①(I/O引脚)和②(施密特触发器)之间接入了一个上拉电阻,将电位拉高,比如拉到VCC。1 c% z$ l4 B+ C& \8 ^

% I5 w/ h" @. N; V4 x/ K$ P, ^
  如果I/O引脚无输入时,I/O引脚处相当于断开,上拉电阻的电流直接流向④,MCU读取到高电平1。
3 s( x/ [% @- ~  如果I/O引脚输入高电平时,I/O引脚的电压等于VDD的电压,电流还是流向④,MCU读取到高电平1。
0 ^' [, q$ r( H4 P2 S3 i  如果I/O引脚输入低电平时,I/O引脚处相当于接地,上拉电阻的电流直接流向I/O引脚,MCU读到低电平0。8 s8 P) Q. Q, }) @0 ]: @- W2 `$ n
* F# Y) P& Z  a, k* U" m$ n3 T
  总结,上拉输入模式:6 L0 m' D$ j: w8 W  ^/ ]
    无信号输入(默认)或输入高电平时,MCU都是读取到高电平1;3 v5 }# _, M7 Z1 g9 J1 `
    输入低电平时,MCU读取到低电平0。- p. l$ ]% k5 R# l. `3 {9 |
. A  e( T& v3 I3 O8 Y
  上拉输入模式,可以用于按键检测。5 A& S& S  O# m( H2 s2 i4 [9 B# K
9 `& O; Z/ a+ B
ceb19f5f5d984679a43f899a6919d100.png - ^! [- |, o* f7 S* T4 E) h/ Z! y

5 x: }1 S7 D4 j
3. 下拉输入模式(GPIO_Mode_IPD)
# \- e7 z* H2 w2 O  下拉输入模式下,下拉电阻导通,施密特触发器处于开启状态,I/O引脚的输出功能被禁止。
  ]$ E; m& T& m; b$ i3 d  A4 N* K1 p9 q% S4 R# W) O9 y
  下拉输入模式与浮空输入模式不同之处,是在①(I/O引脚)和②(施密特触发器)之间接入了一个下拉电阻,将电位拉低,比如拉到GND。
( t  G. R% d& Y3 |3 `& c: ^0 p3 G0 N# m" [. l/ U6 L
  如果I/O引脚无输入时,I/O引脚处相当于断开,I/O引脚的电压等于VSS的电压,MCU读取到低电平0。
8 D! [- j& c9 p2 `' ^) U' V' Z  如果I/O引脚输入高电平时,由于下拉电阻阻值比通道④的阻值大,所以电流流向④,MCU读取到高电平1。
, H0 g0 C% \: j" `+ m/ p  如果I/O引脚输入低电平时,I/O引脚处相当于接地,I/O引脚的电压等于VSS的电压,MCU读到低电平0。
& {9 e+ d" F8 f2 x+ t
- h; J. t% ]7 C( R' n+ Y9 [  总结,下拉输入模式:
6 ^% a, Y, ?# ^    无信号输入(默认)或输入低电平时,MCU都是读取到低电平0;4 i3 X: @4 t  G) m
    输入高电平时,MCU读取到高电平1。
. V3 U0 _) I1 q" _8 v! D2 i( z( ~+ q' p! e- K" l
  下拉输入模式,和上拉输入模式相似,可以用于按键检测。$ @  b" k- L' {
6 j: W! c; }0 D* y3 [3 C( m
2f9bc70a88cd487a87c9ce33d4e14f34.png
. V. |9 o% q" Q- V" k8 B$ S

, U; G, O8 P( o5 R: \4. 模拟输入模式(GPIO_Mode_AIN)
1 q) ^( A8 T" b2 X* f* V  模拟模式下,上拉/下拉电阻为断开状态,施密特触发器为关闭状态,输出部分的双MOS管也断开。
/ q6 Z  P) |6 S$ q/ {. f% [, R/ ]9 x" G: Y
  模拟输入模式下,外部的电平信号通过①(I/O引脚的模拟输入通道)进入MCU,MCU可以直接在③(模拟输出口)随时读取I/O引脚的电平。3 o4 N- _' s" Y; L  o1 K
3 v. i# g( o* k$ l4 M  C! e/ a
  由于施密特触发器断开,所以电信号也无法进入输入数据寄存器,所以MCU无法在“输入数据寄存器”中读取到有效的数据。
) I3 E7 ?" J1 B; W$ F% T% u& _; i' x% [- G! h: a0 a
  总结,模拟输入模式:! `3 @& U0 O  i/ P  J* S# p: k
    输入的电信号为模拟电压信号,而不是数字电平信号。
7 g& p+ E$ t5 X; h    模拟输入的模拟电压信号,直接送到片上外设,一般是ADC。. |+ T  J! c* ?; a( x
    除了 ADC 和 DAC 要将 I/O 配置为模拟通道之外,其他外设功能一律要配置为复用功能模式。9 c5 s9 m/ e$ {& `1 V
- J, ^  `, I7 x7 b8 O9 Z7 C
  模拟输入模式,可以用于ADC采集或DAC输出,或者低功耗下省电。
9 y+ H2 r3 n, w; |& P+ }' t3 l6 ]) L4 u- w) }0 C

- S2 z5 J  _6 L# l, ]$ ~  U2 I1 d
4 H1 [' Q! V' m8 Z1 O) F5. 开漏输出模式(GPIO_Mode_Out_OD)7 }+ r8 a+ d* c+ O. }
  开漏输出模式下,P-MOS管一直处于断开状态。
( o! b, F! Q6 Y3 j3 Q  @% H
4 E! S: @2 I! o5 l1 m! f% x

2 H. R; K' z2 R; Q+ R) L- D  开漏输出模式下,MCU通过左边的①(位设置/清除寄存器)或(输出数据寄存器)写入数据后,该数据位将通过②(输出控制电路)传送到④(I/O引脚)。
/ z2 {& X( w5 z9 ?9 F; R) ~$ h! P  同时,输入功能可用,⑤(施密特触发器)处于开启状态,可以通过⑥(输入数据寄存器)可读取④(I/O引脚)的实际电平状态。
0 l+ @! `" l! [0 Q5 h' ~' q$ q: o8 S4 ^6 A1 R* v
  当MCU输出低电平0时,经过“非门”后,转换为高电平1,N-MOS管导通,使I/O引脚输出低电平。
8 y* D9 e  J6 G2 `  当MCU输出高电平1时,经过“非门”后,转换为低电平0,N-MOS管断开,I/O引脚处于悬空状态,此时I/O引脚输出的电平高低是由I/O引脚外部的上拉或者下拉决定。
: T- X7 X7 g4 h3 _; l4 J0 O; f3 E7 D; t$ v2 ]% V, {+ |8 q4 y
  开漏输出,输出端相当于三极管的集电极。要得到高电平状态需要上拉电阻才行。适合于做电流型的驱动,其吸收电流的能力相对较强,一般20mA以内。$ E+ Q6 T) b; G1 d  i
8 J4 W  G. I9 K; I9 q* ~+ N
4f16d647eafe454983424cf0242b3378.png
6 o0 A$ G) b/ n. i' f& u- z  b9 R) a2 V
6. 开漏复用输出模式(GPIO_Mode_AF_OD)
; v0 Q- H0 h  G' K; X, z+ @# I! H& I  GPIO可以是通用的IO口功能,还可以是其他外设的特殊功能引脚,这就是GPIO的复用功能。* w1 i) |) S9 ]$ y+ H
! P1 \" C6 X# @! P
  GPIO复用为其他外设,输出数据寄存器无效,④(I/O引脚)输出的高低电平由①(其他外设的输出)决定。
4 V' V8 d; R, h8 c( [5 c  同时,输入功能可用,⑤(施密特触发器)处于开启状态,可以通过⑥(输入数据寄存器)可读取④(I/O引脚)的实际电平状态,同时外设可以读取IO引脚的信息。
$ m7 Y( ^5 c) a! k+ v! g$ O! v
% v2 U& k$ G7 A% I  开漏复用输出模式与开漏输出模式的配置基本相同,除了输出信号的来源不同,其他与开漏输出模式的功能相同。0 x* |' }! }# _1 @9 w* A
  即,②(输出控制电路)的输入,开漏输出模式是由输出数据寄存器输出,开漏复用输出模式是由其他外设输出。
/ m7 A$ _9 `/ B6 s- D
" D- o" p' ~, z
bf609dfdcc67416a9d1552a70fe4d125.png 8 I" I' S5 ^- f: ~) W& F

. w& @; ]  j2 I! M7. 推挽输出模式(GPIO_Mode_Out_PP)
& \: ~3 z- j. U2 X  推挽输出模式,从结果上看它会输出低电平VSS或者高电平VDD。推挽输出跟开漏输出不同的是,推挽输出模式P-MOS管和N-MOS管都用上,可以把“输出控制”简单地等效为一个非门。
1 _- a- u& n; I0 H) F8 p4 g4 Y+ X& ~
  当MCU输出低电平0时,经过“非门”后,转换为高电平1,P-MOS管截止,N-MOS管导通,使I/O引脚下拉到VSS,即I/O引脚输出低电平。/ }, G# A# ]/ W+ z$ p4 q
  当MCU输出高电平1时,经过“非门”后,转换为低电平0,P-MOS管导通,N-MOS管截止,使I/O引脚上拉到VDD,即I/O引脚输出高电平。" P0 e& S3 }5 A# V: U+ U. E
  同时,输入功能可用,⑤(施密特触发器)处于开启状态,可以通过⑥(输入数据寄存器)可读取④(I/O引脚)的实际电平状态。! s+ v! o/ ~3 L& h3 F

- o  Z7 f4 A9 W5 \  总结,推挽输出模式下,P-MOS管和N-MOS管同一时间只能有一个MOS管是导通的。当引脚高低电平切换时,两个管子轮流导通,一个负责灌电流,一个负责拉电流,使其负载能力和开关速度都有很大的提高。' ]* g: t6 z+ N" ]# D
* K$ \2 r* ]% r- H
  由于推挽输出模式输出高电平时,是直接连接VDD,所以驱动能力较强,可以做电流型驱动,驱动电流最大可达25mA。该模式也是最常用的输出模式。
( f- `3 c7 q7 F: P; U! H& l+ y) o
a1528fd645af410d89c874c179b6bf91.png 2 h1 _! W) q: ]

$ Q% F; r* t0 `  l8. 推挽复用输出模式(GPIO_Mode_AF_PP)
6 v% l2 O) }; n' c  GPIO可以是通用的IO口功能,还可以是其他外设的特殊功能引脚,这就是GPIO的复用功能。( @1 O! C! m: a2 T$ U( H( ?- y8 O7 W( {
0 k7 S& D: H, J- o; Z' C1 r
  GPIO复用为其他外设,输出数据寄存器无效,④(I/O引脚)输出的高低电平由①(其他外设的输出)决定。# q  I2 x) t. o- k- y
  同时,输入功能可用,⑤(施密特触发器)处于开启状态,可以通过⑥(输入数据寄存器)可读取④(I/O引脚)的实际电平状态,同时外设可以读取IO引脚的信息。& a" i0 _8 G- [, }8 t
. f4 M+ ]/ ^( ^! [, D
  推挽复用输出模式与推挽输出模式的配置基本相同,除了输出信号的来源不同,其他与推挽输出模式的功能相同。
+ U1 W; d+ `0 t! |( r1 a  即,②(输出控制电路)的输入,推挽输出模式是由输出数据寄存器输出,推挽复用输出模式是由其他外设输出。
5 F  F& T6 V& b9 x0 w6 z, B* e% q/ H! {3 c- _1 j
3b3e3b3e8c874c479509ad7d9206bff2.png 7 J/ u" {2 a, A% `

. f& Y  L, v. g9 u8 h5 {7 b三、GPIO寄存器9 L8 D# B) x; e( A  ?" m5 z0 E
  每组GPIO的寄存器包括:2 R4 k0 w- y) W5 y9 S" B- {: K
    配置寄存器:$ A7 a: C) m' ~- }, B: Y. c& g
      一个端口模式寄存器(GPIOx_MODER)
3 T; H1 M* ~& A2 H- h4 L; W      一个端口输出类型寄存器(GPIOx_OTYPER)  o. @* I5 ~) Q1 g+ x1 @
      一个端口输出速度寄存器(GPIOx_OSPEEDR)
# I9 w( @. z* p      一个端口上拉下拉寄存器(GPIOx_PUPDR)
+ M, ]! Y) A: _) K. i

- W9 V) ?9 L6 \7 @; j    数据寄存器:4 `9 y8 \) c5 v% @! L$ F
      一个端口输入数据寄存器(GPIOx_IDR)
. k: p8 E6 m- s, Q9 ?6 X7 y1 {  Z      一个端口输出数据寄存器(GPIOx_ODR)
) A0 ]8 y' G6 l) u, w8 K" c
! |% `+ B2 I6 k5 u+ r  _
    置位/复位寄存器:
" D/ y: b# C) b0 i7 Q) Z6 [$ B% B3 i      一个端口置位/复位寄存器(GPIOx_BSRR). v8 Q7 ~- c6 F' s
+ i% D( H: t8 w: Y
    锁存寄存器:7 i- p$ Z; d1 N: u
      一个端口配置锁存寄存器(GPIOx_LCKR)( Q8 Q$ P5 O% \) E8 k4 a3 U# M

. T( p( u$ @& F    复用功能共寄存器:! s. q) Q( @( e! T1 c0 X( `
      两个复用功能寄存器(低位GPIOx_AFRL & 高位GPIOx_AFRH)
/ s) [* R3 }$ B) |, K, @8 g- Y; P- H6 y( o
注意:
  }; O4 {( x  P6 t7 v/ o    ① 每组GPIO由10个寄存器组成,如果芯片有 GPIOA ~ GPIOI 9个组,那么一共有对应90个寄存器。, |/ H% e+ B/ N1 [" R
    ② 如果配置一个I/O口需要2个位,那么刚好32位寄存器配置一组16个I/O口。( L9 L# z1 \9 X- d) D
    ③ 如果配置一个I/O口只需要1个位,一般高16位保留。2 {4 S& d  `3 |
    ④ BSRR寄存器32位分为低16位BSRRL和高16位BSRRH,  A% J4 R& V8 c' _& |3 J" H
      BSRRL配置一组16个I/O口的置位状态(1),- `5 P, D6 V; F5 B
      BSRRH配置一组16个I/O口的复位状态(0)。) \7 w! F- {9 [: h( N* a
    ⑤ rw表示可读可写;r表示只可读;w表示只可写;Res.表示保留位,必须保持复位值。" \' Q* a) n/ O' P% x- r
: \" h0 D, B* C& ]* i2 h9 y
QY[R__HDX{4@_P106U]@KEN.png
8 `* R1 H$ d/ V6 x

1 S, a, ~2 g, K4 g! f; Q1. GPIO端口模式寄存器(GPIOx_MODER)
! [8 E$ M0 K4 ~* K9 F$ ?* U. D  该寄存器是GPIO的模式控制寄存器,用于控制GPIO的工作模式。
& P2 G$ m0 u$ n4 M: E3 k" C9 {+ t8 C. m  该寄存器共32位,每2个位控制1个I/O口。
' z; z: c0 q; x
( J) [4 Z+ z0 ^: |# L7 t, j  以 GPIOA = 0xABFFFFFF 为例:
9 y# m7 F3 l1 X2 K$ G    ① 低16位的值是FFFF,都是1,即 PA0 ~ PA7 默认都是模拟模式。/ r% c* a6 W4 h: t
    ② 高16位的值是0xABFF,即 PA8 ~ PA12 是模拟模式,PA13 ~ PA15 是复用功能模式。0 g6 I, N, Q  m+ e5 m# ~

4 g# A: i; z6 g( p6 g
AH2G}26%B][KN)1O]06}X~W.png R7V{4%]JUY%NFLOBS{H(6TQ.png
9 F/ \) |3 I) ~7 b7 b# z8 p# d: R0 ]5 s9 s
- k  G/ }# h7 l' n
OOMVS{`_Z8W`7}]A02]E6D1.png JA8ZGXSR9IK%B%`3LPLS9%I.png # D- w; T- h- W* a9 o0 [) y3 D
5 Q# j, q0 ?  T$ v" s7 A
$ C% {( M9 n2 _% G# g' L& F
位 2y+1:2y MODERy[1:0]:端口x配置位(Port x configuration bits)(y=0…15)
% z$ o* Q7 d% a1 {, I         这些位通过软件写入,用于配置 I/O 模式。
4 w  F5 @1 A( I8 i& N# X          00:输入模式(复位状态)
% J& P% X" ]7 `+ {) w; ^          01:通用输出模式
: {& Y! ^4 c; G( U% B4 h          10:复用功能模式6 U1 P9 m; ^: t; Q! i5 `6 x2 e4 V  ~
          11:模拟模式( X9 h6 O, e! W& p! o& K. ^
; v( t) ]6 {/ d% e
2. GPIO端口输出类型寄存器(GPIOx_OTYPER)
4 L& ]6 b, [! Q% u  f3 {7 g; E7 `' w  该寄存器用于控制GPIO的输出类型,仅用于输出模式,在输入模式(MODER[1:0] = 00 / 11 时)下不起作用。! p& ]' C( A# O( ^5 k" T
  该寄存器的低16位有效,每1个位控制1个I/O口。8 ^" d" A+ F; k0 p( W
, K) g* M+ l. s9 r) A, A5 h! e
  复位后,该寄存器的值均为0,即I/O口在输出模式下默认为推挽输出。
3 T, x3 A- M( @) ?. d" h, v, D1 @1 m
O2IH6(WY3130OHOJ27L(VH3.png ~_YZC)F18{B6Z2X%CH_`{YX.png
9 `( ~1 d  r0 Q. X9 u) p  T0 H4 w$ q  k
V(BGF0RBV5Z8][ST[TQA1Q3.png Z0MF9OM{TZA5{SK0B(_CQGJ.png
% B8 l5 p5 N$ G$ Z4 p, f
6 B7 g$ d  I3 ^( A0 h. s2 A位 31:16 :保留,必须保持复位值。1 B5 b% Z; E# O
/ \0 r0 u) s7 M( L1 ]8 D! Q3 v
位 15:0  OTy:端口x配置位(Port x configuration bits)(y=0…15)% o2 r; @5 W* Y) J6 ^) B
       这些位通过软件写入,用于配置 I/O 输出类型。6 n0 C6 ~! C. K' U# r+ Q
        0:推挽输出(复位状态); {5 H2 T0 s  P$ w
        1:开漏输出
3 m# S7 _6 r0 Z3 {, i* j6 X& L2 z
1 A  D0 T4 T( }0 |$ g, S2 ?3. GPIO端口输出速度寄存器(GPIOx_OSPEEDR)
3 P! q+ ^8 X5 n: @8 N$ ]2 f( Y  该寄存器用于控制GPIO的输出速度,仅用于输出模式,在输入模式(MODER[1:0] = 00 / 11 时)下不起作用。
+ E9 O7 Z: {, ~" N6 i, [  该寄存器共32位,每2个位控制1个I/O口。: Y' K, ]1 M+ h# {- W* Z+ r
! g# S( c6 l) C* A+ e& Z
  复位后,该寄存器的值均为0,即I/O口在输出模式下默认为推挽输出。
" [0 g) I3 X) v4 a [EQ0_~RWQC{SV{I`UGK1GKO.png 7GBHESLVM%LF~]Q_[BOF{ES.png * J3 |4 `& q/ [0 c- y6 x" \3 x

( C, ~+ w! j+ R7 `) p& R {IWD0VG2CL1KY1~J[`{ESVP.png (0N@``S(Y419T6JEA}32(D2.png
: u+ C5 u5 H6 e; |. O. @
3 l4 i1 \5 t3 g4 m
6 g: K4 U, w  Q2 |1 u9 `0 b! n位 2y+1:2y OSPEEDRy[1:0]:端口x配置位(Port x configuration bits)(y=0…15)
9 ]% X& g) n+ r. h( {- g7 ^4 j         这些位通过软件写入,用于配置 I/O 输出速度。
& |  J0 W2 T3 @( ?8 l+ ]          00:低速 ( 2MHz)
: R: U3 n' J2 a9 _1 K          01:中速 ( 25MHz)
+ C# ~! l1 i3 L5 r! J  P          10:高速 ( 50MHz)) X" a! O0 t) _6 G2 [, d
          11:超高速(100MHz)
' c. W- C& V- ?# ?# x2 ^5 i         注:  有关 OSPEEDRy 位以及 V D D V_{DD}VDD范围和外部负载的值,请参见产品数据手册。
2 l& d' K; z$ s( `7 G( B: Y; Y! o5 ~, o
4. GPIO端口上拉/下拉寄存器(GPIOx_PUPDR)
' T/ [/ v( G0 x2 M8 r$ P1 t' P% V  该寄存器用于控制GPIO的上拉/下拉。  u  v  E$ c" y
  该寄存器共32位,每2个位控制1个I/O口。
+ f2 i3 o) Q8 T* Q7 a% ^% ~: z, c9 e* f
  复位后,该寄存器的值一般为0,即无上拉或下拉。6 a% ]0 x, ]$ U, c
' f+ T0 q* f2 y
V4T5QJV(%MKS(3P)8]L]_H7.png & |+ g: ^, @5 ?: K' b
3 b5 _! C  J4 e6 X& s1 K3 O
位 2y+1:2y PUPDRy[1:0]:端口x配置位(Port x configuration bits)(y=0…15)
4 y( U) ~/ a  F6 n         这些位通过软件写入,用于配置 I/O 上拉或下拉。
: {! |7 }1 Y9 k3 |          00:无上拉或下拉
; Y4 U9 w0 ^, M          01:上拉
  V6 B- ~" V" Q. V' l1 O% Y          10:下拉3 T% _0 I  j5 Z
          11:保留
) o, t6 c7 r* o3 t
2 f9 C; S, }: Q4 m# {- y
5. 端口输入数据寄存器(GPIOx_IDR)
/ F/ R3 i8 X0 \" ?* k# ~6 e* H  该寄存器用于控制GPIO的输入高电平或者低电平。9 n( W! B5 G* O4 R6 \: l
  该寄存器的低16位有效,每1个位控制1个I/O口。4 w5 a& h5 W; o( x+ ^; v

/ W) M9 C: Y8 D  该寄存器是只读权限,当CPU读访问该寄存器时:
# n7 E* ]! ]% j( P) B    如果对应的某位为0,则表示设置该I/O口输入的是低电平;
# R. e, a) P3 c+ q    如果对应的某位为1,则表示设置该I/O口输入的是高电平。* w: Z9 ]7 F& |; g# v# E8 z

) P: |6 c( X; s' V* y
{K%$P9$(6%P_]Y_J2{P)PG9.png 90$QJ{1XLIOFKO@SM~V)D.png
7 d+ k4 L( H6 L" c3 s2 z2 V
+ m; c/ p5 b+ p  ?+ r, i% o( o5 l9 C 9U2UCNRPCXVB_{1CA(@%Q.png + f. Z: F4 J& h$ d. }
4 P5 X% @- `( f1 L5 v- n" u
位 31:16 :保留,必须保持复位值。
8 U7 N3 d% F# M' e3 E3 l9 d9 ]" Q- G
位 15:0  :IDRy:端口输入数据(Port input data)(y=0…15)/ O9 A" s' F. i
        这些位为只读。它们包含相应 I/O 端口的输入值。3 s- s- Z8 H4 R  `
5 Q* ^0 n5 w& w
6. 端口输出数据寄存器(GPIOx_ODR)
) c: F) b5 w3 S  该寄存器用于控制GPIO的输出高电平或者低电平。
1 l* {; f. J+ v9 H5 \  该寄存器的低16位有效,每1个位控制1个I/O口。0 P, k2 X  `! }! u

8 E* G3 S% F# I2 F! @  当CPU写访问该寄存器时:, J6 ~% m( S. b8 X% b
    如果对应的某位写0,则表示设置该I/O口输出的是低电平;
: L3 A" x9 _7 v( W, _4 F3 K- p    如果对应的某位写1,则表示设置该I/O口输出的是高电平。
2 c; L( A: E8 r# f) u
8 k7 H8 i& D: p( s* q* ], m
%PV)~}9{_JQU}XUQ]TO])U5.png @G~L44BUNJ129%XXMEQUAVE.png ; n7 q1 [7 I* F( K* {# z/ T$ `
) \* E5 u$ R4 U0 A2 A7 [4 E
`(]ZALR{D660XBEKN$G4UCB.png [X]L]~WI%~RM~GA1W`8HHYU.png
0 ~* Q- H6 W: x) n! W5 Q- u$ ]9 D
& o( b! J  b/ S/ e2 _- g# h位 31:16 :保留,必须保持复位值。& T+ s5 f1 q/ ~% c6 N) _9 @

. c) a) B* ~, ~1 i# Y3 Z6 N位 15:0  :ODRy:端口输出数据(Port output data)(y=0…15)4 i. B' c- S( t0 b2 J& k3 l. o
      这些位可通过软件读取和写入。4 C6 V8 L8 o6 I; y
      注: 对于原子置位/复位,通过写入 GPIOx_BSRR 或 GPIOx_BRR 寄存器,可分别置位和/或复位 ODR 位(x=A…F)。
6 q. k; t0 H" k& U
# S7 X% n# z  ?- t% C& Q0 ^
+ F/ z7 G% Q% L
7. 端口置位/复位寄存器(GPIOx_BSRR)
8 T) p2 Y; N, V& }/ x% i  该寄存器也用于控制GPIO的输出高电平或者低电平。
& y' r1 Y) [- I4 r
, I4 o, Q; Y, ?! T3 {2 J5 u3 k! a  BSRR寄存器32位有效。, |  p9 u0 q% b5 a
    对于低16位(0 ~ 15):( J  t' F. [! h
      我们往相应的位写1,那么对应的IO口会输出高电平;  j0 c) X% Y4 k  r( a; k6 @0 @1 n
      我们往相应的位写0,对IO口没有任何影响。
8 V( s! j7 Q7 e# [6 a! K2 P$ i    对于高16位(16 ~ 31)作用刚好相反:
3 q8 i" Z4 v/ L2 m$ E) ?      我们往相应的位写1,那么对应的IO口会输出低电平;
% Q: M0 ^) U+ m' n, q2 @, b7 I- H      我们往相应的位写0,对IO口没有任何影响。2 q( |3 ~5 m5 T- ^' g
/ `( e# |' ?5 k
  总结:. e( V3 `: N9 w6 ?/ ^; Q
    对于BSRR寄存器,写0时,对I/O口电平无影响。
( F) O0 }, R+ b$ {. T    如需输出高电平,则将对应的BS位写1;6 V5 w5 k% m; m% m! i
    如需输出低电平,则将对应的BR位写1。
/ r" t! E1 a2 Z* G
6 k) x4 C- p0 g0 d  ODR寄存器和BSRR寄存器的不同之处:, ~; s) O% H4 T* o) T: _
    ODR是可读可写权限,而BSRR是只写权限。) O) S, @( K# C$ q" |* W8 l; H8 y
    ODR寄存器,我们要设置某个IO口电平,我们首先需要读出来ODR寄存器的值,然后对整个ODR寄存器重新赋值来达到设置某个或者某些IO口的目的。
7 t5 ^3 F3 R! N! t# u% J    BSRR寄存器,我们就不需要先读,而是直接设置即可,这在多任务实时操作系统中作用很大。
$ m- w* P: H: S( Q; V( l    BSRR寄存器比ODR寄存器更好的地方,就是BSRR寄存器改变引脚状态的时候,不会被中断打断。而ODR寄存器有被中断打断的风险。; `' V+ f, B  V
5 a- ^! l, [# C
2N{EQMKR5V()PI08HU5LZ@5.png TGO8%4)IJCX}_@EWIEAP03O.png
9 a7 n3 K6 U  `! r% ]. v5 {) q4 i
% B0 y# }  d7 d7 r$ K( Y XHF_S1KHV%C~RKFAM8BNVOG.png ~TKVTVFU84`5QBXKV5{_M.png - Z8 l+ v8 Z6 g

* e5 ?( }1 |, R0 S) z2 ~4 X- |' A% j
3 r) i& r  J  {; K, A% i) H位 31:16 BRy:端口x复位位y(Port x reset bit y)(y=0…15)7 v$ M2 {1 I- j0 |
        这些位为只写。读取这些位可返回值 0x0000。9 h  b& N7 ]6 H' A6 {, v. U: ?) f
         0:不会对相应的 ODRx 位执行任何操作
, _- D, ]: I* w6 U4 }. S. a/ \         1:复位相应的 ODRx 位6 W3 O( ^3 l* X! k9 [& }
        注:  如果同时对 BSx 和 BRx 置位,则 BSx 的优先级更高。( ~8 ^4 H2 |# d1 m- S) t4 l

  J+ z1 _# [0 p位 15:0  BSy:端口x置位位y(Port x set bit y)(y=0…15)" k  @/ ^1 J- I! E8 [# \0 |: i% d
        这些位为只写。读取这些位可返回值 0x0000。
8 f6 E. y& K; H2 j& |         0:不会对相应的 ODRx 位执行任何操作
/ ]1 z. w* j8 v4 M% S. |         1:置位相应的 ODRx 位: I3 P5 z7 T1 k
9 N2 O% H) `' h: I7 e1 l
8. 端口配置锁定寄存器(GPIOx_LCKR)
# @' `4 T  s; I7 D/ q2 Y- [  该寄存器的每个锁定位冻结一个特定的配置寄存器(控制寄存器和复用功能寄存器)。
2 v( \" F; F, T' r, x
1 q* L3 L  p' Q$ z2 n
G{29G`WZT@YW[]W2BAO%Y79.png QM2EK7`_NVIX)YPG7]Z1CN6.png 1 I% j% l1 h* H  @

5 q' c: q: }% Z4 M1 j: O, `( f FNI2}4S{88RY$B8{$DW6N1V.png O~X}`Q3H`J{{]ADMR6P4%Z3.png
9 ^5 t% ?; m1 q2 e* e
* ?6 n5 k' ~/ g9 ?6 g# S8 u! Z* ]3 ]' o& K/ ^, t1 F7 {
位 31:17 :保留,必须保持复位值。
, E$ _* O* K# L8 C5 c4 o! T- J4 o. |1 z: k& T. n2 \, V  w' l
位 16 LCKK:锁定键(Lock key)
8 |" f  r5 i: I* S2 E     可随时读取此位。可使用锁定键写序列对其进行修改。7 ]4 h" y% [  R8 K! \- V
      0:端口配置锁定键未激活
, w) c7 w* H- L3 Z' n, K      1:端口配置锁定键已激活。在下一次 MCU 复位或外设复位之前,GPIOx_LCKR 寄存器始终处于锁定状态。
, o5 M3 z8 ?- |, G( {
. ]/ y+ x, s% Y) O) o% h8 ~, o
位 15:0  LCKy:端口x锁定位y(Port x lock bit y)(y=0…15)
8 z- _8 t  k1 j) ]& v) {- b        这些位都是读/写位,但只能在 LCKK 位等于 “0” 时执行写操作。
1 d# h9 u3 j( p- t; b9 W; B2 A         0:端口配置未锁定. W" r* P* E$ W( g4 Q
         1:端口配置已锁定
1 v7 @  |4 q5 W+ I$ i+ E

1 _( E0 w) b, ^  M( d9. 复用功能寄存器(GPIOx_AFRL、GPIOx_AFRH)% q* j; f- y! H9 a) p. k1 f% {( y
  该寄存器分为高位AFRH和低位AFRL,分别控制16位,即分别控制8个I/O口。
1 w, ?8 C$ g4 Y  q$ ]6 e6 P9 A

+ Q+ `9 w6 |$ A% Y3 Y: W  复用功能寄存器有2个,都是32位有效的寄存器,分高位(AFRH)和低位(AFRL)。复用器采用16路复用功能输入AF0~AF15,通过GPIOx_AFRL(引脚 0~7)、GPIOx_AFRH(引脚 8~15)寄存器对复用功能输入进行配置,每四位控制1路复用。2 B4 A4 m+ H- a3 d

+ p0 X  X+ U2 {1 T  I/O口并不能随意复用功能,而是有规定的,可以通过查阅数据手册来获取每个I/O引脚的复用功能。
; b4 B1 B/ W4 Y2 M
# k/ `3 Z$ F2 f3 L; T
~7772{@UWMK~8A30)15MIIL.png 3 i, s: D! q0 m1 L- n( v
# T$ z; H6 Y! q2 {! V0 _" A
位 31:0  AFRy[3:0]:端口x引脚y的复用功能选择(Alternate function selection for port x pin y)(y=0…7)
! P0 R& x' E" M        这些位通过软件写入,用于配置复用功能 I/O 。2 H( P: m& C2 p( v& U5 F
$ C9 v2 ^1 j) R( c; o# k$ P
        AFSELy 选择:
& _/ i7 O2 ~9 ?: Z; j         0000:AF0             1000:AF82 d' w; m# l, y
         0001:AF1             1001:AF90 c# S# r' w7 z7 |+ }0 Q' p5 l
         0010:AF2             1010:AF10
4 U4 g- z5 l; C* D9 e; Q         0011:AF3             1011:AF11
% o+ f8 X% T7 `; [9 v, S* S4 q- H         0100:AF4             1100:AF125 E/ C  l' }0 B" [5 ~  y
         0101:AF5             1101:AF13
4 \: W- ~8 Q7 s8 G$ j1 i# I         0110:AF6             1110:AF145 D( X/ P' J# u8 W- [
         0111:AF7             1111:AF15% O7 v6 B' r# r8 M& `
————————————————8 z' ]2 k' B- p1 ]6 N
版权声明:零号萌新- n) c8 Q9 S& X' }

4 ]& \" `( Y0 `1 H4 K
5 X$ s8 l7 i9 w, o, I! H: u2 h8 s
26ce3086451745d080b00eb74f160861.png
27_SL_3$XV%][3_W@]84YE1.png
收藏 评论0 发布时间:2023-2-1 21:37

举报

0个回答

所属标签

相似分享

官网相关资源

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