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

STM32 GPIO的工作原理和配置

[复制链接]
STMCU小助手 发布时间:2023-2-1 21:37
一、GPIO是什么?
$ d* i. N0 ^8 m! }; n6 {  I6 n' C  GPIO,全称为General Purpose Input Output Ports(通用输入输出端口),也就是通用IO口。
. x5 V  k! G( P2 q0 J
2 X- x" z6 Z( T, a$ ^  GPIO是控制或者采集外部器件的信息的外设,可以由软件程序控制,用于输出或者输入高低电平。6 j1 d# k) \+ ]3 K

' P: w/ e. F* x% @& s# I- k  GPIO的使用非常广泛。可以与硬件进行数据交互(如UART),控制硬件工作(如LED、蜂鸣器等),读取硬件的工作状态信号(如中断信号)等。' J) `) e6 s) f3 ~
9 s! {. q) j% v0 M
  GPIO按组分配,每组16个I/O口,组数视芯片而定。
1 ]3 I* R: e' e. d3 b  以STM32F429IGT6为例:
! Z0 {: I4 z7 H4 A) n$ z+ t: D    ① 一共有9组IO,PA~PI。
3 t3 ?5 j3 _# v    ② 一共有140个IO口,其中PA~PH每组有16个IO,PI只有12个IO口。
# e9 X5 _8 T" s

! @) K7 K7 S2 g, ~& \' C" l, g  注意:芯片的数据手册中,引脚标注为 FT 的,是可以兼容 5V 电平的。
6 S( T* L& n! C9 N/ x+ A5 g/ `6 Y; `5 R/ X. I
ST官方提供的GPIO基本结构图
, C; B+ f8 R. Q$ ~. ]
0 ]! n6 J8 A! O/ g
8bea383ab6aa44cfa614f58d126c5b6e.png : J4 o. r6 u" V* |
) ?' E7 H1 w1 s; `# \) D
二、GPIO的8种工作模式
* t2 r  U: f' [  8种工作模式,分为4种输入模式和4种输出模式。
0 S2 @2 N# L' s/ x- k! ?" t
, t' u! r0 w% u( m  F9 ]
1. 浮空输入模式(GPIO_Mode_IN_FLOATING)
9 V& a; a# i# S) _' f/ U' l  浮空输入模式下,上拉/下拉电阻为断开状态,施密特触发器为开启状态,I/O引脚的输出功能被禁止。
+ Q+ s" `7 M9 o4 o7 i
+ j# m9 @) m5 l1 A* P% L
  该模式下,外部的电平信号通过①(I/O引脚)进入MCU,先经过②(施密特触发器)的整形后,再进入③(输入数据寄存器),最后MCU可以在④(输入数据寄存器的另一端)随时读取I/O引脚的电平。( X" a  z, T8 ~# ~& [1 @3 i! u: r
  即,整形后的I/O引脚的电平信号直接进入输入数据寄存器,MCU直接读取I/O引脚的电平。
0 Z2 ^7 K# H# K
) o8 k4 r, K6 z' N. O+ {  T
  如果I/O引脚无输入时,MCU读取到的电平状态是不确定的。所以引脚不建议悬空,易受干扰。
; o' b% j- X) C; P  如果I/O引脚输入高电平时,MCU读取到高电平1。
6 b5 ~5 r% \+ k- k: }* K  如果I/O引脚输入低电平时,MCU读到低电平0。
/ O. U1 y- ]. M. N2 p% a# w  z8 H+ V. W: H- I1 P
  总结,浮空输入模式:
, r2 v" ^, z& R    I/O引脚输入什么电平信号,MCU就读取到什么电平信号;2 ?' `$ b7 ^& P" X
    无信号输入(默认)时,MCU读取到的电平信号是不确定的。) t- x% O; B5 }$ {# M$ g
8 V  l6 V, k; L0 \
  浮空输入模式,可以用于KEY识别,RX1等。1 {0 h5 @. [% ~0 S0 l& ^' m- Y
+ B; L5 H0 A3 ?7 |
fabbb1f2acbd43b1bba7afe5fa5077e5.png ; S* C  y% W% F" _8 }
5 j( g. H( \$ L$ B% A5 `% Z
2. 上拉输入模式(GPIO_Mode_IPU)4 n* N- X1 H9 n( z5 j1 D6 B3 h6 r
  上拉输入模式下,上拉电阻导通,施密特触发器处于开启状态,I/O引脚的输出功能被禁止。" ^- r: C: _% N; `9 C' q
  GPIO的内部上拉电阻的阻值较大,所以通过内部上拉输出的电流是很弱的,即“弱电流”。
, t: b1 U; M0 z  如果需要大电流用作电流型驱动输出,还是要用外部上拉电阻。$ G% i4 D* g0 Z% {

2 L4 s* s) P5 G: T, o$ [
       上拉输入模式与浮空输入模式不同之处,是在①(I/O引脚)和②(施密特触发器)之间接入了一个上拉电阻,将电位拉高,比如拉到VCC。
& t6 H, i  m# D5 j6 G$ h1 q
$ |. l% q/ b) b, H3 N
  如果I/O引脚无输入时,I/O引脚处相当于断开,上拉电阻的电流直接流向④,MCU读取到高电平1。
: B; X) }; y1 ?& ^  如果I/O引脚输入高电平时,I/O引脚的电压等于VDD的电压,电流还是流向④,MCU读取到高电平1。
! k: i: B6 d+ |& O+ P  如果I/O引脚输入低电平时,I/O引脚处相当于接地,上拉电阻的电流直接流向I/O引脚,MCU读到低电平0。
' o1 P1 [8 C# ^+ v. N4 B" H5 M( F* B6 p2 w3 N$ i
  总结,上拉输入模式:6 M' H) L& w9 v: b
    无信号输入(默认)或输入高电平时,MCU都是读取到高电平1;
% q+ N* n( r4 O/ o4 }    输入低电平时,MCU读取到低电平0。/ ]9 {; q, Q8 B: q! Q2 A

" C1 R$ }) n( Q4 m' A% R  r4 P1 T( o
  上拉输入模式,可以用于按键检测。
! ]4 @! a. N* M' n) `% S! e. @: n  p0 }- D
ceb19f5f5d984679a43f899a6919d100.png " D$ A% x1 I. N6 M! L
% x% o. P7 N, P& y
3. 下拉输入模式(GPIO_Mode_IPD)! M2 }2 O7 q+ U! C8 g7 X
  下拉输入模式下,下拉电阻导通,施密特触发器处于开启状态,I/O引脚的输出功能被禁止。
9 Q! J" ?5 l, s) v. c6 ]! n% X0 a
  下拉输入模式与浮空输入模式不同之处,是在①(I/O引脚)和②(施密特触发器)之间接入了一个下拉电阻,将电位拉低,比如拉到GND。6 N3 c. G3 k: Q, m+ C" t
, y( [7 \" q: }8 k
  如果I/O引脚无输入时,I/O引脚处相当于断开,I/O引脚的电压等于VSS的电压,MCU读取到低电平0。
/ j1 F! I4 p4 ~( R# m( W% h  如果I/O引脚输入高电平时,由于下拉电阻阻值比通道④的阻值大,所以电流流向④,MCU读取到高电平1。
& E6 r# L( q/ x6 ~  如果I/O引脚输入低电平时,I/O引脚处相当于接地,I/O引脚的电压等于VSS的电压,MCU读到低电平0。
1 ?0 Z) k2 D7 a3 \1 ]" S. n* q6 n
  总结,下拉输入模式:
8 K; C  g$ G# M7 A    无信号输入(默认)或输入低电平时,MCU都是读取到低电平0;! y. ~+ u- [! W5 a, a
    输入高电平时,MCU读取到高电平1。
9 @. u3 y3 U  q- T+ N6 o3 K& P" w7 [3 j2 R5 h/ ^4 w/ Z
  下拉输入模式,和上拉输入模式相似,可以用于按键检测。
  s' \' z& e) S( h8 {6 _- u4 i" n, y; W
2f9bc70a88cd487a87c9ce33d4e14f34.png $ T2 Q! s5 A+ |; h

! ]/ x4 X; X1 C. z4. 模拟输入模式(GPIO_Mode_AIN)( C8 \0 O' m- M7 ~
  模拟模式下,上拉/下拉电阻为断开状态,施密特触发器为关闭状态,输出部分的双MOS管也断开。5 F* y7 S6 \% q. v) V0 e

  Q6 N, k; h% S  E! F9 W  模拟输入模式下,外部的电平信号通过①(I/O引脚的模拟输入通道)进入MCU,MCU可以直接在③(模拟输出口)随时读取I/O引脚的电平。/ Y% j- j. R3 o4 K+ y
9 R8 V! {0 j4 W. S; t
  由于施密特触发器断开,所以电信号也无法进入输入数据寄存器,所以MCU无法在“输入数据寄存器”中读取到有效的数据。$ w  y7 i+ P: ~" O; V3 T9 f7 F3 Z

- w9 H0 R- k, S  总结,模拟输入模式:
8 ?6 j# ?, p' \- f  ~    输入的电信号为模拟电压信号,而不是数字电平信号。
1 T7 z! [# @& ?    模拟输入的模拟电压信号,直接送到片上外设,一般是ADC。
  |" I+ u1 L0 c  u% t: _, R    除了 ADC 和 DAC 要将 I/O 配置为模拟通道之外,其他外设功能一律要配置为复用功能模式。
9 D) v8 k* `- g6 x# P/ Y
! G' A" N* f' a( ]& T
  模拟输入模式,可以用于ADC采集或DAC输出,或者低功耗下省电。
; B# H2 I' T1 U
8 S1 c& V  j/ p/ m; ?* Q
6 N' _" R( ?# j! z

/ q! X7 T! t; |& A, ?! X- c, i5. 开漏输出模式(GPIO_Mode_Out_OD)8 y( Z/ g5 `7 y, r
  开漏输出模式下,P-MOS管一直处于断开状态。4 V& ^/ `: U$ W5 Q+ S9 |

6 y6 h5 z+ T) a; Q6 h8 t! s  w
( o+ N3 W; \1 V6 k- z9 u5 Z
  开漏输出模式下,MCU通过左边的①(位设置/清除寄存器)或(输出数据寄存器)写入数据后,该数据位将通过②(输出控制电路)传送到④(I/O引脚)。, A! C: a/ o# t) Y  q: F# D! W
  同时,输入功能可用,⑤(施密特触发器)处于开启状态,可以通过⑥(输入数据寄存器)可读取④(I/O引脚)的实际电平状态。, o* Q5 w+ h+ [. R

' ^) q5 K% g, \  f! F, ?  当MCU输出低电平0时,经过“非门”后,转换为高电平1,N-MOS管导通,使I/O引脚输出低电平。
. o, i4 l3 r$ l# c6 p! w  当MCU输出高电平1时,经过“非门”后,转换为低电平0,N-MOS管断开,I/O引脚处于悬空状态,此时I/O引脚输出的电平高低是由I/O引脚外部的上拉或者下拉决定。
, U& L$ K$ o0 A8 L4 q" {7 O5 W5 K7 d# P9 l; |
  开漏输出,输出端相当于三极管的集电极。要得到高电平状态需要上拉电阻才行。适合于做电流型的驱动,其吸收电流的能力相对较强,一般20mA以内。$ i3 u# k& o" Q6 v8 Y$ |' f; R# f7 U
2 g; P1 {# R3 @7 l! i! A: j
4f16d647eafe454983424cf0242b3378.png 8 r* K; f$ ?7 X1 ?9 v1 O
5 [: n7 c4 P* D3 E9 s" Z% z
6. 开漏复用输出模式(GPIO_Mode_AF_OD)  A! h+ D+ n; {% Q# }+ i# [3 M
  GPIO可以是通用的IO口功能,还可以是其他外设的特殊功能引脚,这就是GPIO的复用功能。
" }; e4 G7 i) Y; U! \$ J- ]2 r. B3 m9 u: {3 C/ \8 ^* d, b- P$ q
  GPIO复用为其他外设,输出数据寄存器无效,④(I/O引脚)输出的高低电平由①(其他外设的输出)决定。
3 O* h* w: J& }  [  同时,输入功能可用,⑤(施密特触发器)处于开启状态,可以通过⑥(输入数据寄存器)可读取④(I/O引脚)的实际电平状态,同时外设可以读取IO引脚的信息。1 `" M; C: ~& ~' ?
1 }$ M, L! V: R1 {  J
  开漏复用输出模式与开漏输出模式的配置基本相同,除了输出信号的来源不同,其他与开漏输出模式的功能相同。
8 M3 A! ^5 T2 H  r4 h; ~  即,②(输出控制电路)的输入,开漏输出模式是由输出数据寄存器输出,开漏复用输出模式是由其他外设输出。* J  D# P( u: O- {, z2 B7 t1 R( I

1 \9 y) n0 V$ ^! P, r: {
bf609dfdcc67416a9d1552a70fe4d125.png ) c3 B: g6 s% b; R

- Z% K' U& Q$ v# J: E7. 推挽输出模式(GPIO_Mode_Out_PP)$ v% R8 ?$ J0 [1 H' ^
  推挽输出模式,从结果上看它会输出低电平VSS或者高电平VDD。推挽输出跟开漏输出不同的是,推挽输出模式P-MOS管和N-MOS管都用上,可以把“输出控制”简单地等效为一个非门。
- Z: i6 P1 H0 m% d# u& j
) e! F+ I* ^4 m0 m& g  当MCU输出低电平0时,经过“非门”后,转换为高电平1,P-MOS管截止,N-MOS管导通,使I/O引脚下拉到VSS,即I/O引脚输出低电平。0 X' T! D2 A& Z) \& F# P
  当MCU输出高电平1时,经过“非门”后,转换为低电平0,P-MOS管导通,N-MOS管截止,使I/O引脚上拉到VDD,即I/O引脚输出高电平。
8 ?( U( {% U3 J. |  同时,输入功能可用,⑤(施密特触发器)处于开启状态,可以通过⑥(输入数据寄存器)可读取④(I/O引脚)的实际电平状态。% g' {/ h5 ?6 ?8 m; m/ @9 S) X

4 {# R( S! \& _- N8 ^- I  总结,推挽输出模式下,P-MOS管和N-MOS管同一时间只能有一个MOS管是导通的。当引脚高低电平切换时,两个管子轮流导通,一个负责灌电流,一个负责拉电流,使其负载能力和开关速度都有很大的提高。* O1 l$ k: |$ N! L9 y+ q
% E# w4 u4 {; P) J4 a3 n
  由于推挽输出模式输出高电平时,是直接连接VDD,所以驱动能力较强,可以做电流型驱动,驱动电流最大可达25mA。该模式也是最常用的输出模式。. K; ]$ b+ @$ G) _
" I1 |" _2 ^3 d5 r0 I2 P6 T
a1528fd645af410d89c874c179b6bf91.png
- Z+ L% m6 i4 p6 E/ v# R+ o
4 B5 A" |: G" c8. 推挽复用输出模式(GPIO_Mode_AF_PP)
+ D+ g2 S: E6 V& P+ ^& s' ~. j  GPIO可以是通用的IO口功能,还可以是其他外设的特殊功能引脚,这就是GPIO的复用功能。% n& P8 ^- V1 T

8 [) B* X3 H/ O) S, L, C8 z" L  GPIO复用为其他外设,输出数据寄存器无效,④(I/O引脚)输出的高低电平由①(其他外设的输出)决定。
; w- b6 @! Z% D* `6 _5 i0 v  同时,输入功能可用,⑤(施密特触发器)处于开启状态,可以通过⑥(输入数据寄存器)可读取④(I/O引脚)的实际电平状态,同时外设可以读取IO引脚的信息。. k" @/ d' l7 k$ w  r, ~

1 z' z+ \% i: W  推挽复用输出模式与推挽输出模式的配置基本相同,除了输出信号的来源不同,其他与推挽输出模式的功能相同。
% m) g5 N  W- Z% w  即,②(输出控制电路)的输入,推挽输出模式是由输出数据寄存器输出,推挽复用输出模式是由其他外设输出。% E& p" ^5 O" [& g+ ]) s& q3 O
* W* S" t; ], i. O* W3 u" k4 x
3b3e3b3e8c874c479509ad7d9206bff2.png
# C8 r6 q; t0 b& z  i0 `! n8 k

) l: c0 S  b8 q+ |1 ^三、GPIO寄存器, ^0 K1 x# P" y' K0 \3 S# m
  每组GPIO的寄存器包括:
7 h: w" Z. A2 |6 Q/ R0 c/ @9 j    配置寄存器:
( J9 m  `( n+ l' O- i/ z4 O1 R      一个端口模式寄存器(GPIOx_MODER)* C( l& _$ k9 Q$ z! }' U" `/ N
      一个端口输出类型寄存器(GPIOx_OTYPER)7 ?) \, H) G0 g% Y, [
      一个端口输出速度寄存器(GPIOx_OSPEEDR)4 M$ N5 G& \/ x1 C" h
      一个端口上拉下拉寄存器(GPIOx_PUPDR)
3 U  ]8 z6 s+ t# G+ J# |4 b2 `( q

' f5 K: q5 @/ J5 B; F  _    数据寄存器:2 G; B4 @3 Y3 D
      一个端口输入数据寄存器(GPIOx_IDR)- v* w7 d' B: R5 ~& N6 M8 _7 H8 D! X1 @
      一个端口输出数据寄存器(GPIOx_ODR)) N! m' a$ i4 I+ ~( O6 l, Q3 u# Q
# e  l- ]' m0 ?5 {2 s
    置位/复位寄存器:' N: U5 y8 @) n/ \0 F1 r
      一个端口置位/复位寄存器(GPIOx_BSRR)
. D, L& J" w$ }9 x) e" L! L8 W& N% `+ M) x6 O9 k6 h: a; q
    锁存寄存器:$ A( J, G% h3 F- ~8 F7 q/ Q: w9 Q
      一个端口配置锁存寄存器(GPIOx_LCKR)/ [7 b/ r$ Y* z; j3 I

! u* V8 t% R4 i% o, v' a, s4 T) f    复用功能共寄存器:2 p' |; Q/ ^7 `$ O; b/ ?
      两个复用功能寄存器(低位GPIOx_AFRL & 高位GPIOx_AFRH)  b$ B4 ]: ^* x- B

$ V1 x# p2 {8 O, e% B) j6 L注意:: s7 e* N9 c4 ^* Z' A! h
    ① 每组GPIO由10个寄存器组成,如果芯片有 GPIOA ~ GPIOI 9个组,那么一共有对应90个寄存器。5 K9 E, {( E. i/ R$ T
    ② 如果配置一个I/O口需要2个位,那么刚好32位寄存器配置一组16个I/O口。
9 L  L8 w4 T2 k    ③ 如果配置一个I/O口只需要1个位,一般高16位保留。7 q& u$ O4 ]! ^: _1 l
    ④ BSRR寄存器32位分为低16位BSRRL和高16位BSRRH,
9 ^8 r/ ?1 X$ I      BSRRL配置一组16个I/O口的置位状态(1),/ a; y% }& [. l. H: U3 g
      BSRRH配置一组16个I/O口的复位状态(0)。
* K: M) {/ k8 \$ @' V    ⑤ rw表示可读可写;r表示只可读;w表示只可写;Res.表示保留位,必须保持复位值。) H. ^- v, ]3 ^/ l* B

" E( p2 _* A; ]2 A- A& H; M( [" v1 w
QY[R__HDX{4@_P106U]@KEN.png , C" J6 U0 C2 V2 P# b0 S3 H
0 d/ \, h. P+ @
1. GPIO端口模式寄存器(GPIOx_MODER)
1 g. H& E# e3 i( e9 F" K) Z/ M  该寄存器是GPIO的模式控制寄存器,用于控制GPIO的工作模式。
* I. J' P7 _3 ^. {# q& L0 [5 Q8 J  该寄存器共32位,每2个位控制1个I/O口。
% v0 I5 T' _1 l% {8 y8 T  [- ?, b" ^* }& E* \0 |8 g
  以 GPIOA = 0xABFFFFFF 为例:1 H) ?& n0 {% O6 u6 `: i" I
    ① 低16位的值是FFFF,都是1,即 PA0 ~ PA7 默认都是模拟模式。8 {" C0 k! o' T. d$ x  L2 h$ e" w8 D
    ② 高16位的值是0xABFF,即 PA8 ~ PA12 是模拟模式,PA13 ~ PA15 是复用功能模式。6 ]5 D& X9 o; F8 _
0 ~+ w4 G# Z# D# g
AH2G}26%B][KN)1O]06}X~W.png R7V{4%]JUY%NFLOBS{H(6TQ.png
, f; z7 g0 n( ^" j7 ?: f) y; }/ Q. d7 F0 t, v. W/ M

$ ?  d8 b/ g/ O( N6 ?2 b/ [ OOMVS{`_Z8W`7}]A02]E6D1.png JA8ZGXSR9IK%B%`3LPLS9%I.png 0 u# H9 l. g" Y# Y% e7 R; y

7 [& F+ ^- S# P$ ~7 ^* ?- m4 ~3 m0 q2 g" {- q* X5 b* q. a
位 2y+1:2y MODERy[1:0]:端口x配置位(Port x configuration bits)(y=0…15)' S6 W  L# b. e& i
         这些位通过软件写入,用于配置 I/O 模式。2 m3 K; J; Q: o
          00:输入模式(复位状态)5 P  f: [" B; F- M1 s  J
          01:通用输出模式( d6 T- N( g1 V( b6 F
          10:复用功能模式
( n+ g% V$ v' M" J- j+ f; k          11:模拟模式
; [5 S* v4 R5 I: d: T) O8 N; w
+ v( _( b. R4 D% a2. GPIO端口输出类型寄存器(GPIOx_OTYPER)
4 G/ Z% V1 _7 e  该寄存器用于控制GPIO的输出类型,仅用于输出模式,在输入模式(MODER[1:0] = 00 / 11 时)下不起作用。9 ^0 X( G* E  s0 h! h$ r' A7 Z
  该寄存器的低16位有效,每1个位控制1个I/O口。
* I# g4 U9 v" q- B4 o6 G; \
2 L) O0 i- s( I3 p; p. \5 W" K  复位后,该寄存器的值均为0,即I/O口在输出模式下默认为推挽输出。4 f9 F0 ?/ J4 q* _# q& _1 ^- F
# Q, O/ S2 q( q: X1 u* C% W
O2IH6(WY3130OHOJ27L(VH3.png ~_YZC)F18{B6Z2X%CH_`{YX.png , }) W0 N  w! t8 I0 B+ e! C# ?

* V5 {8 O. k6 F7 @, R  Z9 k; a( A9 | V(BGF0RBV5Z8][ST[TQA1Q3.png Z0MF9OM{TZA5{SK0B(_CQGJ.png
( s7 G& K9 Z5 J) C* [! P8 F2 w6 p( u4 [
位 31:16 :保留,必须保持复位值。! R+ ?# }& [7 s9 y

, v9 @1 H+ Y5 ?6 v+ G" [位 15:0  OTy:端口x配置位(Port x configuration bits)(y=0…15)- y8 \; L1 Q' R6 ]# B/ t5 U" \1 Q+ W' @
       这些位通过软件写入,用于配置 I/O 输出类型。
/ v, M; h) y$ Q; d        0:推挽输出(复位状态)
0 e9 a$ R% _7 h7 c  t; i        1:开漏输出
# m( f) F* y" `. Y0 V; ?4 X. U, L' T) n9 Q) X, c4 O9 ?
3. GPIO端口输出速度寄存器(GPIOx_OSPEEDR)8 H, `) A+ q8 `7 P' D
  该寄存器用于控制GPIO的输出速度,仅用于输出模式,在输入模式(MODER[1:0] = 00 / 11 时)下不起作用。6 P, D9 Q7 ~1 w( ?9 x- W
  该寄存器共32位,每2个位控制1个I/O口。* H3 b3 a4 I" x, ]
& d4 a( A; P" {+ T+ C+ K5 a
  复位后,该寄存器的值均为0,即I/O口在输出模式下默认为推挽输出。- {1 ?2 @, F! O- S
[EQ0_~RWQC{SV{I`UGK1GKO.png 7GBHESLVM%LF~]Q_[BOF{ES.png + s8 g7 x7 S7 C% D! g
2 [( @6 O2 t6 e6 G7 @4 i( b
{IWD0VG2CL1KY1~J[`{ESVP.png (0N@``S(Y419T6JEA}32(D2.png
' b4 g2 l! _8 E# n# A" N- O! {' w" B' M% a+ a' w* t% A

, R" i0 Y! Q; j3 [位 2y+1:2y OSPEEDRy[1:0]:端口x配置位(Port x configuration bits)(y=0…15)
! S0 P' f0 C' _% q( ]; @         这些位通过软件写入,用于配置 I/O 输出速度。9 |' i. Z5 K! p% l# N- y
          00:低速 ( 2MHz)
1 a' i! w; \# x" r; B& T          01:中速 ( 25MHz)
: \. r& h% t+ w- p          10:高速 ( 50MHz)( i, |6 ^. x- {
          11:超高速(100MHz)
8 L" y+ `" i' W) h         注:  有关 OSPEEDRy 位以及 V D D V_{DD}VDD范围和外部负载的值,请参见产品数据手册。. M: s  f! F7 g4 U3 x& l% q

$ X* u6 R' p8 N1 U+ A1 H7 m! X4. GPIO端口上拉/下拉寄存器(GPIOx_PUPDR)3 K4 i3 d/ U5 t/ b: q
  该寄存器用于控制GPIO的上拉/下拉。! n" _$ S# @* n5 D, R
  该寄存器共32位,每2个位控制1个I/O口。
/ S+ I$ H! C9 w  k/ i  [* J: p6 ~% I7 b! P
  复位后,该寄存器的值一般为0,即无上拉或下拉。
$ V, }. M5 g! `8 U3 Q% {
: n# M& }7 o4 F! u
V4T5QJV(%MKS(3P)8]L]_H7.png
1 W* l, J9 V4 I. I0 M0 L

5 B2 N6 G  i% ^7 @位 2y+1:2y PUPDRy[1:0]:端口x配置位(Port x configuration bits)(y=0…15)6 e# z4 W  [: @, j! ~
         这些位通过软件写入,用于配置 I/O 上拉或下拉。
$ }- m- x2 y  N: M          00:无上拉或下拉) P7 H0 F8 P) @  H9 f
          01:上拉. o$ A/ J, k2 k/ z2 {! M4 Z6 o% M" {
          10:下拉* M- z6 j" l% U" H1 H1 e+ d
          11:保留
8 |  e7 v8 S7 X) u/ Z8 t
; q2 E7 x7 [$ d. u6 j
5. 端口输入数据寄存器(GPIOx_IDR)! o2 v) L, V6 M3 y1 d3 a
  该寄存器用于控制GPIO的输入高电平或者低电平。4 Y2 u- }+ n$ s& k+ F) d2 Y
  该寄存器的低16位有效,每1个位控制1个I/O口。- w, v/ c$ s- r5 C4 |: k. A# b( B

% j( A8 {7 ~9 ~) \: d  该寄存器是只读权限,当CPU读访问该寄存器时:( w8 ^) x  j; a% h" L( G8 c% z4 ]
    如果对应的某位为0,则表示设置该I/O口输入的是低电平;1 ^) A# s' ?( }( x, F! l
    如果对应的某位为1,则表示设置该I/O口输入的是高电平。
# p/ r) ^  t4 B- i$ O
8 Y' R+ L: P9 v5 |: A
{K%$P9$(6%P_]Y_J2{P)PG9.png 90$QJ{1XLIOFKO@SM~V)D.png
& w7 i; k2 U+ M& W: B8 @' y) a8 H. l; a
9U2UCNRPCXVB_{1CA(@%Q.png 1 \- Q! C$ p: H# \
; q6 V2 Q9 \$ V
位 31:16 :保留,必须保持复位值。
5 J/ f6 S) V0 G. D& [
* P8 [# V% X) w& h! D! S位 15:0  :IDRy:端口输入数据(Port input data)(y=0…15)3 ?1 K5 h( Q+ C  `1 F0 ?/ B2 h
        这些位为只读。它们包含相应 I/O 端口的输入值。
: e* J" J1 S0 f( c3 }4 c
5 d" v  A1 b9 m
6. 端口输出数据寄存器(GPIOx_ODR), t( s7 K' u) {; R
  该寄存器用于控制GPIO的输出高电平或者低电平。
( @1 J' ^5 e' S  该寄存器的低16位有效,每1个位控制1个I/O口。( ~- E* A) \4 Z1 |. ?
7 q: I; J) m, L
  当CPU写访问该寄存器时:
9 T+ `& Q/ K; C! ^+ l6 F0 }    如果对应的某位写0,则表示设置该I/O口输出的是低电平;
2 Y+ E" ^& `8 I( x4 z, B    如果对应的某位写1,则表示设置该I/O口输出的是高电平。
4 j: x1 G  K" T, B$ u3 ^
1 m( Q7 W0 `5 C- A7 k
%PV)~}9{_JQU}XUQ]TO])U5.png @G~L44BUNJ129%XXMEQUAVE.png 3 G' v9 z, f( |4 y  J
# p( C0 M3 U* a5 J. g
`(]ZALR{D660XBEKN$G4UCB.png [X]L]~WI%~RM~GA1W`8HHYU.png
( j  {. ?, `9 I" I& q3 e* M, }+ E& s" T7 X1 M/ {
位 31:16 :保留,必须保持复位值。
, l4 o$ f2 g2 d1 r( a  f8 E
: [! _) L& J' h1 L位 15:0  :ODRy:端口输出数据(Port output data)(y=0…15)1 q& k0 e' g7 H
      这些位可通过软件读取和写入。" ?" g$ x% f) k1 e! F0 Q" m, L
      注: 对于原子置位/复位,通过写入 GPIOx_BSRR 或 GPIOx_BRR 寄存器,可分别置位和/或复位 ODR 位(x=A…F)。
" N1 q% s( l1 c
: T1 W# z4 p! t, e

1 @  w8 `3 O" ^( m2 F7 ?4 J5 a7. 端口置位/复位寄存器(GPIOx_BSRR)
+ U8 i1 ~6 _3 e. m* n2 b  该寄存器也用于控制GPIO的输出高电平或者低电平。
* x# I0 @# I/ n1 E# A& e( }) Y. v4 A/ V# T; [* |) K5 |9 [
  BSRR寄存器32位有效。
$ h3 f1 r$ J1 f, c    对于低16位(0 ~ 15):
" J8 G  J' _) ~! }      我们往相应的位写1,那么对应的IO口会输出高电平;
! T7 C9 W$ o9 A! W9 `+ H" |; u2 @      我们往相应的位写0,对IO口没有任何影响。1 G% }1 ~/ r: c* C' e
    对于高16位(16 ~ 31)作用刚好相反:
# U  H5 k( f' [0 V- x      我们往相应的位写1,那么对应的IO口会输出低电平;6 D) f. ?7 G, j: Q
      我们往相应的位写0,对IO口没有任何影响。
" c% f8 E% q9 ~1 q: I5 S/ a

) H! Q7 a6 _# D$ U  总结:
* R# J- S6 U2 u    对于BSRR寄存器,写0时,对I/O口电平无影响。' y4 p: J/ s* w1 b8 ]
    如需输出高电平,则将对应的BS位写1;
4 \4 @" C9 m* w4 W6 s5 w/ m    如需输出低电平,则将对应的BR位写1。
3 Y% d3 X, s& x6 w& p7 `! G/ I6 {; Q% _$ V
  ODR寄存器和BSRR寄存器的不同之处:
& x3 g7 @1 j0 h6 k" `7 R; R; d! l2 J    ODR是可读可写权限,而BSRR是只写权限。( O# u1 ~" w% Y8 Q3 G; M* M
    ODR寄存器,我们要设置某个IO口电平,我们首先需要读出来ODR寄存器的值,然后对整个ODR寄存器重新赋值来达到设置某个或者某些IO口的目的。
2 u; b% |7 I  e' k    BSRR寄存器,我们就不需要先读,而是直接设置即可,这在多任务实时操作系统中作用很大。
$ D- D; v: r& \& B/ M7 y    BSRR寄存器比ODR寄存器更好的地方,就是BSRR寄存器改变引脚状态的时候,不会被中断打断。而ODR寄存器有被中断打断的风险。
, f6 T1 R4 G2 r. G2 H, c) h6 J$ a# A" j' e0 o
2N{EQMKR5V()PI08HU5LZ@5.png TGO8%4)IJCX}_@EWIEAP03O.png
2 ]3 w9 z3 ~' b4 \1 J5 ]" B; x, c% |, F6 W; K( |/ M
XHF_S1KHV%C~RKFAM8BNVOG.png ~TKVTVFU84`5QBXKV5{_M.png
2 c! k6 b+ R' ]  |+ k; P! C7 ~5 V/ t

' ^& _# ]8 C9 y, l# n# z0 A+ ]- v6 h7 j位 31:16 BRy:端口x复位位y(Port x reset bit y)(y=0…15)! t3 y9 i$ V* f6 Z' x8 ?' \
        这些位为只写。读取这些位可返回值 0x0000。/ J4 A7 ^1 y6 z
         0:不会对相应的 ODRx 位执行任何操作' b# R$ |5 D- v4 e% G: `! e8 i* d
         1:复位相应的 ODRx 位
; g( h* y; V( u6 x! j        注:  如果同时对 BSx 和 BRx 置位,则 BSx 的优先级更高。
5 o; w5 w- V! M3 x6 d8 q- ?

" G% g# p: V' x, [3 T; u位 15:0  BSy:端口x置位位y(Port x set bit y)(y=0…15)
+ F% m8 H& j, \        这些位为只写。读取这些位可返回值 0x0000。0 D% \6 n5 k/ G% `. L2 G
         0:不会对相应的 ODRx 位执行任何操作
7 S. @1 K4 x: S  E+ X( @, G/ B         1:置位相应的 ODRx 位9 l' }& \/ x( J

0 n  @( @; E6 X2 j; v, Z8. 端口配置锁定寄存器(GPIOx_LCKR)
) z2 M6 Q6 g4 ]5 O  该寄存器的每个锁定位冻结一个特定的配置寄存器(控制寄存器和复用功能寄存器)。) \' f7 c& v) p( K0 t& C" u
6 \2 Y1 W- D5 _5 H
G{29G`WZT@YW[]W2BAO%Y79.png QM2EK7`_NVIX)YPG7]Z1CN6.png : a3 b; P8 D1 {* ]6 s; J
/ u% R  s  p! q( A' x/ [
FNI2}4S{88RY$B8{$DW6N1V.png O~X}`Q3H`J{{]ADMR6P4%Z3.png ; f" Q) k, G7 W  m" w+ y" M. g$ M

& g2 S9 D1 a; \4 _' X+ x+ O- m4 {* F/ e; y& x5 V+ R; u$ @- ?
位 31:17 :保留,必须保持复位值。0 v% r5 f+ }, S( S+ E

2 j9 a: }5 h9 n# a: M位 16 LCKK:锁定键(Lock key)
8 \1 m9 m6 ]* v     可随时读取此位。可使用锁定键写序列对其进行修改。
) i  W# S+ X7 o! I, `! N- T% n+ z      0:端口配置锁定键未激活" X, V6 ~9 I, C/ X) l/ ~& D1 |! c6 m% \
      1:端口配置锁定键已激活。在下一次 MCU 复位或外设复位之前,GPIOx_LCKR 寄存器始终处于锁定状态。7 u6 L# D6 |5 Z3 w. k7 f$ O3 c9 g
5 Q6 f9 J! }  u( G4 Q
位 15:0  LCKy:端口x锁定位y(Port x lock bit y)(y=0…15). N! U, p: ?: K  n
        这些位都是读/写位,但只能在 LCKK 位等于 “0” 时执行写操作。* @% @) A( l" x' ]
         0:端口配置未锁定, b# ^; G, H! x
         1:端口配置已锁定7 X) @) n0 N; v: b6 m0 E: D9 h

, Z% I; u; b& d& h* I+ \* ^5 e& v9. 复用功能寄存器(GPIOx_AFRL、GPIOx_AFRH)- q0 U* d4 A5 i' X
  该寄存器分为高位AFRH和低位AFRL,分别控制16位,即分别控制8个I/O口。- r2 f8 u- ~0 c6 F
! c- t5 J! @. v$ |6 E
  复用功能寄存器有2个,都是32位有效的寄存器,分高位(AFRH)和低位(AFRL)。复用器采用16路复用功能输入AF0~AF15,通过GPIOx_AFRL(引脚 0~7)、GPIOx_AFRH(引脚 8~15)寄存器对复用功能输入进行配置,每四位控制1路复用。5 n7 M( s& ]; @% E

+ x; R& b& y4 O& c3 E' L  I/O口并不能随意复用功能,而是有规定的,可以通过查阅数据手册来获取每个I/O引脚的复用功能。
* G9 H  S8 {% ~' Z4 X2 z. K% R6 A8 D7 j  [- r0 O1 b( z, B3 X% Y
~7772{@UWMK~8A30)15MIIL.png % M8 E7 ]1 S1 f$ P3 c7 {

- ?# b; `1 J! n, V- M位 31:0  AFRy[3:0]:端口x引脚y的复用功能选择(Alternate function selection for port x pin y)(y=0…7), K8 g& `  j( c9 {% P
        这些位通过软件写入,用于配置复用功能 I/O 。% M6 a) O; p7 ]$ I  @* d2 f2 \

+ y8 W! w% @- @' I) Z' q$ |        AFSELy 选择:
; F. f7 ]1 {2 v3 |         0000:AF0             1000:AF87 _. h  ~3 E  B6 x0 B
         0001:AF1             1001:AF9& u2 ^& ?/ r# C9 `1 Y3 F( q/ ?. \
         0010:AF2             1010:AF10( k2 h7 s' `1 E0 q9 ^
         0011:AF3             1011:AF11
5 E3 m4 X* L. C3 [1 J& G# E; p9 z         0100:AF4             1100:AF121 S4 G' ^3 t7 ^5 T& U
         0101:AF5             1101:AF13- w0 x) }2 y7 T. x9 b1 f$ x+ J
         0110:AF6             1110:AF147 _. ^9 H# o) Y$ {
         0111:AF7             1111:AF15
8 {% i0 B9 L8 o* P" B+ K————————————————
! o& U; V$ d3 ~! |$ k7 o' R$ Z版权声明:零号萌新
! }# Z+ S( \% Q( W* O1 V
& Z* e; z0 o( M2 O6 y5 ?# l9 G' L1 Z9 z+ M  V9 B, u
26ce3086451745d080b00eb74f160861.png
27_SL_3$XV%][3_W@]84YE1.png
收藏 评论0 发布时间:2023-2-1 21:37

举报

0个回答

所属标签

相似技术帖

官网相关资源

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