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

STM32 GPIO的工作原理和配置

[复制链接]
STMCU小助手 发布时间:2023-2-1 21:37
一、GPIO是什么?2 o% e# |' M! z
  GPIO,全称为General Purpose Input Output Ports(通用输入输出端口),也就是通用IO口。$ v$ T' X' e. b) l  D1 {
3 I6 `* n. w" {7 I
  GPIO是控制或者采集外部器件的信息的外设,可以由软件程序控制,用于输出或者输入高低电平。# @7 i' [5 T/ g3 U

" j$ ~) [( v' |5 H3 P  GPIO的使用非常广泛。可以与硬件进行数据交互(如UART),控制硬件工作(如LED、蜂鸣器等),读取硬件的工作状态信号(如中断信号)等。1 m4 t3 E; _1 t0 V* X& v. w2 c
1 r2 l2 z! d* ~( X
  GPIO按组分配,每组16个I/O口,组数视芯片而定。) l" ?* |- C: C. j7 {
  以STM32F429IGT6为例:, o; x9 K5 h! D4 c7 F
    ① 一共有9组IO,PA~PI。8 Y; d7 H, d- A7 m
    ② 一共有140个IO口,其中PA~PH每组有16个IO,PI只有12个IO口。' i* D; p: N" t6 U/ m. y) x
: v4 V# @) m& V0 L7 \
  注意:芯片的数据手册中,引脚标注为 FT 的,是可以兼容 5V 电平的。- I" G2 V& @4 [  _- Z7 ?( I
, T, n+ S/ a* Q; x
ST官方提供的GPIO基本结构图8 \0 S7 i2 H3 f$ o. q8 Y

  I: _7 A1 B& C' R  k" {
8bea383ab6aa44cfa614f58d126c5b6e.png - Z; t7 @6 W6 j- V' y1 S
5 ~: J2 y6 ?4 ^1 T# m- |3 A
二、GPIO的8种工作模式! Z8 f# |8 m" \0 X( O
  8种工作模式,分为4种输入模式和4种输出模式。
' ]  |) Y8 D7 @, H  R: ?* g) R& C  P, z9 T
1. 浮空输入模式(GPIO_Mode_IN_FLOATING)1 j- n0 z/ x% p
  浮空输入模式下,上拉/下拉电阻为断开状态,施密特触发器为开启状态,I/O引脚的输出功能被禁止。; h: e* B4 ^) [' l, k; x
. q  \, B8 o! B7 P* @+ n* u
  该模式下,外部的电平信号通过①(I/O引脚)进入MCU,先经过②(施密特触发器)的整形后,再进入③(输入数据寄存器),最后MCU可以在④(输入数据寄存器的另一端)随时读取I/O引脚的电平。$ s9 M8 U' k, F$ u3 p% D* h7 o$ A
  即,整形后的I/O引脚的电平信号直接进入输入数据寄存器,MCU直接读取I/O引脚的电平。5 W5 g# k6 n% Y8 Z
$ N4 ^  ^0 J7 ~# w- x/ ]! w" m: i! i
  如果I/O引脚无输入时,MCU读取到的电平状态是不确定的。所以引脚不建议悬空,易受干扰。; D6 L& @/ \' S9 l6 U
  如果I/O引脚输入高电平时,MCU读取到高电平1。2 ?  t2 h2 m4 m& I; A) M
  如果I/O引脚输入低电平时,MCU读到低电平0。
6 }" ~- d7 N2 O& q, a' q
7 W2 V; U9 l) A3 W. ~- E
  总结,浮空输入模式:
% T. |0 G9 i$ M- {) W/ c. a: C    I/O引脚输入什么电平信号,MCU就读取到什么电平信号;
1 H6 \: \6 }* T& a    无信号输入(默认)时,MCU读取到的电平信号是不确定的。
# N& u% I- j( j( U  k+ K! G2 a: ?: {3 n, Q. K
  浮空输入模式,可以用于KEY识别,RX1等。  r1 ~2 I) f  H( i

) [5 {5 Q; b- R: N fabbb1f2acbd43b1bba7afe5fa5077e5.png $ e5 I& i. l7 x- ^5 {

. R6 v* p) s3 p( S. p5 \
2. 上拉输入模式(GPIO_Mode_IPU)" U' W$ Y# e; u, z' h$ X8 ^" s
  上拉输入模式下,上拉电阻导通,施密特触发器处于开启状态,I/O引脚的输出功能被禁止。
3 \+ z. U3 o# A8 a  GPIO的内部上拉电阻的阻值较大,所以通过内部上拉输出的电流是很弱的,即“弱电流”。  z7 V4 P' h8 @2 n- ]( O) |
  如果需要大电流用作电流型驱动输出,还是要用外部上拉电阻。/ |& v" f4 L4 D. B0 ]

) U* m0 x- \; s3 |* H
       上拉输入模式与浮空输入模式不同之处,是在①(I/O引脚)和②(施密特触发器)之间接入了一个上拉电阻,将电位拉高,比如拉到VCC。
/ b* _$ i6 [; K! _7 I" m/ L" q4 |$ Z2 S8 d; P& `
  如果I/O引脚无输入时,I/O引脚处相当于断开,上拉电阻的电流直接流向④,MCU读取到高电平1。
0 y& }( |. ~. C, ~% C/ |% K* z) m  如果I/O引脚输入高电平时,I/O引脚的电压等于VDD的电压,电流还是流向④,MCU读取到高电平1。: |& n6 l9 S2 I  c, W: w% t" d
  如果I/O引脚输入低电平时,I/O引脚处相当于接地,上拉电阻的电流直接流向I/O引脚,MCU读到低电平0。) R5 I! v$ M! U$ M" A7 ~$ }
* |+ o# z& [' ]6 Q3 \& m2 j2 s
  总结,上拉输入模式:
1 q0 }) q' ?" j; A  ~    无信号输入(默认)或输入高电平时,MCU都是读取到高电平1;
' {! o; I! O% h3 R    输入低电平时,MCU读取到低电平0。
8 W0 u# U& n, P" k' ?7 R, f6 }$ m" y: p4 z7 ~$ Y
  上拉输入模式,可以用于按键检测。( D" F7 x$ H; V

9 ^5 Y# k$ G$ ?$ n. h
ceb19f5f5d984679a43f899a6919d100.png
7 I$ H- \; p8 t3 t
4 n( M. v) I. I" A' W1 O8 s! F7 o
3. 下拉输入模式(GPIO_Mode_IPD)
0 F# ?. x( T/ b/ Y8 z* j  下拉输入模式下,下拉电阻导通,施密特触发器处于开启状态,I/O引脚的输出功能被禁止。$ ?$ U* e: a: H. U. K9 b- A: w6 k

5 x+ t7 i; g0 i) r! H1 m% E
  下拉输入模式与浮空输入模式不同之处,是在①(I/O引脚)和②(施密特触发器)之间接入了一个下拉电阻,将电位拉低,比如拉到GND。( }/ i" s' Z7 {9 W( `7 b. v
) u% f* Z# z! V( W5 k! a( k% d
  如果I/O引脚无输入时,I/O引脚处相当于断开,I/O引脚的电压等于VSS的电压,MCU读取到低电平0。1 h  X: Y+ D; o- |) @% f8 H+ ~8 K
  如果I/O引脚输入高电平时,由于下拉电阻阻值比通道④的阻值大,所以电流流向④,MCU读取到高电平1。3 J3 o  i9 Z- o$ i0 v7 {
  如果I/O引脚输入低电平时,I/O引脚处相当于接地,I/O引脚的电压等于VSS的电压,MCU读到低电平0。
* E) Y: D; ~6 l6 n5 f5 I$ G1 p" D  q+ H- z; x) l& A
  总结,下拉输入模式:4 M6 [; |7 @+ {
    无信号输入(默认)或输入低电平时,MCU都是读取到低电平0;' X" H+ k- Q# j$ e# ]
    输入高电平时,MCU读取到高电平1。0 Z7 {% l: p5 f8 x
, }1 X* d: {- }7 E0 Y" S
  下拉输入模式,和上拉输入模式相似,可以用于按键检测。* N% c( {+ r2 ^+ o  N0 `2 j0 |

; F* F* C% ~) |3 U8 f" R
2f9bc70a88cd487a87c9ce33d4e14f34.png
5 \0 ^" S. _- J

4 V0 |- O( c! q  z9 ~; o! I4. 模拟输入模式(GPIO_Mode_AIN)
( \+ n5 g3 I1 K: a  模拟模式下,上拉/下拉电阻为断开状态,施密特触发器为关闭状态,输出部分的双MOS管也断开。
& D5 k1 k$ N8 Z. p1 D0 u' |
  `8 ^* `" o8 e- B1 D  模拟输入模式下,外部的电平信号通过①(I/O引脚的模拟输入通道)进入MCU,MCU可以直接在③(模拟输出口)随时读取I/O引脚的电平。% t9 p, z& @* b7 P6 v4 D

9 z. v) t5 T6 u  由于施密特触发器断开,所以电信号也无法进入输入数据寄存器,所以MCU无法在“输入数据寄存器”中读取到有效的数据。
  t  J+ @/ J1 \( I4 k( c2 ^; u# J; e4 k  u, F
  总结,模拟输入模式:
0 ^4 c1 I7 r/ _8 _1 I    输入的电信号为模拟电压信号,而不是数字电平信号。1 X8 x) U0 Z2 ]" q9 F
    模拟输入的模拟电压信号,直接送到片上外设,一般是ADC。
& D' X$ a$ a1 \' c: T    除了 ADC 和 DAC 要将 I/O 配置为模拟通道之外,其他外设功能一律要配置为复用功能模式。" ?) O1 O7 B* |2 G; b
1 ]- T4 v$ P0 ^9 r2 J; {/ I7 D5 E
  模拟输入模式,可以用于ADC采集或DAC输出,或者低功耗下省电。- K9 j) D  ]. M: |$ I7 u
! l. G, p8 H1 M; F2 U# b6 Y
! D7 U2 w3 w5 \( A+ {. i
) t) P( S8 X( w/ O" d0 i
5. 开漏输出模式(GPIO_Mode_Out_OD)
7 b: G. k/ W/ ^& Y  开漏输出模式下,P-MOS管一直处于断开状态。1 n8 N, `- a, o" P

6 {) Y/ [* I0 b& @9 ?/ n! q
& S* K* `, q3 H. h+ h: |" [
  开漏输出模式下,MCU通过左边的①(位设置/清除寄存器)或(输出数据寄存器)写入数据后,该数据位将通过②(输出控制电路)传送到④(I/O引脚)。" u: z: V# @- B' Z5 y- v
  同时,输入功能可用,⑤(施密特触发器)处于开启状态,可以通过⑥(输入数据寄存器)可读取④(I/O引脚)的实际电平状态。
# S1 W% V. M6 G# I8 O
+ w' L3 x. U6 a  @. b7 J  当MCU输出低电平0时,经过“非门”后,转换为高电平1,N-MOS管导通,使I/O引脚输出低电平。
3 p: v4 T( x/ J3 N* M8 q% x8 K, C  当MCU输出高电平1时,经过“非门”后,转换为低电平0,N-MOS管断开,I/O引脚处于悬空状态,此时I/O引脚输出的电平高低是由I/O引脚外部的上拉或者下拉决定。
  Y# V9 f( a) _
0 S& q& _5 F1 e  O, }; j  开漏输出,输出端相当于三极管的集电极。要得到高电平状态需要上拉电阻才行。适合于做电流型的驱动,其吸收电流的能力相对较强,一般20mA以内。
! S! e/ }+ y" L7 f2 r) {4 ?! ?  A1 ]8 S! l( ]
4f16d647eafe454983424cf0242b3378.png
0 {( i% ~6 h9 U/ ^0 w' P9 ?8 a% s# Q/ G& S
6. 开漏复用输出模式(GPIO_Mode_AF_OD); Y6 _, E, m/ P5 g$ a7 x
  GPIO可以是通用的IO口功能,还可以是其他外设的特殊功能引脚,这就是GPIO的复用功能。
+ c* y7 T( l. [
9 Q; g$ d. m3 d( T+ G
  GPIO复用为其他外设,输出数据寄存器无效,④(I/O引脚)输出的高低电平由①(其他外设的输出)决定。
3 L! C: P* C% I3 P2 n# G/ ~( I- S  同时,输入功能可用,⑤(施密特触发器)处于开启状态,可以通过⑥(输入数据寄存器)可读取④(I/O引脚)的实际电平状态,同时外设可以读取IO引脚的信息。
( F* _! ^2 l4 \7 w6 r% z/ B  k4 x5 q# Y. y$ f( N. d6 J& m4 q
  开漏复用输出模式与开漏输出模式的配置基本相同,除了输出信号的来源不同,其他与开漏输出模式的功能相同。
( {, r1 T; _- `. B7 x: g. l0 c6 z  即,②(输出控制电路)的输入,开漏输出模式是由输出数据寄存器输出,开漏复用输出模式是由其他外设输出。1 Q; P4 v( X$ ^6 d

2 k8 c) v# O" M# b+ x# x
bf609dfdcc67416a9d1552a70fe4d125.png ( i0 O' n8 P# z+ `& O* y
3 q3 {3 @7 j6 e  E
7. 推挽输出模式(GPIO_Mode_Out_PP)7 E9 e; c- f3 ^$ g7 o4 B
  推挽输出模式,从结果上看它会输出低电平VSS或者高电平VDD。推挽输出跟开漏输出不同的是,推挽输出模式P-MOS管和N-MOS管都用上,可以把“输出控制”简单地等效为一个非门。: z+ }' C5 b8 C1 F$ I
4 a+ x$ V8 z7 g
  当MCU输出低电平0时,经过“非门”后,转换为高电平1,P-MOS管截止,N-MOS管导通,使I/O引脚下拉到VSS,即I/O引脚输出低电平。
. v2 E9 V+ |; Q, t5 q, f5 s  当MCU输出高电平1时,经过“非门”后,转换为低电平0,P-MOS管导通,N-MOS管截止,使I/O引脚上拉到VDD,即I/O引脚输出高电平。: l1 `3 }9 ?) J" U6 t" E
  同时,输入功能可用,⑤(施密特触发器)处于开启状态,可以通过⑥(输入数据寄存器)可读取④(I/O引脚)的实际电平状态。8 M+ `4 T/ w3 y# R' }

; O4 r, k, S6 n! I5 c  总结,推挽输出模式下,P-MOS管和N-MOS管同一时间只能有一个MOS管是导通的。当引脚高低电平切换时,两个管子轮流导通,一个负责灌电流,一个负责拉电流,使其负载能力和开关速度都有很大的提高。
4 U& j4 u/ e) f, E1 I" G9 S
- r: m0 F7 U9 ~) _  由于推挽输出模式输出高电平时,是直接连接VDD,所以驱动能力较强,可以做电流型驱动,驱动电流最大可达25mA。该模式也是最常用的输出模式。
5 L2 n, r0 X" S( \; V9 A- X: o( W% K8 S4 K2 H
a1528fd645af410d89c874c179b6bf91.png
: b8 d  A& C" E# P3 l1 H7 m& V+ p( B( k. R* q% n$ _
8. 推挽复用输出模式(GPIO_Mode_AF_PP)! h+ b9 R: G' r5 P0 D# Y( c
  GPIO可以是通用的IO口功能,还可以是其他外设的特殊功能引脚,这就是GPIO的复用功能。* B( {- V; d: Y
# i' r- D: k" f7 Z
  GPIO复用为其他外设,输出数据寄存器无效,④(I/O引脚)输出的高低电平由①(其他外设的输出)决定。' [: k2 Y$ E- F3 \( G
  同时,输入功能可用,⑤(施密特触发器)处于开启状态,可以通过⑥(输入数据寄存器)可读取④(I/O引脚)的实际电平状态,同时外设可以读取IO引脚的信息。5 E8 {: b0 M9 `, S
5 ~+ L9 b. `/ M; ^% ~
  推挽复用输出模式与推挽输出模式的配置基本相同,除了输出信号的来源不同,其他与推挽输出模式的功能相同。8 `% h  X% g6 t4 ?, I
  即,②(输出控制电路)的输入,推挽输出模式是由输出数据寄存器输出,推挽复用输出模式是由其他外设输出。
" ~$ Q6 H2 B9 E4 @8 I/ `  |3 g5 Q! @4 c8 h
3b3e3b3e8c874c479509ad7d9206bff2.png
- ]; W: S+ N* M8 D2 o" z
4 d6 b$ P8 L4 O' g
三、GPIO寄存器! Y8 A! \9 w7 d/ ?2 N7 d2 U8 n
  每组GPIO的寄存器包括:
& d6 P4 M+ v* P9 @" @    配置寄存器:
4 z" }+ m! N5 M* K/ l      一个端口模式寄存器(GPIOx_MODER)
+ }' K, Q7 d  Q+ N. K      一个端口输出类型寄存器(GPIOx_OTYPER)
1 E! c5 P5 v+ M( E% E- D      一个端口输出速度寄存器(GPIOx_OSPEEDR)5 Q) k! v' K$ G' r/ `3 T
      一个端口上拉下拉寄存器(GPIOx_PUPDR)! M, g1 H/ Y# M& j8 m4 n% s! M

$ V8 t5 W8 ^1 r4 o+ J( o2 b& R" M    数据寄存器:3 e. l. c' y. H- \! V6 @
      一个端口输入数据寄存器(GPIOx_IDR)+ ?- v0 e5 ?/ i# P. \
      一个端口输出数据寄存器(GPIOx_ODR)
5 _0 @/ F9 {0 Z+ u) k

' u, @% }( U9 U2 P  B2 K    置位/复位寄存器:
' }9 W# l7 o7 {6 t2 F9 O      一个端口置位/复位寄存器(GPIOx_BSRR)
, d) @4 J* q4 a5 _3 C
2 `# Z: \0 U7 N2 i) _    锁存寄存器:
3 i8 d0 U" h9 \% X4 D      一个端口配置锁存寄存器(GPIOx_LCKR)4 }) f; h& I! h, R2 J+ V" r5 g( k  B

/ {- w( d; V# `7 \7 d    复用功能共寄存器:
# S' r" U8 h4 m      两个复用功能寄存器(低位GPIOx_AFRL & 高位GPIOx_AFRH)3 n, T. z8 J9 r2 |8 c
' f) X$ \# x- ~. @
注意:  g  A0 y/ E0 e7 X% G8 y, G& f
    ① 每组GPIO由10个寄存器组成,如果芯片有 GPIOA ~ GPIOI 9个组,那么一共有对应90个寄存器。
: o$ ?, x/ p5 ~! m, M' z* u    ② 如果配置一个I/O口需要2个位,那么刚好32位寄存器配置一组16个I/O口。
* f0 m% ]9 M- e) H' n3 e" ^    ③ 如果配置一个I/O口只需要1个位,一般高16位保留。
: }1 C/ x, v$ C: A& {    ④ BSRR寄存器32位分为低16位BSRRL和高16位BSRRH,* C: |8 K$ d3 C+ N
      BSRRL配置一组16个I/O口的置位状态(1),/ x3 U% X. }, I
      BSRRH配置一组16个I/O口的复位状态(0)。. U$ d+ `8 ~" v  y: N
    ⑤ rw表示可读可写;r表示只可读;w表示只可写;Res.表示保留位,必须保持复位值。: X6 }4 P' n! L4 R( c# p; B

7 B9 y" g  i6 e+ N( ^1 p  V7 `4 x
QY[R__HDX{4@_P106U]@KEN.png 5 _9 s1 F# o4 L: t$ u
2 L) M1 l- l) ?1 \8 V2 L
1. GPIO端口模式寄存器(GPIOx_MODER)# H: Z8 |( [: L3 d4 r6 Z0 L1 j) d  Y! f1 _
  该寄存器是GPIO的模式控制寄存器,用于控制GPIO的工作模式。
. g) T( a" O* {" z; B6 \8 l  该寄存器共32位,每2个位控制1个I/O口。" f, B) S4 p% A/ z# S
1 s% t- D  Y5 Y, n+ s. e
  以 GPIOA = 0xABFFFFFF 为例:/ M, E2 [8 ?( j, f! N! v
    ① 低16位的值是FFFF,都是1,即 PA0 ~ PA7 默认都是模拟模式。* `- s% ~: t( \/ }* h, S/ b
    ② 高16位的值是0xABFF,即 PA8 ~ PA12 是模拟模式,PA13 ~ PA15 是复用功能模式。& e; p. ~  G/ n" k& y6 E  b" J

" _2 A: H; O% P) w; O! d/ {% T
AH2G}26%B][KN)1O]06}X~W.png R7V{4%]JUY%NFLOBS{H(6TQ.png & E, p$ A- p1 _' f1 Z" F5 X9 H" n6 d
- `# U1 d8 ^! `, @4 D

6 Z. e+ u# |; g7 ~' {' H3 a OOMVS{`_Z8W`7}]A02]E6D1.png JA8ZGXSR9IK%B%`3LPLS9%I.png
2 r0 O. A$ [* p$ s0 e# U6 j
0 A! G0 {* `% I: X
9 o: r- W8 L7 R3 E  u' u位 2y+1:2y MODERy[1:0]:端口x配置位(Port x configuration bits)(y=0…15)6 ?$ Q2 P) Y/ U7 o# c" I
         这些位通过软件写入,用于配置 I/O 模式。) u6 O2 J- r$ @% V) y7 [9 _# g
          00:输入模式(复位状态)+ Z1 e8 T% j' r- d$ i; f  D) W" o
          01:通用输出模式
9 I1 M' O# m: t7 k! Z) l          10:复用功能模式. O- w3 n, Z. C, g  z
          11:模拟模式
: w* G( b* [" J" g" ?+ H" v3 L) \* k2 `0 b# \& |" P! K
2. GPIO端口输出类型寄存器(GPIOx_OTYPER)2 S$ Q% r- r) d+ X- P, h
  该寄存器用于控制GPIO的输出类型,仅用于输出模式,在输入模式(MODER[1:0] = 00 / 11 时)下不起作用。& c+ E: ?1 y5 f+ {
  该寄存器的低16位有效,每1个位控制1个I/O口。
+ M9 _7 T, m/ R( u6 x: M* b
0 X2 Q& i3 T: s! `5 g7 @  复位后,该寄存器的值均为0,即I/O口在输出模式下默认为推挽输出。
3 H/ [3 n5 P+ c# i  i' C9 |4 \# j! W$ _2 w! W& |+ E- C- c$ x
O2IH6(WY3130OHOJ27L(VH3.png ~_YZC)F18{B6Z2X%CH_`{YX.png 7 A6 V  K) Q* R% w) M9 w2 H
) l7 B  m$ J4 O3 L! y3 e
V(BGF0RBV5Z8][ST[TQA1Q3.png Z0MF9OM{TZA5{SK0B(_CQGJ.png
$ D: s+ u; ]- W. d" A& _3 P, q6 I  Y( c
位 31:16 :保留,必须保持复位值。
) K' D- p& u7 U6 s; q9 W5 d
/ A1 }; {- M' R2 M
位 15:0  OTy:端口x配置位(Port x configuration bits)(y=0…15)0 u$ q9 K5 g2 N
       这些位通过软件写入,用于配置 I/O 输出类型。, e, q+ B, v$ f; b0 M* ]
        0:推挽输出(复位状态)1 ?  Q, N# w" X* z
        1:开漏输出
: `; ^4 i  f, I; q
7 O9 q+ |1 f. e) S- i6 O/ @3. GPIO端口输出速度寄存器(GPIOx_OSPEEDR)
3 F7 K/ w+ y2 `  该寄存器用于控制GPIO的输出速度,仅用于输出模式,在输入模式(MODER[1:0] = 00 / 11 时)下不起作用。) x7 Z* f5 B2 Q: C$ m/ r" F
  该寄存器共32位,每2个位控制1个I/O口。
) C% \0 f( h; M
+ r$ i% A. I0 B, q7 v4 R  复位后,该寄存器的值均为0,即I/O口在输出模式下默认为推挽输出。
5 \1 P( Q% C# ?3 h% y [EQ0_~RWQC{SV{I`UGK1GKO.png 7GBHESLVM%LF~]Q_[BOF{ES.png
- z& I4 Q# y# }, T1 @, _

/ }0 {9 p& x/ C {IWD0VG2CL1KY1~J[`{ESVP.png (0N@``S(Y419T6JEA}32(D2.png
& e" b0 j. a' z2 l, _8 t
5 I! q: [/ F2 H* L. J' R# h; Q5 N: ?" i. x
位 2y+1:2y OSPEEDRy[1:0]:端口x配置位(Port x configuration bits)(y=0…15)
0 h) l1 \4 e: B2 b- z7 ?. g         这些位通过软件写入,用于配置 I/O 输出速度。
) @7 F9 X+ J: L% W' x          00:低速 ( 2MHz)
1 b1 N7 L4 t5 e0 G- t, L          01:中速 ( 25MHz). o9 {2 W( s/ U4 f* p3 Y
          10:高速 ( 50MHz)
& o' T; N1 U' H" w" N) E          11:超高速(100MHz)7 `6 t7 }0 z, C/ c4 B3 C" [- N: f
         注:  有关 OSPEEDRy 位以及 V D D V_{DD}VDD范围和外部负载的值,请参见产品数据手册。% z% `6 }! x/ r' ~$ w' e- x) n- ?
! g2 i5 v. c: K$ [0 j- N
4. GPIO端口上拉/下拉寄存器(GPIOx_PUPDR)
6 k; Y. a$ g0 e5 V- F5 g  该寄存器用于控制GPIO的上拉/下拉。
- f, V. Z: S" X( i: A$ t/ x  该寄存器共32位,每2个位控制1个I/O口。
+ `4 ^2 O3 l# k0 ]( I; B' }( T, u# [1 |
  复位后,该寄存器的值一般为0,即无上拉或下拉。0 N! Y, T3 o6 w) U
( }" \; V8 c3 [& x/ u* `
V4T5QJV(%MKS(3P)8]L]_H7.png
& h# z- Q9 a3 y9 r/ T7 q% B
: i3 S$ }- W; T* Q: C
位 2y+1:2y PUPDRy[1:0]:端口x配置位(Port x configuration bits)(y=0…15)/ l/ o" r9 Q+ ?3 [. l
         这些位通过软件写入,用于配置 I/O 上拉或下拉。
6 X/ e9 u( P+ W) e' f# g& U          00:无上拉或下拉6 O% e! P6 B. J8 p$ |0 J' @- Q
          01:上拉! G/ T- s( _5 a* k# ]
          10:下拉/ e+ v" b& g4 w- i0 w, Q8 A
          11:保留! R) M/ J+ c: w7 W4 X' D
; j4 H) C4 L( f- T8 l9 Q5 |
5. 端口输入数据寄存器(GPIOx_IDR)9 ~6 Y1 R6 H3 b3 W. r
  该寄存器用于控制GPIO的输入高电平或者低电平。3 O; b. V9 h8 N& B; H# ~
  该寄存器的低16位有效,每1个位控制1个I/O口。
1 E. k7 b! q& v) v$ m5 l
2 G. T! `! p  [7 z4 s! c  该寄存器是只读权限,当CPU读访问该寄存器时:- @) t0 M* y8 j. S
    如果对应的某位为0,则表示设置该I/O口输入的是低电平;4 o1 B' G/ o5 Z
    如果对应的某位为1,则表示设置该I/O口输入的是高电平。3 G6 J# C3 s$ B7 B6 }# \
" F2 I3 X7 u* l4 G. f9 Z
{K%$P9$(6%P_]Y_J2{P)PG9.png 90$QJ{1XLIOFKO@SM~V)D.png ) @0 U* L- P- v; J1 @
7 Q1 ]! D4 B4 v; G& v
9U2UCNRPCXVB_{1CA(@%Q.png 8 o- V. W1 r, b" q9 _6 I, o; z

( \7 v, A& o4 S$ e位 31:16 :保留,必须保持复位值。
- W- [0 X) c* B- m  V$ j
' h  M8 u$ N" k/ q" s位 15:0  :IDRy:端口输入数据(Port input data)(y=0…15)
. w: s) [8 m! X3 ~! A0 z& H' b1 v# H/ N        这些位为只读。它们包含相应 I/O 端口的输入值。+ g4 w' ]+ X) p# W; q" c8 n

8 @  c$ M$ B6 M; e; ]* N6. 端口输出数据寄存器(GPIOx_ODR)
$ ^% Y  }7 N( J2 n/ @  该寄存器用于控制GPIO的输出高电平或者低电平。
' p$ `: R$ x7 i4 ?& Q  该寄存器的低16位有效,每1个位控制1个I/O口。4 L7 C; Q3 t* C4 E/ \
* T+ T3 d+ f" G$ r/ G% M; ?3 F
  当CPU写访问该寄存器时:' f' ], r$ O0 [8 G
    如果对应的某位写0,则表示设置该I/O口输出的是低电平;# q, l' I/ l2 o1 w) M& D; Q
    如果对应的某位写1,则表示设置该I/O口输出的是高电平。- V0 W( T& [. w4 t) H$ z
& K& Y8 }$ b( ]- B5 {$ [- q, B3 H5 ^
%PV)~}9{_JQU}XUQ]TO])U5.png @G~L44BUNJ129%XXMEQUAVE.png
3 o- q$ h- F' T  B4 Y
" f) z5 \- [  G, \2 s; r `(]ZALR{D660XBEKN$G4UCB.png [X]L]~WI%~RM~GA1W`8HHYU.png
  c5 M3 h5 I/ A$ T9 d
! N. H. Z" S, ?# d8 z3 v9 ^& W位 31:16 :保留,必须保持复位值。1 g+ ^3 ~6 {( ]5 C1 ?4 y& m* s
; m9 y) Q& p: K* q- h* ]. x+ y" f
位 15:0  :ODRy:端口输出数据(Port output data)(y=0…15)
& p9 H* Z, t( U; i( r4 V- O- H      这些位可通过软件读取和写入。# Z% L% f0 z2 V; x. ^; ?& |
      注: 对于原子置位/复位,通过写入 GPIOx_BSRR 或 GPIOx_BRR 寄存器,可分别置位和/或复位 ODR 位(x=A…F)。/ n+ ^: J! c4 A0 @
% v, f) `8 u2 Z* J; A0 |

$ ^7 F+ r1 Q/ T" m5 B7. 端口置位/复位寄存器(GPIOx_BSRR)$ y! j; A3 Q& `, v/ C( z3 B
  该寄存器也用于控制GPIO的输出高电平或者低电平。
% A8 r, h1 {; t5 z0 {$ }8 n$ ^0 C
! {1 h, U5 g4 G% x3 h/ F& P, s3 R  BSRR寄存器32位有效。. d$ W( p! D1 S' @% V
    对于低16位(0 ~ 15):
7 g+ j8 ?; L3 s      我们往相应的位写1,那么对应的IO口会输出高电平;
( g" [' m/ ^, h; ^6 @9 S2 u      我们往相应的位写0,对IO口没有任何影响。
+ t; K9 J& [" p8 j: V    对于高16位(16 ~ 31)作用刚好相反:* ]4 X* b- T& U$ X
      我们往相应的位写1,那么对应的IO口会输出低电平;
  J" P3 P3 n8 B      我们往相应的位写0,对IO口没有任何影响。
$ d9 G0 O/ A  i6 I& |

8 x" I3 a$ l2 m& K! f  总结:" i, T. `& z) d. c( I
    对于BSRR寄存器,写0时,对I/O口电平无影响。" h, v, T! s0 M, U) }4 M
    如需输出高电平,则将对应的BS位写1;2 R/ u& {& x7 K7 @1 M0 t# B9 {
    如需输出低电平,则将对应的BR位写1。
3 U" ]' X5 O$ F7 G5 J! C! y' W- U
+ n7 E9 U: |' q, U  ODR寄存器和BSRR寄存器的不同之处:6 W- m1 t6 p$ M
    ODR是可读可写权限,而BSRR是只写权限。
" W- ]7 A& v4 W9 h) l! i+ s    ODR寄存器,我们要设置某个IO口电平,我们首先需要读出来ODR寄存器的值,然后对整个ODR寄存器重新赋值来达到设置某个或者某些IO口的目的。
6 Z, [' B3 d$ b- S' N0 S# Y0 T3 i1 Q    BSRR寄存器,我们就不需要先读,而是直接设置即可,这在多任务实时操作系统中作用很大。9 a% b- x/ p( }' ~- Y- u
    BSRR寄存器比ODR寄存器更好的地方,就是BSRR寄存器改变引脚状态的时候,不会被中断打断。而ODR寄存器有被中断打断的风险。* R% ^: M$ G- D+ d  {9 J: T$ d' D' t
& v1 s6 Q* h0 e5 Q9 U& D
2N{EQMKR5V()PI08HU5LZ@5.png TGO8%4)IJCX}_@EWIEAP03O.png
. e+ ?) M4 c* c) P, w0 F( V0 q9 h$ u0 V* y* j3 o; Q
XHF_S1KHV%C~RKFAM8BNVOG.png ~TKVTVFU84`5QBXKV5{_M.png
! {9 Y: c5 i4 N
( U. L1 p& \+ j0 ^* u, X
0 y7 {- A! E" v$ n% {8 K0 L" F" G位 31:16 BRy:端口x复位位y(Port x reset bit y)(y=0…15)
# I9 S( r& R2 b+ J        这些位为只写。读取这些位可返回值 0x0000。
6 M' u# a+ o4 B0 l         0:不会对相应的 ODRx 位执行任何操作  x3 p1 H+ s& `' b6 A# p' T0 L
         1:复位相应的 ODRx 位
# o- M, m2 n3 a        注:  如果同时对 BSx 和 BRx 置位,则 BSx 的优先级更高。
0 J: G7 ]1 y' U' C

! M" W. C9 `* e  @7 e) X( t+ G% m位 15:0  BSy:端口x置位位y(Port x set bit y)(y=0…15)" B. p# n1 l+ a! p9 W7 N
        这些位为只写。读取这些位可返回值 0x0000。
2 J, ^4 u. R5 J% R* Z         0:不会对相应的 ODRx 位执行任何操作
* R& l; J6 r9 k5 Z! K' L' r( E5 }         1:置位相应的 ODRx 位
) ?9 ]! ]& W+ W6 J; {6 y

1 A6 a: z' m& {/ `& j/ |6 R8. 端口配置锁定寄存器(GPIOx_LCKR)
1 G0 i" d+ b' q  P  该寄存器的每个锁定位冻结一个特定的配置寄存器(控制寄存器和复用功能寄存器)。
3 S, W1 P& N$ c! a1 Y9 |4 y0 P* c+ f
G{29G`WZT@YW[]W2BAO%Y79.png QM2EK7`_NVIX)YPG7]Z1CN6.png
/ v: N  o  V* E
9 J4 ]: `' ?# h- k5 Q FNI2}4S{88RY$B8{$DW6N1V.png O~X}`Q3H`J{{]ADMR6P4%Z3.png
' V+ C, a0 f: q# k: A  {& D9 u1 {0 _4 k8 q
' N  o! t# l- g  r5 H: ^
位 31:17 :保留,必须保持复位值。
5 w7 a0 W; @. }* c) ~3 S/ m: }1 |
位 16 LCKK:锁定键(Lock key)4 [. L9 K4 G& c9 [+ N
     可随时读取此位。可使用锁定键写序列对其进行修改。9 Y, [9 a8 \0 f' k7 b# Z
      0:端口配置锁定键未激活
( G/ J) L( ^2 t1 `7 H) ]      1:端口配置锁定键已激活。在下一次 MCU 复位或外设复位之前,GPIOx_LCKR 寄存器始终处于锁定状态。2 k: c  U: C. l* _% Y; H& N
# q/ N( R, F( U' l8 u  J! h
位 15:0  LCKy:端口x锁定位y(Port x lock bit y)(y=0…15)
' Q+ {+ j& i) `: A6 ?  I        这些位都是读/写位,但只能在 LCKK 位等于 “0” 时执行写操作。
- w1 m+ Q" {& _3 V4 \" Y         0:端口配置未锁定
; F. u) r5 r3 H         1:端口配置已锁定
4 [8 F: M# E! Q( M& G
8 F5 S7 \( p$ b" _7 d/ i  x6 s
9. 复用功能寄存器(GPIOx_AFRL、GPIOx_AFRH); D  ^+ i4 A# z! F3 S% w4 _6 |( T  u
  该寄存器分为高位AFRH和低位AFRL,分别控制16位,即分别控制8个I/O口。1 J- e  O0 w, `
) w5 R& ?& g# W9 Q6 N
  复用功能寄存器有2个,都是32位有效的寄存器,分高位(AFRH)和低位(AFRL)。复用器采用16路复用功能输入AF0~AF15,通过GPIOx_AFRL(引脚 0~7)、GPIOx_AFRH(引脚 8~15)寄存器对复用功能输入进行配置,每四位控制1路复用。
- N: J* D5 A, N; M
- s/ B7 Q! X- W* s. m  Z
  I/O口并不能随意复用功能,而是有规定的,可以通过查阅数据手册来获取每个I/O引脚的复用功能。+ d. y: |2 c* ]) z9 g! h; L( o
2 i) F  H8 S" l
~7772{@UWMK~8A30)15MIIL.png " f* e5 a  x7 h( P: [
' U) e1 `9 W# `4 m5 {
位 31:0  AFRy[3:0]:端口x引脚y的复用功能选择(Alternate function selection for port x pin y)(y=0…7)6 s' b6 h! z! H# Q3 }
        这些位通过软件写入,用于配置复用功能 I/O 。% B% }- ~1 q$ y) }( }

/ W- ~& }# r  Z& O# Q5 x        AFSELy 选择:
! g/ |6 M! U' x* b         0000:AF0             1000:AF8* t5 ]: O) ]* k+ h/ G6 d
         0001:AF1             1001:AF9& l& W; z$ X. G$ @* g
         0010:AF2             1010:AF10
1 i$ V/ j$ e$ L  H6 l% e4 ^9 H( D         0011:AF3             1011:AF11
- x$ b6 c+ `; s( {" o; N/ D+ B         0100:AF4             1100:AF12
( N5 i! K- [# r$ a, ?" C* o         0101:AF5             1101:AF138 s) u$ D' G8 X, }
         0110:AF6             1110:AF148 B$ t+ z: {+ v' [0 J
         0111:AF7             1111:AF15: e. H; _9 t6 y
————————————————, Z( I2 H; v# I
版权声明:零号萌新, [6 W7 ^5 w0 b5 s
) [9 r# C% \; {( K7 C

5 F+ t/ M* h. a
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 手机版