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

【经验分享】stm32f1的IO,推挽与开漏

[复制链接]
STMCU小助手 发布时间:2021-11-29 22:20
stm32的引脚有两种用途:GPIO(general purpose io)和AFIO(alternate function io)% X$ O, O6 V' }( J9 U

5 [! Z! I* n4 t& d' E6 e1 s: ~' c对于一些引脚(视芯片而定),这两种用途都没有,如在64脚产品中,OSC_IN/OSC_OUT与作为GPIO端口的PD0/PD1共用一样的引脚,而在100、144引脚产品中,这四个功能各有引脚与之对应,不互相冲突,所以OSC_IN/OSC_OUT既不作GPIO也不作AFIO,当然,这样的引脚不是讨论重点。
; c$ l, F8 H0 Z4 t0 j; J+ ?) D2 R- @' O7 }6 P0 b1 C
1、引脚的配置! ~+ A. E% L+ I5 s
1 }- S2 n) e* n  v* ~% r9 @$ _" w1 `
不论是作GPIO还是做AFIO,都要对引脚进行配置。在固件库函数中,用GPIO_Init()函数对引脚进行配置,并不是说这个函数带了“GPIO”字样就是要当做GPIO来用,而是把它纳入GPIO的范畴来讨论。* D# |9 j# w; Q

# _6 F2 o8 L3 z5 [% H所谓配置,就是引脚上的片上资源连接方式,如上拉电阻、密特触发等等。理解了配置,也就能明白配置与模式的区别。
1 r5 w2 x- f$ s2 e6 \& D& o" k$ r' B6 p$ W  O: J$ p
特别得,在下文中将会专门讨论一下输出配置中的推挽与开漏。
8 _% [, x1 m7 L# P8 i; j0 h- a3 ]) @- k) G$ K4 W
2、复用功能
$ F" |, E# d$ q7 D, g0 i6 S0 F( D. h
复用功能有两种:没有重映像、重映像(包括部分重映像、完全重映像),使用引脚用作AFIO功能,同样需要对其进行配置。; d( e1 g0 m' I' t. \7 E

. U8 m  ^9 g8 p
1341810945_5803.jpg

( n% c0 |( ^9 m+ H这三句话来自参考手册,但我对第一句和注意有疑问,第三节讲。如果把端口配置成复用输出功能,则引脚和输出寄存器断开,并和片上外设的输出信号连接。输入配置则与GPIO没有区别。
( i) d+ u; H; a9 L
: e' Z2 z7 j9 D为什么输出模式有专门的复用模式而输入则没有呢。因为输出是由芯片内部电路驱动的,必须选择这个驱动来自哪一个外设,是GPIO还是复用此管脚的其他外设,也就是选择该管脚在内部是与哪个外设相连的,不说明这个就会发生信号的错乱。而输入则不同了,输入信号是由芯片外的信号驱动的,虽然该信号进入芯片内部后可能有不同的去向,但不需要对此进行配置,因为不会发生信号的冲突,最坏的情况就是多驱动了个寄存器而已。事实上,当将引脚作为GPIO输入时,相应的AFIO外设是处在关闭的状态,并不会耗电;当引脚作为AFIO的输入时,可能GPIO是读不进来的,这是我猜的,没有验证,能不能读进来无所谓的,不必纠结于此。" S2 E# p# A$ H* W  ?1 h
8 y9 g8 B' z( N  S' e4 w& ]9 ^
1341809146_6021.jpg

  e2 W/ Z# D& A% H, `* m$ O9 ~7 Z$ T若选择了复用,则默认是没有重映像的,可以直接使用外设,不需要再软件做设置。
% z: ?2 Y/ G! b- I  F3 f4 ]! L2 @( ^/ U
但若要重映射,则需要简单设置一下,
4 z" c5 ^7 V7 R' W  Q, X* j' J$ V9 ^
4 z: |" I- H6 c  a/ d' [  x先要配置重映射后对应的管脚,可参看参考手册或数据手册引脚定义章节,开AFIO时钟,使能重映射。例如重映射USART1,全部代码如下:
5 o. A( T: C5 u1 i
+ L7 P2 A, l! O' k: q) o  RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); ! w: V' m) e( Q1 D" ]# {

* T0 n  |; z  F( B  /*对寄存器AFIO_EVCR,AFIO_MAPR和AFIO_EXTICRX进行读写操作前,即重映射和选择外部中断线前,应当首先打开AFIO的时钟*/7 ~8 t. ]; I" ~8 Q( G! ^, S& Y5 q# Y

0 n- a* e# `, U1 ?2 ~- o  B
  1. <p>  /* Configure USART1 Tx (PA.09) as alternate function push-pull */</p><p>- X7 e$ {- |5 A" `
  2. </p><p>  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;</p><p>
    . r5 F: S% Y2 M+ s3 d4 h* P- @
  3. </p><p>  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;</p><p>% C: u) W' o  j& s
  4. </p><p>  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;</p><p>- @, z% Q6 {( [" S; @- w
  5. </p><p>  GPIO_Init(GPIOB, &GPIO_InitStructure);</p><p>" d* y. H& X1 s% ^9 l
  6. </p><p>    </p><p>6 ]- e4 z% C; N+ m# J, k
  7. </p><p>  /* Configure USART1 Rx (PA.10) as input floating */</p><p>
    $ D! k( z/ q  X' s6 X
  8. </p><p>  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;</p><p>
    ! E  Q7 V5 K& x
  9. </p><p>  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;</p><p>6 w  a' F* `$ l' T! x
  10. </p><p>  GPIO_Init(GPIOB, &GPIO_InitStructure);</p><p>
    - e  _& k7 n# b2 }* j! i2 E
  11. </p><p>  GPIO_PinRemapConfig(GPIO_Remap_USART1,ENABLE);</p>
复制代码

0 z4 A! P  r/ w* y这就完成了IO口的配置和重映射,下边再配置相关的外设(USART1)就可以使用了。
' J2 ~4 V4 D$ _' y8 E
0 J" ^# V4 g( N5 I! U& U; N外部中断线也是可以映射的,并且需要开AFIO时钟,不用GPIO_PinRemap函数,用GPIO_EXTILineConfig重映射引脚到中断线。其实与其说是映射,不如说是选择,选择引脚连接到外部中断线。
1 [4 Z+ f5 A( M, t- G# \' D' s* a
重映射不是任意的,只能重映射到指定的管脚。
+ a, e1 |6 |+ p' P$ h5 V$ N4 z. u* B* f* D) c; K0 o5 v- b
3、关于第二节讲到那个疑问,为甚么不能配置成模拟输入?模拟输入与浮空什么区别?$ a0 E/ _: |/ J& W* c# }

; K, _* }) A; b8 w- Y- C答案是可以配置成模拟输入,官方3.5版固件库例子和alientek例程都是将ADC输入引脚配置成GPIO_Mode_AIN
: W) f3 r# k! _, B2 X
' f( i  j; }. }; {  s3 e; U那么配置成浮空行么,还能ADC么?
$ k" {4 N( O" I' g; `0 o
  1. <p><span style="background-color: rgb(255, 255, 255);"> </span>   //例程</p><p>
    : R4 M! V5 D7 p3 r6 v' _0 W" X
  2. </p><p>    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;</p><p>    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;</p><p>    GPIO_Init(GPIOC, &GPIO_InitStructure);</p><p>
    1 `! \7 D6 B1 j  U( a7 r: o5 K
  3. </p><p>     //修改</p><p>7 H) x8 u7 u" _. I! ]9 `' T
  4. </p><p>    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;</p><p>    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;</p><p>    GPIO_Init(GPIOC, &GPIO_InitStructure);</p><p></p>
复制代码
; C# X! ]0 b9 M! Z# T2 O
实验证明,这两种配置都能实现ADC。那么USART的Tx应配置成GPIO_Mode_IN_FLOATING,如果配置成GPIO_Mode_AIN,还能接受数据么?金牛板实验结果是不能,ST不我欺也。总之:
- @; L0 b6 y; _/ b8 c  ~! m3 ?; D4 M" a+ W- Q" k
可以将引脚配置成模拟输入,使用相应的复用功能;
" z6 c2 g! q5 O' r3 F% G8 y) @7 y4 b, E0 Z7 c5 T9 c$ E# v2 k
浮空与模拟这两种配置是不同的。
3 w5 D& f$ Q; b0 I3 Q& V, @' t2 N( s$ @1 N6 z1 e& l
关于第二节里那个“注意“,我也不知道是什么意思。我猜测是这样的:打开某外设,这个外设将某引脚当做输入,我们偏偏把这个引脚配置为GPIO输出,这样可以操作GPIO来”欺骗“这个外设,这种用法应该是很微妙的。! q+ _! k# l5 V: Q2 j2 U

3 ~1 Y$ |! Z1 M# j: m. @4、推挽与开漏( Q6 W) C+ M3 M) `) ^  l' ]' [
$ ^  n/ h" a) b* z1 j- p2 s
不仅仅stm32有这种配置,实际上,这两种已经广泛应用在很多场合。
$ n7 g, l  Y/ j: B$ _8 p
4 c% K& n( [, ]7 q& u6 ^1 G推挽,又叫做推拉,是个很形象的名字,一般是指两个三极管(MOS管)分别受两互补信号(或者一个信号,但是用互补对管)的控制,总是在一个三极管导通的时候另一个截止,这样的电路被称为推挽式(互补式):
/ x) e7 p; E8 G0 z' y
. O7 [. C  {& R4 g: W3 |
1346657973_9578.png

7 h* R1 c! B: ?6 |/ M这种电路在放大中通常被用作输出级,在STM32中,推挽配置就是这种,如图:
- R. r6 }/ k2 z5 ]1 \, n+ Z% C
5 i  c- [( _# ?$ j. ^5 A
1346657791_8272.jpg
3 |( x' S% I' ?1 s3 j; f$ i6 F1 W
在相应位置1时,P-MOS导,通N-MOS截止,输出电压为VDD;在相应位置0时,N-MOS导通,P-MOS截止,输出电压为VSS,这就是所谓的推挽。是比较简单的。
& i  E* [6 R% ~( c' w* A4 I, ~' I" ~, g1 f3 G; {5 X$ W  E. Z
而所谓的开漏(对三极管而言是开集,一样的原理),则要巧妙一些。所谓开漏电路概念中提到的“漏”就是指MOS FET的漏极。同理,开集电路中的“集”就是指三极管的集电极。开漏电路就是指以MOS FET的漏极为输出的电路。一般的用法是会在漏极外部的电路添加上拉电阻。完整的开漏电路应该由开漏器件和开漏上拉电阻组成。2 M$ o. B* W3 }

- X" y; y  c! x% z$ Y2 e对于stm32,开漏就是失能了P-MOS,这样,当相应位置1时,引脚实际上是处在了浮空的状态,而通过外接的上拉电阻,将其拉高。
  }  y  r: V% U- R. R  ]
, R4 T% H$ N+ v这么做有如下的好处:
  w1 R5 D" B* \" I1 r; T6 w1 t: R5 m# l; \3 R8 t8 w4 k
1、可以将多个开漏输出的引脚,连接到一条线上。形成“与逻辑”关系。当多个引脚任意一个变低后,开漏线上的逻辑就为0了。这也是I2C,SMBus等总线判断总线占用状态的原理。2 c8 O8 Z( D1 u: a& L) V
2、 可以利用改变上拉电源的电压,改变传输电平。这样我们就可以用低电平逻辑控制输出高电平逻辑了。想想当初认为stm32输出3.3v电压带不动IRF540,就直接断定要重新选型,是错误的想法,只要将推挽输出变为开漏,再加上上拉到5v的电阻,就能解决这个问题。
6 q$ p% m. C0 j. {( `
5 Y/ P2 I; X9 n+ A" A6 j1 e/ ]1 T) E顺便一提,上拉电阻的阻值决定了逻辑电平转换的沿的速度。阻值越大,速度越低功耗越小。反之亦然。
+ B; e9 u* L3 P8 T, ~/ P* _: l6 G- G  i$ x

6 }* ~, t( s& A* B. X5 M; C
收藏 评论0 发布时间:2021-11-29 22:20

举报

0个回答

所属标签

相似技术帖

官网相关资源

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