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

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

[复制链接]
STMCU小助手 发布时间:2021-11-29 22:20
stm32的引脚有两种用途:GPIO(general purpose io)和AFIO(alternate function io)
0 o) @+ `( Y, @- A- q4 {/ O' q6 C3 t, B0 R& m; ^
对于一些引脚(视芯片而定),这两种用途都没有,如在64脚产品中,OSC_IN/OSC_OUT与作为GPIO端口的PD0/PD1共用一样的引脚,而在100、144引脚产品中,这四个功能各有引脚与之对应,不互相冲突,所以OSC_IN/OSC_OUT既不作GPIO也不作AFIO,当然,这样的引脚不是讨论重点。
% }; U) t5 k) S1 B
+ [* l" \# ~! w) Y1 v( u7 `1、引脚的配置) N& G! |0 T# N

+ A$ v* T, E+ u不论是作GPIO还是做AFIO,都要对引脚进行配置。在固件库函数中,用GPIO_Init()函数对引脚进行配置,并不是说这个函数带了“GPIO”字样就是要当做GPIO来用,而是把它纳入GPIO的范畴来讨论。
6 G; `7 n: T9 y  V  }& |9 X4 p' x9 }/ I. O; T4 @
所谓配置,就是引脚上的片上资源连接方式,如上拉电阻、密特触发等等。理解了配置,也就能明白配置与模式的区别。
! J+ T& J9 ]4 ~; U# ^0 J( s& n! ^& X& B; ?" t) A. \- R
特别得,在下文中将会专门讨论一下输出配置中的推挽与开漏。; g- o/ R- z- @4 b0 h* V
) `4 }& A& B1 \/ h6 @
2、复用功能2 Q3 {# I: b' J
" m/ C! V+ y) S. ^
复用功能有两种:没有重映像、重映像(包括部分重映像、完全重映像),使用引脚用作AFIO功能,同样需要对其进行配置。( N' K& @; r: B) {* t

* \  N& B9 f- q
1341810945_5803.jpg
" X6 L0 L# C/ l4 n0 n4 d
这三句话来自参考手册,但我对第一句和注意有疑问,第三节讲。如果把端口配置成复用输出功能,则引脚和输出寄存器断开,并和片上外设的输出信号连接。输入配置则与GPIO没有区别。2 Y9 Q1 L6 Q$ F1 x
& q9 d$ b8 D, V- s* _
为什么输出模式有专门的复用模式而输入则没有呢。因为输出是由芯片内部电路驱动的,必须选择这个驱动来自哪一个外设,是GPIO还是复用此管脚的其他外设,也就是选择该管脚在内部是与哪个外设相连的,不说明这个就会发生信号的错乱。而输入则不同了,输入信号是由芯片外的信号驱动的,虽然该信号进入芯片内部后可能有不同的去向,但不需要对此进行配置,因为不会发生信号的冲突,最坏的情况就是多驱动了个寄存器而已。事实上,当将引脚作为GPIO输入时,相应的AFIO外设是处在关闭的状态,并不会耗电;当引脚作为AFIO的输入时,可能GPIO是读不进来的,这是我猜的,没有验证,能不能读进来无所谓的,不必纠结于此。
$ K1 P3 k2 P2 `8 {: R# M4 s5 Z* K* p- E+ k2 S+ M* F
1341809146_6021.jpg

: D% M' @- w4 K若选择了复用,则默认是没有重映像的,可以直接使用外设,不需要再软件做设置。
8 {  Q  `  O5 J& _& t, E2 [$ |/ \/ |2 `
但若要重映射,则需要简单设置一下,- p8 a8 v6 W" X$ d& A- L5 W$ [

  m0 }4 R! |4 M: h0 I7 z; I先要配置重映射后对应的管脚,可参看参考手册或数据手册引脚定义章节,开AFIO时钟,使能重映射。例如重映射USART1,全部代码如下:- }0 h( V1 p8 R4 @

0 c1 H3 e9 V+ Y5 D; |: E  RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); 4 W7 w7 g9 J# V+ E# X

. Y: I9 Z; x" O# U3 R  /*对寄存器AFIO_EVCR,AFIO_MAPR和AFIO_EXTICRX进行读写操作前,即重映射和选择外部中断线前,应当首先打开AFIO的时钟*/
* L4 s8 p1 D4 p, _- t; R: a) W+ }, |2 e) A
  1. <p>  /* Configure USART1 Tx (PA.09) as alternate function push-pull */</p><p>+ F$ o# o' X7 q
  2. </p><p>  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;</p><p>9 L! G- A* P, j3 S" O9 |
  3. </p><p>  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;</p><p>
    $ {. T. _3 N7 v! A; I2 ?6 G$ Y6 A
  4. </p><p>  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;</p><p>  Z& B2 R; u9 C4 v' o3 q5 S2 Q( x
  5. </p><p>  GPIO_Init(GPIOB, &GPIO_InitStructure);</p><p>2 o5 n: L- P( r# `/ t4 T, _
  6. </p><p>    </p><p>
    . n4 D) h/ @; e6 E0 b/ z
  7. </p><p>  /* Configure USART1 Rx (PA.10) as input floating */</p><p>/ M2 T3 U; c1 ?$ ]8 f
  8. </p><p>  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;</p><p>+ l9 R  h. u' t5 b: S
  9. </p><p>  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;</p><p>
    4 Z8 ~  ]) M( d- K; I; v
  10. </p><p>  GPIO_Init(GPIOB, &GPIO_InitStructure);</p><p>- Z6 ^2 `% x, ~( b: ?4 e
  11. </p><p>  GPIO_PinRemapConfig(GPIO_Remap_USART1,ENABLE);</p>
复制代码

: |# z( ]: N  L/ V+ g4 A+ k这就完成了IO口的配置和重映射,下边再配置相关的外设(USART1)就可以使用了。" H8 O: a" L  q, N

- C" N2 W9 R0 n% l, B外部中断线也是可以映射的,并且需要开AFIO时钟,不用GPIO_PinRemap函数,用GPIO_EXTILineConfig重映射引脚到中断线。其实与其说是映射,不如说是选择,选择引脚连接到外部中断线。5 J6 }1 }9 O3 ]( M0 U0 z

7 X2 j, [4 M' o$ \% z重映射不是任意的,只能重映射到指定的管脚。
# r/ G4 w4 X. i6 H7 f# ^2 ~7 v0 I5 Y
2 N* w1 P" ?: ~5 W! l. C% H$ J3、关于第二节讲到那个疑问,为甚么不能配置成模拟输入?模拟输入与浮空什么区别?7 N6 b, D/ Z- v5 s! q4 a7 D" u
. u. F" N3 V# T& |1 M
答案是可以配置成模拟输入,官方3.5版固件库例子和alientek例程都是将ADC输入引脚配置成GPIO_Mode_AIN  M2 I. ~& H" x4 Q

2 l; u, ^8 z( q# b' ]8 g那么配置成浮空行么,还能ADC么?# J$ n5 ~. C3 o4 y! D% ^: c9 M
  1. <p><span style="background-color: rgb(255, 255, 255);"> </span>   //例程</p><p>
    # y6 S% m5 c& j) e
  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>
    6 N, Y: o# p# f: E$ F0 Z- |
  3. </p><p>     //修改</p><p>
    : E% E' M$ w2 v
  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>
复制代码

4 j0 b4 j# j$ V) c6 B实验证明,这两种配置都能实现ADC。那么USART的Tx应配置成GPIO_Mode_IN_FLOATING,如果配置成GPIO_Mode_AIN,还能接受数据么?金牛板实验结果是不能,ST不我欺也。总之:- V; g- y) O# {

7 J& [4 f, P  v) a. E可以将引脚配置成模拟输入,使用相应的复用功能;
7 X  P! u/ H! T- F0 [( L* o; P  }  Y$ e9 C, i6 R; J! r) \
浮空与模拟这两种配置是不同的。  F  X3 D* s; z. J, r7 y4 e

! [4 _. P: _! Q, t1 D关于第二节里那个“注意“,我也不知道是什么意思。我猜测是这样的:打开某外设,这个外设将某引脚当做输入,我们偏偏把这个引脚配置为GPIO输出,这样可以操作GPIO来”欺骗“这个外设,这种用法应该是很微妙的。+ p2 F5 c5 J( t) G7 c8 o  O8 f
5 I! O5 v6 N/ {
4、推挽与开漏( ^2 H$ a5 b' c5 V3 a( p; K- a7 W

# Z0 s# a' v8 G9 m3 [2 Y" y- _不仅仅stm32有这种配置,实际上,这两种已经广泛应用在很多场合。  d9 R% M: ~# ?& q
! L0 d: z5 c/ c3 S8 B5 Z6 @
推挽,又叫做推拉,是个很形象的名字,一般是指两个三极管(MOS管)分别受两互补信号(或者一个信号,但是用互补对管)的控制,总是在一个三极管导通的时候另一个截止,这样的电路被称为推挽式(互补式):. X5 _8 O- E% U2 D9 V! \0 T

/ {0 D7 F+ f- W! y6 L
1346657973_9578.png
- M, M, L, ~/ X4 H
这种电路在放大中通常被用作输出级,在STM32中,推挽配置就是这种,如图:
$ X/ }% T1 h' Q( V7 y! p( S* m
5 Y3 B3 u0 r! b
1346657791_8272.jpg
0 B' a- @$ X# K7 p
在相应位置1时,P-MOS导,通N-MOS截止,输出电压为VDD;在相应位置0时,N-MOS导通,P-MOS截止,输出电压为VSS,这就是所谓的推挽。是比较简单的。3 Z) v; ~1 H6 A) z$ ]9 {7 a
1 x. n6 G  j. l/ _- h% a
而所谓的开漏(对三极管而言是开集,一样的原理),则要巧妙一些。所谓开漏电路概念中提到的“漏”就是指MOS FET的漏极。同理,开集电路中的“集”就是指三极管的集电极。开漏电路就是指以MOS FET的漏极为输出的电路。一般的用法是会在漏极外部的电路添加上拉电阻。完整的开漏电路应该由开漏器件和开漏上拉电阻组成。; n# a$ N( G7 U: S5 I$ o$ N, o2 W
( A  _: i1 e5 @4 S( Y
对于stm32,开漏就是失能了P-MOS,这样,当相应位置1时,引脚实际上是处在了浮空的状态,而通过外接的上拉电阻,将其拉高。
0 }8 Q6 \  @1 c# V$ s1 f8 J3 H! V( n- z+ E" A( t# i
这么做有如下的好处:+ g& I3 |7 x' X& ^
: R. E$ e  F+ f( I& f% r: c) ^
1、可以将多个开漏输出的引脚,连接到一条线上。形成“与逻辑”关系。当多个引脚任意一个变低后,开漏线上的逻辑就为0了。这也是I2C,SMBus等总线判断总线占用状态的原理。
& S# J$ S- `- [0 e1 e3 S2、 可以利用改变上拉电源的电压,改变传输电平。这样我们就可以用低电平逻辑控制输出高电平逻辑了。想想当初认为stm32输出3.3v电压带不动IRF540,就直接断定要重新选型,是错误的想法,只要将推挽输出变为开漏,再加上上拉到5v的电阻,就能解决这个问题。
( d) K' Y8 K3 W7 K% [( M$ }1 r5 t, J$ F% h" c, P% `( N
顺便一提,上拉电阻的阻值决定了逻辑电平转换的沿的速度。阻值越大,速度越低功耗越小。反之亦然。
6 O8 B/ A* b! c& C2 I3 p( t. X" g. X$ Q

+ s. R+ n) G! ]6 M! u8 S, J/ O+ F
收藏 评论0 发布时间:2021-11-29 22:20

举报

0个回答

所属标签

相似技术帖

官网相关资源

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