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

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

[复制链接]
STMCU小助手 发布时间:2021-11-29 22:20
stm32的引脚有两种用途:GPIO(general purpose io)和AFIO(alternate function io)
: A6 a& V7 M2 S  l0 X; l
& L# F- O! w" d5 t3 _$ N对于一些引脚(视芯片而定),这两种用途都没有,如在64脚产品中,OSC_IN/OSC_OUT与作为GPIO端口的PD0/PD1共用一样的引脚,而在100、144引脚产品中,这四个功能各有引脚与之对应,不互相冲突,所以OSC_IN/OSC_OUT既不作GPIO也不作AFIO,当然,这样的引脚不是讨论重点。
4 E/ `: z, |0 k
2 e) X" C. Z( \1 V. y1 f9 s% h1、引脚的配置
# o% R9 @' H5 I. O4 N9 J* g2 @( S! F* ~) h3 o! |  A
不论是作GPIO还是做AFIO,都要对引脚进行配置。在固件库函数中,用GPIO_Init()函数对引脚进行配置,并不是说这个函数带了“GPIO”字样就是要当做GPIO来用,而是把它纳入GPIO的范畴来讨论。3 |! @# }4 q1 z) y! M0 r
8 h  W+ b. y  @0 k% E
所谓配置,就是引脚上的片上资源连接方式,如上拉电阻、密特触发等等。理解了配置,也就能明白配置与模式的区别。& q( {$ J0 T* X) ^
, N9 M' M7 A& Z$ _9 B/ `1 {7 T; s9 Q
特别得,在下文中将会专门讨论一下输出配置中的推挽与开漏。/ p/ J# H+ t! }0 e% Q

& N6 v' y9 u; A/ y2、复用功能  E9 b: v, j( h/ @; H; u

* b7 ~8 l7 n6 L. m( t复用功能有两种:没有重映像、重映像(包括部分重映像、完全重映像),使用引脚用作AFIO功能,同样需要对其进行配置。) m! t& J( |) M5 V9 j6 \" `
" s. t- R( D9 ^' ~8 s
1341810945_5803.jpg

- b' X2 D. P5 @% N5 v8 w这三句话来自参考手册,但我对第一句和注意有疑问,第三节讲。如果把端口配置成复用输出功能,则引脚和输出寄存器断开,并和片上外设的输出信号连接。输入配置则与GPIO没有区别。& G( Y2 U6 ~* r" w2 S
. T  L& t# ^8 q9 z2 K, x
为什么输出模式有专门的复用模式而输入则没有呢。因为输出是由芯片内部电路驱动的,必须选择这个驱动来自哪一个外设,是GPIO还是复用此管脚的其他外设,也就是选择该管脚在内部是与哪个外设相连的,不说明这个就会发生信号的错乱。而输入则不同了,输入信号是由芯片外的信号驱动的,虽然该信号进入芯片内部后可能有不同的去向,但不需要对此进行配置,因为不会发生信号的冲突,最坏的情况就是多驱动了个寄存器而已。事实上,当将引脚作为GPIO输入时,相应的AFIO外设是处在关闭的状态,并不会耗电;当引脚作为AFIO的输入时,可能GPIO是读不进来的,这是我猜的,没有验证,能不能读进来无所谓的,不必纠结于此。8 I0 |8 ~, w: l% o

5 p  x- B/ e: j' E
1341809146_6021.jpg
, _- [3 b- W; U/ P* k
若选择了复用,则默认是没有重映像的,可以直接使用外设,不需要再软件做设置。2 Y& ]0 ^" u8 o; c! c9 Q, [# _. \

9 ~$ q1 I) R: g# j! F9 U但若要重映射,则需要简单设置一下,0 \1 a; K- I. Q6 X$ ~) M" p
: Q% v! a, [: L8 s% D: ~) M
先要配置重映射后对应的管脚,可参看参考手册或数据手册引脚定义章节,开AFIO时钟,使能重映射。例如重映射USART1,全部代码如下:  s- t& g. c& L

$ L, y) N# B) E% y  RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); # h. H8 P5 j  W8 Y2 C
) L0 E8 K# H0 c  e/ b. ?
  /*对寄存器AFIO_EVCR,AFIO_MAPR和AFIO_EXTICRX进行读写操作前,即重映射和选择外部中断线前,应当首先打开AFIO的时钟*/
) o: [+ k4 j+ J+ q. L0 M( P2 \
) _  h9 ~8 i0 d9 w# E
  1. <p>  /* Configure USART1 Tx (PA.09) as alternate function push-pull */</p><p>
    . Z. P. y; D! n3 h! J/ l: M
  2. </p><p>  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;</p><p>  ^' s# t+ N, Y- S+ X& D6 E
  3. </p><p>  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;</p><p>( t* _0 Q: [0 N4 O- F5 ~  h8 g6 M
  4. </p><p>  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;</p><p>
    8 Y9 k9 [7 ], I  `4 Y" i
  5. </p><p>  GPIO_Init(GPIOB, &GPIO_InitStructure);</p><p>
    * S( S6 }+ |! c6 s+ d4 x
  6. </p><p>    </p><p>
    6 q# J( F' _6 a( J, m
  7. </p><p>  /* Configure USART1 Rx (PA.10) as input floating */</p><p>
    2 F. j. R! J/ u6 i; w
  8. </p><p>  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;</p><p>/ q4 R# w/ G5 A. G( O
  9. </p><p>  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;</p><p>. p2 }1 D, u6 Q7 d# R
  10. </p><p>  GPIO_Init(GPIOB, &GPIO_InitStructure);</p><p>( }8 G. S1 T; c* ^$ |0 _" w
  11. </p><p>  GPIO_PinRemapConfig(GPIO_Remap_USART1,ENABLE);</p>
复制代码

/ V1 i5 l; s. y, H* c: o这就完成了IO口的配置和重映射,下边再配置相关的外设(USART1)就可以使用了。& g0 z9 g0 o) M; s4 S% c2 s5 X
" W7 A5 H- z: E5 w2 T
外部中断线也是可以映射的,并且需要开AFIO时钟,不用GPIO_PinRemap函数,用GPIO_EXTILineConfig重映射引脚到中断线。其实与其说是映射,不如说是选择,选择引脚连接到外部中断线。
6 |/ l+ w. p. ?) {* v9 |$ }+ x2 r# q0 }4 A0 ]
重映射不是任意的,只能重映射到指定的管脚。
' ^/ v: x# g9 ~% \7 Y$ L5 w
5 B8 z: M2 _. r3、关于第二节讲到那个疑问,为甚么不能配置成模拟输入?模拟输入与浮空什么区别?# j" w9 o. {' J4 @9 {7 Q

( j$ o( W3 g+ `; z! X答案是可以配置成模拟输入,官方3.5版固件库例子和alientek例程都是将ADC输入引脚配置成GPIO_Mode_AIN
0 A2 q; k: d+ J( i' a& [' C, q4 j* P3 W3 Y, J  L# A
那么配置成浮空行么,还能ADC么?% s2 N/ k5 b  o, Y$ {. {
  1. <p><span style="background-color: rgb(255, 255, 255);"> </span>   //例程</p><p>
      D2 `6 A9 X+ }- Y$ i
  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 R* k6 t6 e3 ^. |, e8 q5 {
  3. </p><p>     //修改</p><p>& b  t; n1 K2 L& x# {) F
  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>
复制代码
! S7 g0 i  l$ N3 ~# ^& H% ?) H
实验证明,这两种配置都能实现ADC。那么USART的Tx应配置成GPIO_Mode_IN_FLOATING,如果配置成GPIO_Mode_AIN,还能接受数据么?金牛板实验结果是不能,ST不我欺也。总之:
7 C# `9 G* `. }0 D9 `: D. |+ M$ Q$ p4 y' [( p' b. ?
可以将引脚配置成模拟输入,使用相应的复用功能;/ d$ N7 c% M- k! o* S9 R. g1 w
- g( n: t, d: p3 b8 B6 P' K
浮空与模拟这两种配置是不同的。6 D8 f" Z) {) x% Z

/ C: X- f1 L; i3 D- k4 |$ n关于第二节里那个“注意“,我也不知道是什么意思。我猜测是这样的:打开某外设,这个外设将某引脚当做输入,我们偏偏把这个引脚配置为GPIO输出,这样可以操作GPIO来”欺骗“这个外设,这种用法应该是很微妙的。8 q. E) K. M3 l: t6 F

- ^# ^/ B* N5 Y4、推挽与开漏
1 |! F/ Z8 o* {6 \' L3 A( l7 A+ f  K1 }5 z- N' Z' b
不仅仅stm32有这种配置,实际上,这两种已经广泛应用在很多场合。( q! [. i; T# A  c  ?; M! g
2 o% k; |0 s, c% r  {" X- x9 p
推挽,又叫做推拉,是个很形象的名字,一般是指两个三极管(MOS管)分别受两互补信号(或者一个信号,但是用互补对管)的控制,总是在一个三极管导通的时候另一个截止,这样的电路被称为推挽式(互补式):
* w2 c5 t0 h& q7 I8 w) U' J
' s% K! k' X) a0 G; a' M/ R
1346657973_9578.png

9 f8 r" v. e* ^' B3 M3 Q' `6 @% Y4 d! B这种电路在放大中通常被用作输出级,在STM32中,推挽配置就是这种,如图:' @( l2 |; G# L) K! `

6 ~' c, v% v. \) b
1346657791_8272.jpg
3 i8 i* L( G) @" P% P) R. g4 G
在相应位置1时,P-MOS导,通N-MOS截止,输出电压为VDD;在相应位置0时,N-MOS导通,P-MOS截止,输出电压为VSS,这就是所谓的推挽。是比较简单的。0 c' x" {) I& M

; S8 X9 V2 r1 A而所谓的开漏(对三极管而言是开集,一样的原理),则要巧妙一些。所谓开漏电路概念中提到的“漏”就是指MOS FET的漏极。同理,开集电路中的“集”就是指三极管的集电极。开漏电路就是指以MOS FET的漏极为输出的电路。一般的用法是会在漏极外部的电路添加上拉电阻。完整的开漏电路应该由开漏器件和开漏上拉电阻组成。3 G* t8 X0 s* b0 f7 a: D5 T, o) Z

' Q4 D7 M- n: m4 L5 n2 x对于stm32,开漏就是失能了P-MOS,这样,当相应位置1时,引脚实际上是处在了浮空的状态,而通过外接的上拉电阻,将其拉高。
0 R% p0 N% h( ^" Q
; h0 i& _5 c6 w* ]8 M2 ?. z* b这么做有如下的好处:1 u' g( L. Z6 W
8 t2 F3 |0 }( ], [; P
1、可以将多个开漏输出的引脚,连接到一条线上。形成“与逻辑”关系。当多个引脚任意一个变低后,开漏线上的逻辑就为0了。这也是I2C,SMBus等总线判断总线占用状态的原理。
8 B5 ~" v: C' D- w, ?2、 可以利用改变上拉电源的电压,改变传输电平。这样我们就可以用低电平逻辑控制输出高电平逻辑了。想想当初认为stm32输出3.3v电压带不动IRF540,就直接断定要重新选型,是错误的想法,只要将推挽输出变为开漏,再加上上拉到5v的电阻,就能解决这个问题。
: @& `: y" x) y. F. y+ I1 W6 W) i9 P. l5 c8 K
顺便一提,上拉电阻的阻值决定了逻辑电平转换的沿的速度。阻值越大,速度越低功耗越小。反之亦然。
" u# G4 [) h& }4 `7 c
( o4 F1 {/ Y8 l, p5 `4 X1 g) r* P8 K0 @
收藏 评论0 发布时间:2021-11-29 22:20

举报

0个回答

所属标签

相似分享

官网相关资源

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