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

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

[复制链接]
STMCU小助手 发布时间:2021-11-29 22:20
stm32的引脚有两种用途:GPIO(general purpose io)和AFIO(alternate function io)
. P0 r8 N, y& D6 ^5 V) c+ b2 c, m- L2 v* U/ d/ _; W. g+ i
对于一些引脚(视芯片而定),这两种用途都没有,如在64脚产品中,OSC_IN/OSC_OUT与作为GPIO端口的PD0/PD1共用一样的引脚,而在100、144引脚产品中,这四个功能各有引脚与之对应,不互相冲突,所以OSC_IN/OSC_OUT既不作GPIO也不作AFIO,当然,这样的引脚不是讨论重点。
- V+ n9 h" g1 w: C. K3 m4 Q$ R/ w8 F% K+ y, h
1、引脚的配置9 m8 N8 d8 q1 R) ?2 `: s! C

4 R; R* S0 B; ?- H' y# m7 c6 C不论是作GPIO还是做AFIO,都要对引脚进行配置。在固件库函数中,用GPIO_Init()函数对引脚进行配置,并不是说这个函数带了“GPIO”字样就是要当做GPIO来用,而是把它纳入GPIO的范畴来讨论。9 P; I1 c: V' q8 F
" q+ ^( K0 b% X7 u0 i/ O
所谓配置,就是引脚上的片上资源连接方式,如上拉电阻、密特触发等等。理解了配置,也就能明白配置与模式的区别。
3 C% {$ C3 T8 g4 a2 k0 W" ]$ g4 T# L/ w
特别得,在下文中将会专门讨论一下输出配置中的推挽与开漏。
/ F# l6 }6 P" }4 o" x' i' x# ^5 j: v$ g2 h% P' O
2、复用功能
: o5 |5 \6 Y$ e, B; h  Q6 M
1 E6 w+ G( ~6 l, t: k, f复用功能有两种:没有重映像、重映像(包括部分重映像、完全重映像),使用引脚用作AFIO功能,同样需要对其进行配置。2 p' K; `% L: n7 {! o, D

" k/ x0 p/ W# m* r, S
1341810945_5803.jpg
/ J7 T; r6 V( d. {% H
这三句话来自参考手册,但我对第一句和注意有疑问,第三节讲。如果把端口配置成复用输出功能,则引脚和输出寄存器断开,并和片上外设的输出信号连接。输入配置则与GPIO没有区别。
7 }5 I7 n/ S$ L3 S0 t% D, P& [% O; ?. W6 ~* l5 M3 N. x, s& C
为什么输出模式有专门的复用模式而输入则没有呢。因为输出是由芯片内部电路驱动的,必须选择这个驱动来自哪一个外设,是GPIO还是复用此管脚的其他外设,也就是选择该管脚在内部是与哪个外设相连的,不说明这个就会发生信号的错乱。而输入则不同了,输入信号是由芯片外的信号驱动的,虽然该信号进入芯片内部后可能有不同的去向,但不需要对此进行配置,因为不会发生信号的冲突,最坏的情况就是多驱动了个寄存器而已。事实上,当将引脚作为GPIO输入时,相应的AFIO外设是处在关闭的状态,并不会耗电;当引脚作为AFIO的输入时,可能GPIO是读不进来的,这是我猜的,没有验证,能不能读进来无所谓的,不必纠结于此。
. n- s$ Z; Y  K" X8 v8 p; r$ [5 H
9 M* V9 F2 u( ?7 c& s2 D
1341809146_6021.jpg
8 r; x/ I4 C' Y) F' ~. k: a% P
若选择了复用,则默认是没有重映像的,可以直接使用外设,不需要再软件做设置。
+ [/ j2 ]. s  A6 S8 W; \8 @2 K$ i9 s% H+ t6 t
但若要重映射,则需要简单设置一下,: r0 C$ A) J7 ^5 O$ Z
# }+ T; H0 D5 W. a/ Y/ w) `
先要配置重映射后对应的管脚,可参看参考手册或数据手册引脚定义章节,开AFIO时钟,使能重映射。例如重映射USART1,全部代码如下:
" S, P% q, [0 I- G$ e) R  s
, Y& o3 `6 C6 i7 B  RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); ! H/ T. {# ~& c: o" x

: m, B6 F$ B& D9 `; r" \! F$ }5 v  /*对寄存器AFIO_EVCR,AFIO_MAPR和AFIO_EXTICRX进行读写操作前,即重映射和选择外部中断线前,应当首先打开AFIO的时钟*/" N6 _1 z: b# l3 F, Z- E: l

, [& h$ \- B1 t! C6 _
  1. <p>  /* Configure USART1 Tx (PA.09) as alternate function push-pull */</p><p>% ]0 w; Z/ @. Q( G2 R$ d
  2. </p><p>  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;</p><p>
    : o3 W; N& p- J1 k5 P! u
  3. </p><p>  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;</p><p>
    % P6 S  i- J% o, E& [/ h9 g
  4. </p><p>  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;</p><p>
    . F5 Y$ t% q" k
  5. </p><p>  GPIO_Init(GPIOB, &GPIO_InitStructure);</p><p>4 W, Q4 h* k+ a- u1 ~
  6. </p><p>    </p><p>
    ( f/ W+ e' N0 z% d
  7. </p><p>  /* Configure USART1 Rx (PA.10) as input floating */</p><p>
      I3 [+ \! r4 K; R0 q
  8. </p><p>  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;</p><p>, F0 s, R9 z6 ^4 U4 D7 J7 M
  9. </p><p>  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;</p><p>
    / i9 [) C; ?' @* B( V1 F
  10. </p><p>  GPIO_Init(GPIOB, &GPIO_InitStructure);</p><p>
    " _7 t  ~  d2 ~" l1 h) q
  11. </p><p>  GPIO_PinRemapConfig(GPIO_Remap_USART1,ENABLE);</p>
复制代码
9 }" L4 u+ y% \4 C
这就完成了IO口的配置和重映射,下边再配置相关的外设(USART1)就可以使用了。
: N% ?9 Y& ~" k+ R
) E. b( }- q  F外部中断线也是可以映射的,并且需要开AFIO时钟,不用GPIO_PinRemap函数,用GPIO_EXTILineConfig重映射引脚到中断线。其实与其说是映射,不如说是选择,选择引脚连接到外部中断线。
( m5 X+ h2 X2 N9 m; S- Z1 r! M8 s% U$ q0 Y) W
重映射不是任意的,只能重映射到指定的管脚。& [& @3 R2 l4 e( M2 l' m

" J' g  r' t/ g3 O6 W" d3、关于第二节讲到那个疑问,为甚么不能配置成模拟输入?模拟输入与浮空什么区别?1 V6 P. x; I8 b& x1 ?

/ c6 A% z" a; ^) l, ?  t+ F8 k答案是可以配置成模拟输入,官方3.5版固件库例子和alientek例程都是将ADC输入引脚配置成GPIO_Mode_AIN# P; h6 N  @' o" ?/ Y2 |" ]' q
0 F0 P' \; b) s: W! x' w' p: W/ G
那么配置成浮空行么,还能ADC么?
# M; a( n4 y# R- e
  1. <p><span style="background-color: rgb(255, 255, 255);"> </span>   //例程</p><p>
    % a* ?- b3 m' P  \; a* a" u5 a$ y8 _
  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>
    7 k# L! {, }: V1 q3 T7 R
  3. </p><p>     //修改</p><p>
    : ^7 Z% u( o% m) 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>
复制代码

  r: w9 |6 r9 v9 I, T# N# }8 a+ p实验证明,这两种配置都能实现ADC。那么USART的Tx应配置成GPIO_Mode_IN_FLOATING,如果配置成GPIO_Mode_AIN,还能接受数据么?金牛板实验结果是不能,ST不我欺也。总之:
5 L& x1 R) b0 A. r' \
& e1 [! {; ~9 g! y8 K; V6 g; ^可以将引脚配置成模拟输入,使用相应的复用功能;/ w3 d+ c( p4 w" Z" N& a
' I+ C; U- b# q% i5 {
浮空与模拟这两种配置是不同的。  ~4 c4 _  ~' ?3 t; g+ e& q) B0 t
, |! p( s; ]" O( @
关于第二节里那个“注意“,我也不知道是什么意思。我猜测是这样的:打开某外设,这个外设将某引脚当做输入,我们偏偏把这个引脚配置为GPIO输出,这样可以操作GPIO来”欺骗“这个外设,这种用法应该是很微妙的。
  o2 ^4 y- e" J5 A) Z+ B4 K# ]5 ^: O* p
4、推挽与开漏* b- d. |& s+ Q
) \* s3 q; c7 o' t8 E
不仅仅stm32有这种配置,实际上,这两种已经广泛应用在很多场合。
" O. X7 E! s8 S3 Y' g, |( n% R# R" A+ E5 i1 `5 r; q5 V6 B* H
推挽,又叫做推拉,是个很形象的名字,一般是指两个三极管(MOS管)分别受两互补信号(或者一个信号,但是用互补对管)的控制,总是在一个三极管导通的时候另一个截止,这样的电路被称为推挽式(互补式):
7 S: F( t/ r6 `5 \4 n" Q
# Y/ f; I4 _# y
1346657973_9578.png

/ n  p; l# D% T. E% H5 v这种电路在放大中通常被用作输出级,在STM32中,推挽配置就是这种,如图:/ `( B" h' G. G0 n0 x+ C* l

. x8 g$ i: _  Q1 H4 \, z5 @& f
1346657791_8272.jpg

: m- n2 w; T0 w7 X在相应位置1时,P-MOS导,通N-MOS截止,输出电压为VDD;在相应位置0时,N-MOS导通,P-MOS截止,输出电压为VSS,这就是所谓的推挽。是比较简单的。
& c( b! n+ N$ }1 B0 c
7 b7 s  v- e" t而所谓的开漏(对三极管而言是开集,一样的原理),则要巧妙一些。所谓开漏电路概念中提到的“漏”就是指MOS FET的漏极。同理,开集电路中的“集”就是指三极管的集电极。开漏电路就是指以MOS FET的漏极为输出的电路。一般的用法是会在漏极外部的电路添加上拉电阻。完整的开漏电路应该由开漏器件和开漏上拉电阻组成。
" p; o2 U2 T6 W9 t9 K+ u% T  m5 k9 ?4 @9 g  u# @
对于stm32,开漏就是失能了P-MOS,这样,当相应位置1时,引脚实际上是处在了浮空的状态,而通过外接的上拉电阻,将其拉高。
6 z/ l- p" W# A/ C
+ I; I9 c! q) R这么做有如下的好处:
: z. S" l6 s/ ]: g. `5 W6 c6 [& f; _$ D0 N) @0 }9 Z
1、可以将多个开漏输出的引脚,连接到一条线上。形成“与逻辑”关系。当多个引脚任意一个变低后,开漏线上的逻辑就为0了。这也是I2C,SMBus等总线判断总线占用状态的原理。
6 f% C. @/ _+ V" D) f; O1 \2、 可以利用改变上拉电源的电压,改变传输电平。这样我们就可以用低电平逻辑控制输出高电平逻辑了。想想当初认为stm32输出3.3v电压带不动IRF540,就直接断定要重新选型,是错误的想法,只要将推挽输出变为开漏,再加上上拉到5v的电阻,就能解决这个问题。
) J( X! X* |7 H/ @
5 W. u6 h' \3 c顺便一提,上拉电阻的阻值决定了逻辑电平转换的沿的速度。阻值越大,速度越低功耗越小。反之亦然。1 }+ K1 \) R7 I

; g; ]# Y: i- u/ i9 O6 C: N4 @5 G2 [7 B  b7 U3 \+ G$ w
收藏 评论0 发布时间:2021-11-29 22:20

举报

0个回答

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版