最近学习了stm32的GPIO的相关操作,发现其GPIO的配置模式有好几种,包括:
8 x% N: ?7 E) `2 ~$ t1. 模拟输入;
4 \, o3 W9 g: N% B* x, y2. 浮空输入;( e: U* B" y7 S1 O0 H
3. 上拉输入;% \& b/ Q; i+ A9 W- T
4. 下拉输入;7 W& k" b" \- j6 _6 n) B$ }
5. 开漏输出;
; d$ ~0 U, X- d( i A$ u0 }6. 推挽输出;
: |+ E6 Q* K8 m( i8 \4 `7. 复用开漏输出;" C* D4 T5 g7 q( g* W6 x( X
8. 复用推挽输出
9 q- l6 @& f5 I
& X8 n" f/ m* G' Y9 F4 g0 f如图是GPIO的结构原理图:
: ]+ I& E- E# L% v% M2 [6 s1 b9 A, N % {$ L" p/ g: q2 z3 J1 t
1 M9 b1 _% k. s' K! Z2 g5 q0 Z
初学感觉起来,还是挺复杂的,我在这里想简单的说说自己的理解,希望大家多多交流。
# q+ G# H* o1 ?( |+ o2 [: @! N( h+ X! Y$ V
1.模拟输入
) V2 S- P4 K' N9 n
1 a) W2 |& V; ~从上图我们可以看到,我觉得模拟输入最重要的一点就是,他不经过输入数据寄存器,所以我们无法通过读取输入数据寄存器来获取模拟输入的值,我觉得这一点也是很好理解的,因为输入数据寄存器中存放的不是0就是1,而模拟输入信号不符合这一要求,所以自然不能放进输入数据寄存器。该输入模式,使我们可以获得外部的模拟信号。/ Z7 | c* h7 f/ P) q7 X
8 ^" V- O G: h2 @/ l2.浮空输入
4 [2 b* ~: X/ k J' u/ j
/ M/ c5 p. x. r' [1 o该输入状态,我的理解是,它的输入完全由外部决定,我觉得在数据通信中应该可以使用该模式。应为在数据通信中,我们直观的理解就是线路两端连接着发送端和接收断,他们都需要准确获取对方的信号电平,不需要外界的干预。所以我觉得这种情况适合浮空输入。比如我们熟悉的I2C通信。4 v* H. u @4 i& M+ p/ `
; K d: |* d( K1 F# s7 c3上拉输入
$ @6 U3 V, J, i
* \3 l8 \( G+ S! A上拉输入就是在输入电路上使用了上拉电阻。这种模式的好处在于我们什么都不输入时,由于内部上拉电阻的原因,我们的处理器会觉得我们输入了高电平,这就避免了不确定的输入。这在要求输入电平只要高低两种电平的情况下是很有用的。% o6 C5 Z! b) N2 A: ~+ m/ T
5 f+ p1 u% |, [- W, S# Z4下拉输入5 [& s/ _* S: |# P+ O1 `
和上拉输入类似,不过下拉输入时,在外部没有输入时,我们的处理器会觉得我们输入了低电平。3 t U: F+ B G" w8 m/ F
* a& S+ |0 S, ~ |
5开漏输出* E- A* s% W2 ~8 b
& ^, ~. \9 G" m6 A7 T; x9 l* h6 H& ]开漏输出,输出端相当于三极管的集电极,所以适合与做电流驱动的应用。要得到高电平,需要上拉电阻才可以。& U- H7 R& F; B, S; W# o+ Q! x
/ E. ~# w+ S" B
6推挽输出
) y# |) |+ U" s( E E2 o, q8 }/ I( N; \- }- X
推挽输出使用了推挽电路,结合推挽电路的特性,它是由两个MOSFET组成,一个导通的同时,另外一个截至,两个MOSFET分别连接高低电平,所以哪一个导通就会输出相应的电平。推挽电路速度快,输出能力强,直接输出高电平或者低电平。
/ }; D# m' F7 x
1 z) |/ _! U+ @7复用开漏和复用推挽9 }- ~/ G* \4 ~/ G p4 P
* W i6 S: L! f* n5 Y9 Y我们知道这只是对GPIO的复用而已。使普通的GPIO具有了别的功能。4 w, b$ g) Q% M) K8 S6 H- s; B
o: b0 v" V- U2 V) W6 `; r) V |