请选择 进入手机版 | 继续访问电脑版

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

STM32 GPIO的工作原理和配置

[复制链接]
STMCU小助手 发布时间:2023-2-1 21:37
一、GPIO是什么?
( k1 C4 r# ~  X0 [  GPIO,全称为General Purpose Input Output Ports(通用输入输出端口),也就是通用IO口。7 X% {0 f. T9 c0 P1 w; u: A

0 h7 H: q/ t6 b1 c5 [0 h  GPIO是控制或者采集外部器件的信息的外设,可以由软件程序控制,用于输出或者输入高低电平。, ^0 }  ?7 [7 {

0 h0 f5 K6 o9 v3 W6 W( S  GPIO的使用非常广泛。可以与硬件进行数据交互(如UART),控制硬件工作(如LED、蜂鸣器等),读取硬件的工作状态信号(如中断信号)等。. _! S- {* G/ l; s2 }

9 g7 [6 O8 z$ G8 S" \  GPIO按组分配,每组16个I/O口,组数视芯片而定。
8 I% X" @+ x: p% s2 f) s  以STM32F429IGT6为例:
' c- l7 B# l  [( O4 D9 M3 u8 ^# ^2 s    ① 一共有9组IO,PA~PI。
# `- s' v5 E3 A. ]+ C    ② 一共有140个IO口,其中PA~PH每组有16个IO,PI只有12个IO口。+ t# w# R7 X+ x+ J5 O' G

' i0 H" f/ K: d& w& I: B0 X& V  注意:芯片的数据手册中,引脚标注为 FT 的,是可以兼容 5V 电平的。
2 G1 n( O/ o  @# A& s  b4 D! l5 s# T/ E7 z5 r  l* u& [$ V8 O
ST官方提供的GPIO基本结构图
: u; u. ]: @2 J9 Z, \# V# T, A0 T% z' x* b2 I. H% f; \
8bea383ab6aa44cfa614f58d126c5b6e.png
1 ~- r9 u- k2 l% ]% z/ `. r$ n3 {
& L6 M# F* [# X: K
二、GPIO的8种工作模式
) J7 s% T4 M1 n) v  8种工作模式,分为4种输入模式和4种输出模式。
- h! T4 f3 I: Z- ?2 |' \+ x2 g; I6 E3 i: [' N! h# i' w
1. 浮空输入模式(GPIO_Mode_IN_FLOATING)
: w: m( W4 G: |% q& b+ h  浮空输入模式下,上拉/下拉电阻为断开状态,施密特触发器为开启状态,I/O引脚的输出功能被禁止。
/ T  t% |$ G! C2 x3 I( f3 @
- K4 L( n' `7 g) a
  该模式下,外部的电平信号通过①(I/O引脚)进入MCU,先经过②(施密特触发器)的整形后,再进入③(输入数据寄存器),最后MCU可以在④(输入数据寄存器的另一端)随时读取I/O引脚的电平。
1 x2 m& O; U: a2 w3 H# F$ F2 c: B6 Y, M  即,整形后的I/O引脚的电平信号直接进入输入数据寄存器,MCU直接读取I/O引脚的电平。, H6 u: h, U1 g; [# n3 Q

7 P# x  W8 M: [0 \$ h
  如果I/O引脚无输入时,MCU读取到的电平状态是不确定的。所以引脚不建议悬空,易受干扰。
. F4 A: k% i9 z9 Z; p" q% D2 f  如果I/O引脚输入高电平时,MCU读取到高电平1。
2 J' \$ d% D8 f5 K1 Y8 j- K  如果I/O引脚输入低电平时,MCU读到低电平0。
  m, k( k0 r9 E+ S0 n2 Z" X
4 z* U. C, `( M
  总结,浮空输入模式:1 t5 e" |+ {, ^0 s- Z
    I/O引脚输入什么电平信号,MCU就读取到什么电平信号;% Y( `4 Q8 {- O1 O6 ~6 M
    无信号输入(默认)时,MCU读取到的电平信号是不确定的。
. f6 k8 x0 S4 e2 |1 Q& v/ A
2 f- v* L5 |8 |$ w
  浮空输入模式,可以用于KEY识别,RX1等。( |! E, f0 J' R2 m' b! }; b# G
/ }$ t! n7 r8 T. p5 C# a3 c
fabbb1f2acbd43b1bba7afe5fa5077e5.png * T9 k" }. ~+ W% |6 Z
$ B& w/ C/ ?' N  J! {9 Z
2. 上拉输入模式(GPIO_Mode_IPU)
4 B: o, ~" P. s7 D" C' J  上拉输入模式下,上拉电阻导通,施密特触发器处于开启状态,I/O引脚的输出功能被禁止。
/ u! `+ z* x7 O# E  GPIO的内部上拉电阻的阻值较大,所以通过内部上拉输出的电流是很弱的,即“弱电流”。3 i% m$ K: _5 B/ ~* v% f4 I
  如果需要大电流用作电流型驱动输出,还是要用外部上拉电阻。
8 G2 \* |& ]) _. K. {1 K& f  ?# Z5 Z
+ R9 J* f( N9 v! f' [
       上拉输入模式与浮空输入模式不同之处,是在①(I/O引脚)和②(施密特触发器)之间接入了一个上拉电阻,将电位拉高,比如拉到VCC。
7 \: o0 h# ]9 X6 Q0 l' W7 M  `( V& r) c8 f
  如果I/O引脚无输入时,I/O引脚处相当于断开,上拉电阻的电流直接流向④,MCU读取到高电平1。
! }; C- ~- t& x# w/ _2 L1 O  如果I/O引脚输入高电平时,I/O引脚的电压等于VDD的电压,电流还是流向④,MCU读取到高电平1。
- V- g$ f! T; G# e! T  如果I/O引脚输入低电平时,I/O引脚处相当于接地,上拉电阻的电流直接流向I/O引脚,MCU读到低电平0。6 u& a+ x; {+ ?8 p. H% c
/ [, n% h$ h! Z
  总结,上拉输入模式:9 R9 D$ L  _+ X; ]( k7 u
    无信号输入(默认)或输入高电平时,MCU都是读取到高电平1;+ @5 H$ C4 q. Y/ s9 l8 G/ q0 M5 z1 A
    输入低电平时,MCU读取到低电平0。
0 `1 W% _7 N2 s" F1 T' H# R0 \8 i' P7 @% i% Q6 b
  上拉输入模式,可以用于按键检测。: r- n8 l$ z$ X# G1 l1 [

* S$ Q5 |. Z$ f& t& j
ceb19f5f5d984679a43f899a6919d100.png
4 ^9 I3 I( V8 G  b, M$ D2 i; {- t( G
3. 下拉输入模式(GPIO_Mode_IPD)2 q% o# U( h! U: \* i
  下拉输入模式下,下拉电阻导通,施密特触发器处于开启状态,I/O引脚的输出功能被禁止。
* P& ^; _+ `- M0 t; K1 |4 `# Z' a8 D" `) T1 ~. v' f
  下拉输入模式与浮空输入模式不同之处,是在①(I/O引脚)和②(施密特触发器)之间接入了一个下拉电阻,将电位拉低,比如拉到GND。' x9 s9 y( E) L: x/ G; z! D* E
3 _& T7 S- [! ^' k1 Q5 k
  如果I/O引脚无输入时,I/O引脚处相当于断开,I/O引脚的电压等于VSS的电压,MCU读取到低电平0。! f" i9 W7 K3 [8 O+ i/ k
  如果I/O引脚输入高电平时,由于下拉电阻阻值比通道④的阻值大,所以电流流向④,MCU读取到高电平1。
* `! v. |; a3 I# S- ~+ O/ K  如果I/O引脚输入低电平时,I/O引脚处相当于接地,I/O引脚的电压等于VSS的电压,MCU读到低电平0。* ^- X3 y: R6 E  v4 c& w* {

2 r$ u; m( A0 L+ @  总结,下拉输入模式:: b. v8 M1 n6 Y7 [
    无信号输入(默认)或输入低电平时,MCU都是读取到低电平0;
: S3 {& n) D0 K& [    输入高电平时,MCU读取到高电平1。
  g8 H! b- E9 W% q( \- E2 v% {2 A4 A# O
  下拉输入模式,和上拉输入模式相似,可以用于按键检测。
1 S3 ~9 o+ A6 j
6 R1 Q; J# V9 `
2f9bc70a88cd487a87c9ce33d4e14f34.png
( c, u- n2 j0 L, R# |$ N
: }$ [& @: R/ k! X  j
4. 模拟输入模式(GPIO_Mode_AIN)
2 B2 p1 \# ^2 ?) y( y  模拟模式下,上拉/下拉电阻为断开状态,施密特触发器为关闭状态,输出部分的双MOS管也断开。. d7 ]/ s6 ?8 X# x
* N% R4 B) z6 x# _0 \
  模拟输入模式下,外部的电平信号通过①(I/O引脚的模拟输入通道)进入MCU,MCU可以直接在③(模拟输出口)随时读取I/O引脚的电平。5 v% _( Z- C5 }1 a. b
- i+ u" b$ W% W$ @
  由于施密特触发器断开,所以电信号也无法进入输入数据寄存器,所以MCU无法在“输入数据寄存器”中读取到有效的数据。# I1 I' p6 a: ^7 f( S6 m2 L

3 G4 L$ |8 v1 v' m  总结,模拟输入模式:
4 c1 q* D5 D" h    输入的电信号为模拟电压信号,而不是数字电平信号。
) A- F7 U& b: P$ x+ H: [# b3 b7 f    模拟输入的模拟电压信号,直接送到片上外设,一般是ADC。
4 i$ P8 I: u5 q* t1 i" P" x* g    除了 ADC 和 DAC 要将 I/O 配置为模拟通道之外,其他外设功能一律要配置为复用功能模式。
8 g+ q) U9 w% n' o+ o4 S" w

  K) W. b1 n0 ?2 }2 g" _  模拟输入模式,可以用于ADC采集或DAC输出,或者低功耗下省电。
$ g  |" ?7 P5 a2 x& E& J# ^- _* ?
5 x' w; |1 g8 |3 v1 U) P
4 c$ G; Y2 C( x* R5 i

4 l7 V  S  i/ y! w% G5. 开漏输出模式(GPIO_Mode_Out_OD)
, ^1 E7 N+ c% _6 O, S  开漏输出模式下,P-MOS管一直处于断开状态。
: ~3 G8 P% W# w! _/ z' u1 W9 }8 q3 e5 _" ~8 @
6 l# b2 w. e' K8 I( e: i1 U, v8 V3 m
  开漏输出模式下,MCU通过左边的①(位设置/清除寄存器)或(输出数据寄存器)写入数据后,该数据位将通过②(输出控制电路)传送到④(I/O引脚)。1 Y4 I0 O: c3 L2 Q+ x6 d* c
  同时,输入功能可用,⑤(施密特触发器)处于开启状态,可以通过⑥(输入数据寄存器)可读取④(I/O引脚)的实际电平状态。0 W! H0 h, Y4 j" s: w% O
/ T# N4 n! d5 u' Z0 Y: r7 }
  当MCU输出低电平0时,经过“非门”后,转换为高电平1,N-MOS管导通,使I/O引脚输出低电平。
- {5 N) y/ n- m6 D& u5 g" {+ ^! V# U) A  当MCU输出高电平1时,经过“非门”后,转换为低电平0,N-MOS管断开,I/O引脚处于悬空状态,此时I/O引脚输出的电平高低是由I/O引脚外部的上拉或者下拉决定。
+ |/ T3 C! M# I0 C! W& O, J: Q4 G
% z6 w7 K+ ~5 e/ r0 ]- ?3 k% I  开漏输出,输出端相当于三极管的集电极。要得到高电平状态需要上拉电阻才行。适合于做电流型的驱动,其吸收电流的能力相对较强,一般20mA以内。- R: b+ v* K: m; l
3 |' E4 s- G1 p/ D
4f16d647eafe454983424cf0242b3378.png ( G0 b) n. o. i% }5 A

8 @6 d" E" Z, @: M: |4 d. {6. 开漏复用输出模式(GPIO_Mode_AF_OD)
+ I  D" ^  n1 v  G+ w  GPIO可以是通用的IO口功能,还可以是其他外设的特殊功能引脚,这就是GPIO的复用功能。+ K# p4 F# S' P. F$ g8 q7 M
# r/ x7 W% j( M
  GPIO复用为其他外设,输出数据寄存器无效,④(I/O引脚)输出的高低电平由①(其他外设的输出)决定。  F6 V" w- b+ I6 s9 S6 h* ]
  同时,输入功能可用,⑤(施密特触发器)处于开启状态,可以通过⑥(输入数据寄存器)可读取④(I/O引脚)的实际电平状态,同时外设可以读取IO引脚的信息。3 K1 \- R9 K. n( ~" U# ?
6 k; g9 a7 q: N
  开漏复用输出模式与开漏输出模式的配置基本相同,除了输出信号的来源不同,其他与开漏输出模式的功能相同。
! f1 d0 _) o& v# T# w2 _9 i  即,②(输出控制电路)的输入,开漏输出模式是由输出数据寄存器输出,开漏复用输出模式是由其他外设输出。
4 A" V, P5 [* r$ j* v- V4 G  w- @" n, h2 x
bf609dfdcc67416a9d1552a70fe4d125.png ' d$ H3 p% S) P% d

+ ~( \' ^  D4 M$ w' Z+ f  }7. 推挽输出模式(GPIO_Mode_Out_PP)
8 d0 y6 R+ r5 |7 z4 U) H  推挽输出模式,从结果上看它会输出低电平VSS或者高电平VDD。推挽输出跟开漏输出不同的是,推挽输出模式P-MOS管和N-MOS管都用上,可以把“输出控制”简单地等效为一个非门。8 z) {: j' U, h& _/ c
9 }8 H) A' H& t# H6 f/ a0 M; o
  当MCU输出低电平0时,经过“非门”后,转换为高电平1,P-MOS管截止,N-MOS管导通,使I/O引脚下拉到VSS,即I/O引脚输出低电平。
: K1 O0 }: v. s% e" ~  当MCU输出高电平1时,经过“非门”后,转换为低电平0,P-MOS管导通,N-MOS管截止,使I/O引脚上拉到VDD,即I/O引脚输出高电平。
4 t- [) S, Z# M& J4 n  同时,输入功能可用,⑤(施密特触发器)处于开启状态,可以通过⑥(输入数据寄存器)可读取④(I/O引脚)的实际电平状态。# q# S2 j$ K( d

4 o  w7 V" F# @' o  总结,推挽输出模式下,P-MOS管和N-MOS管同一时间只能有一个MOS管是导通的。当引脚高低电平切换时,两个管子轮流导通,一个负责灌电流,一个负责拉电流,使其负载能力和开关速度都有很大的提高。1 d$ `+ `4 ]/ E5 L/ X
& I' b2 u7 {# W# T' ~
  由于推挽输出模式输出高电平时,是直接连接VDD,所以驱动能力较强,可以做电流型驱动,驱动电流最大可达25mA。该模式也是最常用的输出模式。
: s6 M0 E$ b' Y! ]2 b" d& z
  e( w; k* d7 y8 r$ G2 ?2 O2 Z! N4 D
a1528fd645af410d89c874c179b6bf91.png $ t# A3 w( g4 T. n4 S# L6 l
# G8 X, W9 @' y6 r, G6 ?
8. 推挽复用输出模式(GPIO_Mode_AF_PP)
" A* k+ u2 E0 J" m% T: y4 D  GPIO可以是通用的IO口功能,还可以是其他外设的特殊功能引脚,这就是GPIO的复用功能。
! N, N+ `4 e  r$ w. s' N) |

7 J( ]+ K5 ~  h% x3 G. c: |# l5 U) t  GPIO复用为其他外设,输出数据寄存器无效,④(I/O引脚)输出的高低电平由①(其他外设的输出)决定。
- S6 k+ |" v- H/ C7 g  同时,输入功能可用,⑤(施密特触发器)处于开启状态,可以通过⑥(输入数据寄存器)可读取④(I/O引脚)的实际电平状态,同时外设可以读取IO引脚的信息。- N, C5 u2 r2 ?
8 h" F: h! l% L: G5 T) t
  推挽复用输出模式与推挽输出模式的配置基本相同,除了输出信号的来源不同,其他与推挽输出模式的功能相同。0 l+ o6 c& C" r' p9 q3 X
  即,②(输出控制电路)的输入,推挽输出模式是由输出数据寄存器输出,推挽复用输出模式是由其他外设输出。
' n* s, b9 k9 {( m: n
. t/ K% I0 }9 W  U) c4 @" ]
3b3e3b3e8c874c479509ad7d9206bff2.png
6 \: g( _+ y9 d6 r' ^

& }! ?+ a8 j# ]6 N( c+ R三、GPIO寄存器
, t3 m6 g  `: s% k  每组GPIO的寄存器包括:
1 g% m. S0 O7 _" H    配置寄存器:
8 ?: K/ I! R  y& O8 o      一个端口模式寄存器(GPIOx_MODER)8 P& A# N4 k1 l% L& }0 h
      一个端口输出类型寄存器(GPIOx_OTYPER)
; y$ V$ @% F+ h: p" p      一个端口输出速度寄存器(GPIOx_OSPEEDR)2 ]+ f& B  c: ~, C3 f
      一个端口上拉下拉寄存器(GPIOx_PUPDR)) m) S  o9 Z! _' t2 a
7 h, \: y& ]7 A  m9 K0 o
    数据寄存器:. a0 ^' ]! }: t2 O9 ]# I5 x
      一个端口输入数据寄存器(GPIOx_IDR)
7 `0 O8 q# \9 Y6 u3 M      一个端口输出数据寄存器(GPIOx_ODR)7 \" m6 R# V, L1 W, m0 J

" d" W$ J3 \! z( ?5 X1 I    置位/复位寄存器:3 ?1 K3 z; A8 u$ \3 Z8 y
      一个端口置位/复位寄存器(GPIOx_BSRR)7 R$ k  E. \9 M3 G* @

* o9 x* n# s' Z+ b; H    锁存寄存器:  |% W- z4 X& E, U9 m
      一个端口配置锁存寄存器(GPIOx_LCKR)
* X  p# ~+ A4 D
. D5 P* h2 \" |
    复用功能共寄存器:5 ~1 a+ D2 s7 ~6 y5 \
      两个复用功能寄存器(低位GPIOx_AFRL & 高位GPIOx_AFRH)
- @- Y$ j( T4 ^5 R1 n- A' V
7 i  {3 |" g/ E/ D! C1 p7 s: k注意:
$ |4 X: i- V. R3 ?$ |* t    ① 每组GPIO由10个寄存器组成,如果芯片有 GPIOA ~ GPIOI 9个组,那么一共有对应90个寄存器。1 j/ Q+ H# C1 P# q  J/ F
    ② 如果配置一个I/O口需要2个位,那么刚好32位寄存器配置一组16个I/O口。0 [" p* b8 @/ g, d3 R0 `# X
    ③ 如果配置一个I/O口只需要1个位,一般高16位保留。
* a* _1 {) x1 p5 e8 `6 x) x0 U6 b    ④ BSRR寄存器32位分为低16位BSRRL和高16位BSRRH,$ d+ I: h$ r1 z5 Y$ M. T; H
      BSRRL配置一组16个I/O口的置位状态(1),
2 C' d' _8 Z* n: j      BSRRH配置一组16个I/O口的复位状态(0)。. a0 z* G3 ~' `( _
    ⑤ rw表示可读可写;r表示只可读;w表示只可写;Res.表示保留位,必须保持复位值。
2 n9 R5 x' [7 ?$ V% ~  Z+ l. x" [) F/ T- k/ p! M/ R5 e7 ]
QY[R__HDX{4@_P106U]@KEN.png
3 {' O, F3 g( N' m( w

/ B5 a; @+ n7 F7 W2 E1. GPIO端口模式寄存器(GPIOx_MODER)8 H3 k7 Z( k  S9 ]8 |
  该寄存器是GPIO的模式控制寄存器,用于控制GPIO的工作模式。' b: I' B8 n; ~' T
  该寄存器共32位,每2个位控制1个I/O口。8 n/ i( r, t; J8 \9 p* m; m

7 s* y/ X% ?9 z, _& s  以 GPIOA = 0xABFFFFFF 为例:
# O6 Z+ T  I, h1 {' p    ① 低16位的值是FFFF,都是1,即 PA0 ~ PA7 默认都是模拟模式。
1 T5 U/ m+ B; K: v4 F! M$ `% L" X    ② 高16位的值是0xABFF,即 PA8 ~ PA12 是模拟模式,PA13 ~ PA15 是复用功能模式。
. `4 |  F# y* ?) D& u
6 R0 o5 j) o2 c+ C
AH2G}26%B][KN)1O]06}X~W.png R7V{4%]JUY%NFLOBS{H(6TQ.png
% l/ k) `/ |5 f  Y% }* V3 @# N5 H" g) |" [
" _) F& Q  R1 `+ _
OOMVS{`_Z8W`7}]A02]E6D1.png JA8ZGXSR9IK%B%`3LPLS9%I.png
+ p- V6 K1 J! U1 Z) C$ i# a  V1 ?5 @8 o/ W; t* o4 |  R1 y2 M/ I, m; g
  P" x  x- M9 v$ K  T' r1 U+ C: ?
位 2y+1:2y MODERy[1:0]:端口x配置位(Port x configuration bits)(y=0…15)1 [, Z5 h! A5 D. \: S
         这些位通过软件写入,用于配置 I/O 模式。* @- \, b# u1 N8 k( |6 M
          00:输入模式(复位状态)5 y% x6 Y  _. l' A( S% c
          01:通用输出模式
) m( K( i8 ?$ R. ]: u/ S5 V          10:复用功能模式. U6 A2 ^6 m- m; I/ R$ d2 d
          11:模拟模式+ t: ~* u, l  ~3 u& q/ H' ^" [
4 [' y5 |* f# I% n, z, P
2. GPIO端口输出类型寄存器(GPIOx_OTYPER)$ J. i1 c4 y! [+ ~: o; k9 k4 ?
  该寄存器用于控制GPIO的输出类型,仅用于输出模式,在输入模式(MODER[1:0] = 00 / 11 时)下不起作用。4 M6 }5 |8 _" r; F. l- Q
  该寄存器的低16位有效,每1个位控制1个I/O口。5 ]5 |. z  p5 x  {8 {0 \# L

1 h0 }( n& Z' Q3 d/ M8 q7 l  复位后,该寄存器的值均为0,即I/O口在输出模式下默认为推挽输出。* |+ P' j; R8 g* ]

, @, `  ?4 t& v( x; L! y
O2IH6(WY3130OHOJ27L(VH3.png ~_YZC)F18{B6Z2X%CH_`{YX.png - \1 @8 t  o) V4 z( `4 s% _
4 y2 m6 D6 c# H) u$ a2 S' m
V(BGF0RBV5Z8][ST[TQA1Q3.png Z0MF9OM{TZA5{SK0B(_CQGJ.png
: Q* k# J& I! r; k0 j4 }4 z
# B6 `! n) w5 Y5 q5 u0 P7 N+ V1 z位 31:16 :保留,必须保持复位值。' Y" w, R2 a! M

3 D5 O/ S) I- M8 M3 u5 }! g位 15:0  OTy:端口x配置位(Port x configuration bits)(y=0…15)
/ D* ~3 R0 e8 R* }' c5 a       这些位通过软件写入,用于配置 I/O 输出类型。
3 l& \7 r  l& D/ [* b# F# R        0:推挽输出(复位状态)! a0 k- \6 `, P  [! n6 T, t2 T) _
        1:开漏输出# a' D* x7 a2 j% v8 ]0 d
& f2 U, l7 A$ i! t# J5 l
3. GPIO端口输出速度寄存器(GPIOx_OSPEEDR)* U+ ]6 v" O0 s; f' P
  该寄存器用于控制GPIO的输出速度,仅用于输出模式,在输入模式(MODER[1:0] = 00 / 11 时)下不起作用。7 C4 I! l* D* Z$ ?
  该寄存器共32位,每2个位控制1个I/O口。
3 |. r' u# s. B: |; |
2 F2 ]! y  P6 {. N  复位后,该寄存器的值均为0,即I/O口在输出模式下默认为推挽输出。3 j# _6 d' q0 G8 X
[EQ0_~RWQC{SV{I`UGK1GKO.png 7GBHESLVM%LF~]Q_[BOF{ES.png 4 {5 z7 V: ?. ^/ d5 Q% O; B" J

2 k+ k/ s1 S  t& I1 w+ D+ t {IWD0VG2CL1KY1~J[`{ESVP.png (0N@``S(Y419T6JEA}32(D2.png 8 k* t5 e# S+ e8 E& y  ^6 Y" v- X3 t

+ h1 |! ~, j6 K! G5 x" v3 y* K" j: g+ o) F" |
位 2y+1:2y OSPEEDRy[1:0]:端口x配置位(Port x configuration bits)(y=0…15)0 D" g0 D, j, g
         这些位通过软件写入,用于配置 I/O 输出速度。
+ A% h% U4 G" t          00:低速 ( 2MHz)/ n! N/ T5 Q, v" ]: u: t5 X8 r
          01:中速 ( 25MHz); m# d- S4 c* }7 u' g
          10:高速 ( 50MHz)
. o8 j6 D) N7 ^: _! G% O0 r          11:超高速(100MHz)
% I3 f4 `3 g; F; Y         注:  有关 OSPEEDRy 位以及 V D D V_{DD}VDD范围和外部负载的值,请参见产品数据手册。, z! G1 D* }& Z; a$ q8 u4 [! p
( ?2 L0 B8 j! v  E  K
4. GPIO端口上拉/下拉寄存器(GPIOx_PUPDR)
; B/ Y# a. p- C  该寄存器用于控制GPIO的上拉/下拉。  `8 x- R4 c) B! q1 U
  该寄存器共32位,每2个位控制1个I/O口。
$ u, d# s. @+ c# K+ z& c/ {3 v- p& L  b; o  M3 Q
  复位后,该寄存器的值一般为0,即无上拉或下拉。
0 Y8 T6 t7 E- H' i( s8 t0 J4 t( r, A* `
V4T5QJV(%MKS(3P)8]L]_H7.png
+ ?% [& M  P& a) @6 X# R* S/ w

. d9 Z6 Q7 y  {& ?( V' z' Q位 2y+1:2y PUPDRy[1:0]:端口x配置位(Port x configuration bits)(y=0…15)+ e2 d6 b2 @$ b0 y" N1 v; m
         这些位通过软件写入,用于配置 I/O 上拉或下拉。5 \- y  f% ^9 R) j) Y+ `! a# }
          00:无上拉或下拉
# J  O$ x1 e  j4 {) n! ^. y( e  f8 H          01:上拉/ e# Q! _; {5 r' R* i' E
          10:下拉: P5 K# C3 e6 n, X& f/ ]8 m
          11:保留
1 @+ u& g4 C4 R# E8 Z

+ l6 y5 H; R9 N8 c# W9 `6 F5. 端口输入数据寄存器(GPIOx_IDR)
# @# Y0 C4 R' n4 z4 X4 u  T  该寄存器用于控制GPIO的输入高电平或者低电平。
5 {7 e* R# Q2 g3 X1 G5 H  该寄存器的低16位有效,每1个位控制1个I/O口。
1 C1 L9 y2 }+ r% K: B: \; ]& `3 }5 r$ v& A5 k
  该寄存器是只读权限,当CPU读访问该寄存器时:
' c& K: _* j) U) o& {' C    如果对应的某位为0,则表示设置该I/O口输入的是低电平;7 i% {" _1 V& D: p
    如果对应的某位为1,则表示设置该I/O口输入的是高电平。8 m1 Z3 n8 k# X; ]" h
8 I0 g1 u' l1 `6 S8 v/ r9 |
{K%$P9$(6%P_]Y_J2{P)PG9.png 90$QJ{1XLIOFKO@SM~V)D.png ) Q& b8 j# [* I' w
# t, U. \8 o+ Y( A% W+ Y' N7 s  d
9U2UCNRPCXVB_{1CA(@%Q.png ( K$ F. D6 @0 c% I5 x" ?6 o

! K5 W$ W/ }0 V# g4 X9 ?# b位 31:16 :保留,必须保持复位值。- Q7 T+ Q5 J& P; z* M
! t" H% t: a# R/ q" `* @" y
位 15:0  :IDRy:端口输入数据(Port input data)(y=0…15)
9 t1 S& m/ ~& J( E; ?        这些位为只读。它们包含相应 I/O 端口的输入值。
- ]  h2 w7 y) U% d5 ]
: i; V3 Z2 @6 D
6. 端口输出数据寄存器(GPIOx_ODR)$ }" E4 y6 H, t
  该寄存器用于控制GPIO的输出高电平或者低电平。
0 o% p: O- x% P; k, X1 |- a3 I  该寄存器的低16位有效,每1个位控制1个I/O口。
, D; D5 B0 z9 h) B( |& e% N/ I5 u) v0 D% f  a: h* T5 [% m
  当CPU写访问该寄存器时:
* w# W+ |' k" A# ^  L3 Q" c& L) ^: X) n    如果对应的某位写0,则表示设置该I/O口输出的是低电平;
" V+ `; Z2 H1 R+ c; e' V; x    如果对应的某位写1,则表示设置该I/O口输出的是高电平。: ^# }: ]4 x& G3 y5 Y* f

$ o7 w# N4 Q3 f; o$ X5 L
%PV)~}9{_JQU}XUQ]TO])U5.png @G~L44BUNJ129%XXMEQUAVE.png
* u4 g* s4 g+ {( b# s5 ^7 [0 {1 j" B' _# N4 q2 ?" c
`(]ZALR{D660XBEKN$G4UCB.png [X]L]~WI%~RM~GA1W`8HHYU.png , @  e% Y3 ~" m5 w

- I2 P9 B3 a$ S9 O位 31:16 :保留,必须保持复位值。
8 \( C8 U5 }/ }- S# h8 d9 d% Y* M9 H* `9 Q8 s4 ?; b0 q- O) ]$ p
位 15:0  :ODRy:端口输出数据(Port output data)(y=0…15)8 |2 q9 e& h& g$ J: x
      这些位可通过软件读取和写入。3 ^6 {9 E9 D0 U" U. m9 c; F
      注: 对于原子置位/复位,通过写入 GPIOx_BSRR 或 GPIOx_BRR 寄存器,可分别置位和/或复位 ODR 位(x=A…F)。3 L  B  k+ F2 o% g1 @6 ?7 C
9 E5 x5 Y% v2 }, S6 }
8 W5 X; ^8 Q( E7 w0 z
7. 端口置位/复位寄存器(GPIOx_BSRR)! \: {2 T0 V- `7 ?! H6 N
  该寄存器也用于控制GPIO的输出高电平或者低电平。/ ~% C. u; L" S
: n4 Z6 U; w3 u' \3 x* \2 T. J! A
  BSRR寄存器32位有效。' G3 a% q! |9 w. ]* D5 b
    对于低16位(0 ~ 15):
2 G$ m" I9 N  \' @; L' P* E$ C+ m      我们往相应的位写1,那么对应的IO口会输出高电平;
2 j, a+ ^7 X- O" b8 n7 ~. O# M      我们往相应的位写0,对IO口没有任何影响。  j+ C9 c0 U1 M! Z* h8 E; j% I
    对于高16位(16 ~ 31)作用刚好相反:
# y( [' G3 j: w; Z; N5 p      我们往相应的位写1,那么对应的IO口会输出低电平;
: G  V1 c  V2 W2 `# o$ d      我们往相应的位写0,对IO口没有任何影响。  ]+ R1 G0 F& {  Z4 J2 N: Q# R2 Y

" T8 A  {8 h1 L. h0 w  总结:! U6 w0 ^7 d* R1 ?3 h
    对于BSRR寄存器,写0时,对I/O口电平无影响。
0 C9 m5 ^: W  p3 m- k. [    如需输出高电平,则将对应的BS位写1;
+ T, K+ \. F* ]7 |, i    如需输出低电平,则将对应的BR位写1。7 N2 V) ]8 d$ J6 L7 I2 g% @

7 p$ h- |9 [' l. {/ {: k  b  ODR寄存器和BSRR寄存器的不同之处:
. F' p+ q+ E; V6 }    ODR是可读可写权限,而BSRR是只写权限。
, a/ R0 v2 l* G$ a( l. i' q    ODR寄存器,我们要设置某个IO口电平,我们首先需要读出来ODR寄存器的值,然后对整个ODR寄存器重新赋值来达到设置某个或者某些IO口的目的。9 Q/ c, f4 p+ G: d* Q2 v: e
    BSRR寄存器,我们就不需要先读,而是直接设置即可,这在多任务实时操作系统中作用很大。1 F% P- \/ H% q/ k
    BSRR寄存器比ODR寄存器更好的地方,就是BSRR寄存器改变引脚状态的时候,不会被中断打断。而ODR寄存器有被中断打断的风险。
) ^  x* g# p- u, r1 H! V. V$ A
2N{EQMKR5V()PI08HU5LZ@5.png TGO8%4)IJCX}_@EWIEAP03O.png
4 E: l5 ^1 B% ]1 {- M. ~' U7 s1 w% y! Z% l) m; v
XHF_S1KHV%C~RKFAM8BNVOG.png ~TKVTVFU84`5QBXKV5{_M.png
" U4 q+ k; X; e: j9 n/ x, A( h! W0 s- Q, x
5 ^* {. p! ^- j. l3 k/ m9 j4 Z
位 31:16 BRy:端口x复位位y(Port x reset bit y)(y=0…15)" T+ o, S  f5 _; s% @" C& C
        这些位为只写。读取这些位可返回值 0x0000。
+ H( H' T  G) R         0:不会对相应的 ODRx 位执行任何操作; X. i; x$ C! U8 O1 E9 x7 u
         1:复位相应的 ODRx 位, c  c& t( [4 q7 t+ K5 E: z4 `1 n' Y
        注:  如果同时对 BSx 和 BRx 置位,则 BSx 的优先级更高。1 E, W+ H% B4 c$ [0 ?9 |% o# v& A
; X! M& q, u4 Y6 _! j8 N& D, ]
位 15:0  BSy:端口x置位位y(Port x set bit y)(y=0…15)
+ A2 T4 d$ k: \: h: w        这些位为只写。读取这些位可返回值 0x0000。
: m4 R3 O3 g6 I- G. G         0:不会对相应的 ODRx 位执行任何操作
2 c1 F, E* y+ T; @- f) ~         1:置位相应的 ODRx 位
4 S+ v; B1 Q9 e* e; e. q1 S  ?- _
7 L; L" t& W0 S; [
8. 端口配置锁定寄存器(GPIOx_LCKR)
2 j9 D) {0 Z. H( _/ }6 x  该寄存器的每个锁定位冻结一个特定的配置寄存器(控制寄存器和复用功能寄存器)。6 x- F, `7 f: B
. N6 x- A# m+ c3 _( q% v
G{29G`WZT@YW[]W2BAO%Y79.png QM2EK7`_NVIX)YPG7]Z1CN6.png 4 g- j/ t4 L$ Q( r* }* T% q

2 R* g/ u  ]; a, x" P  J& [ FNI2}4S{88RY$B8{$DW6N1V.png O~X}`Q3H`J{{]ADMR6P4%Z3.png
8 `6 q) X6 {% w0 Y: J; r1 B! e# B# M. v4 R

: f0 S  o( `) {+ I& D6 J位 31:17 :保留,必须保持复位值。
; t, g, b5 j! j; k  h
( b4 c- P& H$ L& X3 q位 16 LCKK:锁定键(Lock key)
. v5 p# Y4 a$ w6 v+ Q0 F2 |# @     可随时读取此位。可使用锁定键写序列对其进行修改。! N( x0 ?4 O6 }* }% c
      0:端口配置锁定键未激活
  A! w3 o# k/ H. ]: I8 u      1:端口配置锁定键已激活。在下一次 MCU 复位或外设复位之前,GPIOx_LCKR 寄存器始终处于锁定状态。1 E% A/ v9 ^. I, ^! T* n. S
9 \& {* r1 F) ]
位 15:0  LCKy:端口x锁定位y(Port x lock bit y)(y=0…15)
6 `6 @6 o: n0 w$ @1 w        这些位都是读/写位,但只能在 LCKK 位等于 “0” 时执行写操作。0 Z4 I% S1 |! a4 b8 z8 i/ |$ _! D
         0:端口配置未锁定) W/ ~+ `) C4 J7 T6 e+ ~) M, d
         1:端口配置已锁定% A( b" c) i' F8 f
  e, d4 s' X: T. E
9. 复用功能寄存器(GPIOx_AFRL、GPIOx_AFRH)
4 K9 X2 T( V# i" R4 `( w  i3 d' [. i  该寄存器分为高位AFRH和低位AFRL,分别控制16位,即分别控制8个I/O口。
" a; t* v5 m% H# q& y4 j! r9 _

1 G1 N1 o! S9 B) z. J  j  复用功能寄存器有2个,都是32位有效的寄存器,分高位(AFRH)和低位(AFRL)。复用器采用16路复用功能输入AF0~AF15,通过GPIOx_AFRL(引脚 0~7)、GPIOx_AFRH(引脚 8~15)寄存器对复用功能输入进行配置,每四位控制1路复用。% o4 l1 f+ n5 P( P

6 S- W, `7 R$ r! O; u  I/O口并不能随意复用功能,而是有规定的,可以通过查阅数据手册来获取每个I/O引脚的复用功能。
' h4 o* O! ?6 J& Z: Q4 u+ U8 [. l$ {
~7772{@UWMK~8A30)15MIIL.png 7 g" O  L/ M6 `- I

1 g( b. o" M7 G" e5 r6 G3 I* ^9 b位 31:0  AFRy[3:0]:端口x引脚y的复用功能选择(Alternate function selection for port x pin y)(y=0…7)
) P' w1 {0 A3 i        这些位通过软件写入,用于配置复用功能 I/O 。
- I7 Y& B' G! E! w0 ?: X: J
5 @; u; H7 V, _5 X) _: G# ^
        AFSELy 选择:
7 t: V+ q- V( P$ C/ M$ m/ F( C6 ^         0000:AF0             1000:AF8
8 @) c1 B  z7 l         0001:AF1             1001:AF9
& W) J6 o) W3 q) v5 |2 [% o         0010:AF2             1010:AF10
3 Y) L0 \- I' ~& t8 u         0011:AF3             1011:AF11
3 j" c! u" O5 C. B         0100:AF4             1100:AF123 a( K+ e" e& D  K) H: |6 m. @
         0101:AF5             1101:AF13
1 F& R+ ]! S8 M$ N9 K9 T& G1 A% j& V         0110:AF6             1110:AF14
& X% h( h" J" ?9 y         0111:AF7             1111:AF159 q+ q, s" o' h" p0 d
————————————————; O: \& V% j0 _5 G. F' ^
版权声明:零号萌新
6 d& K0 a3 `  m$ Z
. S. g. e6 d3 b9 H0 s& w3 z
0 D& r* D$ b1 r4 ]6 A
26ce3086451745d080b00eb74f160861.png
27_SL_3$XV%][3_W@]84YE1.png
收藏 评论0 发布时间:2023-2-1 21:37

举报

0个回答
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版