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

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

[复制链接]
STMCU小助手 发布时间:2021-11-29 22:20
stm32的引脚有两种用途:GPIO(general purpose io)和AFIO(alternate function io)
. e$ }0 v* k0 L$ d4 j
' C4 B$ n9 y! n; b" o' _% R对于一些引脚(视芯片而定),这两种用途都没有,如在64脚产品中,OSC_IN/OSC_OUT与作为GPIO端口的PD0/PD1共用一样的引脚,而在100、144引脚产品中,这四个功能各有引脚与之对应,不互相冲突,所以OSC_IN/OSC_OUT既不作GPIO也不作AFIO,当然,这样的引脚不是讨论重点。
" {  T  I, M- W$ D1 l$ a8 e5 P+ P7 ?$ B6 _# U
1、引脚的配置
. m; ^$ v* b( I# N- ^/ O1 V+ Z! }- _
不论是作GPIO还是做AFIO,都要对引脚进行配置。在固件库函数中,用GPIO_Init()函数对引脚进行配置,并不是说这个函数带了“GPIO”字样就是要当做GPIO来用,而是把它纳入GPIO的范畴来讨论。3 d# i) }$ Z. K2 b- N1 W

$ J! d5 \: _# v- Q+ X所谓配置,就是引脚上的片上资源连接方式,如上拉电阻、密特触发等等。理解了配置,也就能明白配置与模式的区别。
9 N2 j, w. Q) @: s( V. W* e% n4 [; t, K2 N
特别得,在下文中将会专门讨论一下输出配置中的推挽与开漏。
- d! T, O( \; L1 N, P
6 L) v1 x% o6 ]0 {7 g2、复用功能) U; Y0 @0 ~. w, E

" e% j  ?# u  O0 ^8 j( G" \( }. J复用功能有两种:没有重映像、重映像(包括部分重映像、完全重映像),使用引脚用作AFIO功能,同样需要对其进行配置。% X! b+ N, a- ^, p
% F: u: E& g" E5 H
1341810945_5803.jpg

4 G7 a& ^/ Q2 C% W这三句话来自参考手册,但我对第一句和注意有疑问,第三节讲。如果把端口配置成复用输出功能,则引脚和输出寄存器断开,并和片上外设的输出信号连接。输入配置则与GPIO没有区别。! z3 c) v' f7 L" k& L$ Q' z
2 r4 g* r- k5 G, U
为什么输出模式有专门的复用模式而输入则没有呢。因为输出是由芯片内部电路驱动的,必须选择这个驱动来自哪一个外设,是GPIO还是复用此管脚的其他外设,也就是选择该管脚在内部是与哪个外设相连的,不说明这个就会发生信号的错乱。而输入则不同了,输入信号是由芯片外的信号驱动的,虽然该信号进入芯片内部后可能有不同的去向,但不需要对此进行配置,因为不会发生信号的冲突,最坏的情况就是多驱动了个寄存器而已。事实上,当将引脚作为GPIO输入时,相应的AFIO外设是处在关闭的状态,并不会耗电;当引脚作为AFIO的输入时,可能GPIO是读不进来的,这是我猜的,没有验证,能不能读进来无所谓的,不必纠结于此。
: x; Z- A' a) G5 M; {4 }$ m1 q6 }+ n
1341809146_6021.jpg
- t1 F* S6 [4 M$ r/ d
若选择了复用,则默认是没有重映像的,可以直接使用外设,不需要再软件做设置。, F" w5 q3 |* q8 C$ W$ k  I

  f/ T! s1 m7 A2 X- h) Y# C但若要重映射,则需要简单设置一下,
- K7 V5 Z' S& [6 q- o$ k( G1 F9 y# S5 j- ]+ B$ y
先要配置重映射后对应的管脚,可参看参考手册或数据手册引脚定义章节,开AFIO时钟,使能重映射。例如重映射USART1,全部代码如下:
2 O$ k0 A: X  C$ V# N  [5 u- y+ W% s% l% b  k1 e
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
) q: c& }8 p; j2 s( }+ Q1 J
" a+ g- d8 B; q3 `  /*对寄存器AFIO_EVCR,AFIO_MAPR和AFIO_EXTICRX进行读写操作前,即重映射和选择外部中断线前,应当首先打开AFIO的时钟*/5 Y) e  R, K0 N

$ R, m7 {3 l, d: z; f: t+ {
  1. <p>  /* Configure USART1 Tx (PA.09) as alternate function push-pull */</p><p>! i/ b  A9 l" c- j5 F  H  C5 W
  2. </p><p>  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;</p><p>
    : O$ {; F9 Y: z
  3. </p><p>  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;</p><p>& ?9 B# I+ f% [' A9 M* |# J
  4. </p><p>  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;</p><p>
    6 k  c' i" w, Q0 i& A! s
  5. </p><p>  GPIO_Init(GPIOB, &GPIO_InitStructure);</p><p>! P4 e, a( G) G7 B' U
  6. </p><p>    </p><p>
    9 i' L* R; v& _. W' ]* R4 C. A6 [; }
  7. </p><p>  /* Configure USART1 Rx (PA.10) as input floating */</p><p>
    ) r' l& z8 `: V7 N2 z  j  G9 E! m
  8. </p><p>  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;</p><p>
    5 t% e' Z- s. i  K
  9. </p><p>  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;</p><p>  |' Z4 T8 x" x8 [4 }. }0 E9 N
  10. </p><p>  GPIO_Init(GPIOB, &GPIO_InitStructure);</p><p>1 R( E; q" q8 E6 D$ Q
  11. </p><p>  GPIO_PinRemapConfig(GPIO_Remap_USART1,ENABLE);</p>
复制代码
. W: o% u; U- P! y
这就完成了IO口的配置和重映射,下边再配置相关的外设(USART1)就可以使用了。; S6 M6 G! D; {% J" I

  M$ Y2 b' M& z  \- O2 U" r外部中断线也是可以映射的,并且需要开AFIO时钟,不用GPIO_PinRemap函数,用GPIO_EXTILineConfig重映射引脚到中断线。其实与其说是映射,不如说是选择,选择引脚连接到外部中断线。
3 L7 n6 e! v6 @/ m: I2 O/ c$ d
9 r/ F* z6 o. u* T$ d重映射不是任意的,只能重映射到指定的管脚。
, t  j4 S! V& {
5 o1 A! c" f* L& U! A) t, {7 Y3、关于第二节讲到那个疑问,为甚么不能配置成模拟输入?模拟输入与浮空什么区别?
8 E5 }8 B2 E: n
* K1 P: r! f# I( H" A答案是可以配置成模拟输入,官方3.5版固件库例子和alientek例程都是将ADC输入引脚配置成GPIO_Mode_AIN
6 @- E0 W9 i# {4 {4 U, g$ V0 N0 g8 K% L8 o7 ?
那么配置成浮空行么,还能ADC么?
/ i9 |9 Z# ^' c0 e- A
  1. <p><span style="background-color: rgb(255, 255, 255);"> </span>   //例程</p><p>) U) m8 i# U# E! D4 E; E; V
  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 [% B- Y. R; O; u( O* [
  3. </p><p>     //修改</p><p>
    ) j9 `8 ^) y" w+ _: x
  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>
复制代码
. D: |' d( b) |5 ?
实验证明,这两种配置都能实现ADC。那么USART的Tx应配置成GPIO_Mode_IN_FLOATING,如果配置成GPIO_Mode_AIN,还能接受数据么?金牛板实验结果是不能,ST不我欺也。总之:
1 P: R% h. L6 a7 C& E9 M: m. a: c! }! i1 |5 ^6 O
可以将引脚配置成模拟输入,使用相应的复用功能;5 X* l4 y+ W- _$ c
" e1 P; X$ E6 \- L6 r
浮空与模拟这两种配置是不同的。* [! f3 {8 H6 ^7 Q. `2 }
( p9 O! b. M- T8 ]+ O
关于第二节里那个“注意“,我也不知道是什么意思。我猜测是这样的:打开某外设,这个外设将某引脚当做输入,我们偏偏把这个引脚配置为GPIO输出,这样可以操作GPIO来”欺骗“这个外设,这种用法应该是很微妙的。
, U: C+ T% U& S  X2 z
- S/ T! D& l# E1 {( B9 H4 U4、推挽与开漏
: H. h5 t/ k7 B. O$ Y1 I. x+ q! E  }; `
不仅仅stm32有这种配置,实际上,这两种已经广泛应用在很多场合。3 z' D" b9 Z8 }$ r

% B7 i6 ^, [* f+ z. z0 j推挽,又叫做推拉,是个很形象的名字,一般是指两个三极管(MOS管)分别受两互补信号(或者一个信号,但是用互补对管)的控制,总是在一个三极管导通的时候另一个截止,这样的电路被称为推挽式(互补式):+ q" w; y1 o% ~& o) Y1 Y9 }4 w* o
" Q3 q0 L4 U  q; v8 M. ]* l
1346657973_9578.png

9 R5 D2 F7 c0 @这种电路在放大中通常被用作输出级,在STM32中,推挽配置就是这种,如图:0 R1 t6 I  n, J/ `6 q, t
" u; [: m8 }4 s- n- h
1346657791_8272.jpg

9 p' Z5 Z& G. \  N% v在相应位置1时,P-MOS导,通N-MOS截止,输出电压为VDD;在相应位置0时,N-MOS导通,P-MOS截止,输出电压为VSS,这就是所谓的推挽。是比较简单的。8 U& b  n( L4 ?! D; L

8 W+ _1 A! a. P, b) V而所谓的开漏(对三极管而言是开集,一样的原理),则要巧妙一些。所谓开漏电路概念中提到的“漏”就是指MOS FET的漏极。同理,开集电路中的“集”就是指三极管的集电极。开漏电路就是指以MOS FET的漏极为输出的电路。一般的用法是会在漏极外部的电路添加上拉电阻。完整的开漏电路应该由开漏器件和开漏上拉电阻组成。1 M) L0 i4 i3 B; D/ f$ H' m% I
  u6 z9 U) L# D0 Q3 w; j. e
对于stm32,开漏就是失能了P-MOS,这样,当相应位置1时,引脚实际上是处在了浮空的状态,而通过外接的上拉电阻,将其拉高。% L0 g" O: g& L. M4 P

* j+ W0 l1 E4 f- D2 A. i9 I这么做有如下的好处:
/ V9 u7 E. t5 H6 ~& r. U1 A0 a
0 l' ^  x5 s% }' O, v1、可以将多个开漏输出的引脚,连接到一条线上。形成“与逻辑”关系。当多个引脚任意一个变低后,开漏线上的逻辑就为0了。这也是I2C,SMBus等总线判断总线占用状态的原理。6 y* r" e  M8 i
2、 可以利用改变上拉电源的电压,改变传输电平。这样我们就可以用低电平逻辑控制输出高电平逻辑了。想想当初认为stm32输出3.3v电压带不动IRF540,就直接断定要重新选型,是错误的想法,只要将推挽输出变为开漏,再加上上拉到5v的电阻,就能解决这个问题。
, r$ L( s5 ~) l* z# g# |1 U- R  P. {" l6 K8 z" `1 h5 t
顺便一提,上拉电阻的阻值决定了逻辑电平转换的沿的速度。阻值越大,速度越低功耗越小。反之亦然。
8 a; L; _9 q* R! {2 a! Y; k; ]" ~6 x9 z. ]5 `

7 x5 d0 d$ Y" O' H2 ^
收藏 评论0 发布时间:2021-11-29 22:20

举报

0个回答

所属标签

相似分享

官网相关资源

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