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

【经验分享】STM32F1笔记(一)GPIO输出

[复制链接]
STMCU小助手 发布时间:2021-11-30 21:17
GPIO最经典应用:LED灯。
( e4 J& n9 q% l% w/ D4 w3 C$ z# L$ [7 z: X5 e
先看电路。声明:参考正点原子战舰开发板。* k/ Z! ^% j" a6 G

! |+ B0 B4 U" H, Q4 ?" j* f
20180820151215293.png
2 S/ q  w7 B6 q
6 F  b1 C0 [& ^5 P3 g
20180820151305214.png

# v! T5 o2 u3 ~3 _+ b( {: }+ ], m. w3 z% @" n
20180820151054641.png
! ]- X3 Z- N2 i# \; Q

% u/ d6 B* K' `8 }. `与LED串联的电阻称为限流电阻。2 S1 ?: I9 M' _2 _% m% J3 F' ?
0 ]- c! L6 O0 \; Q; D, X  N5 _
限流电阻计算公式:R=(U-LED压降)/20ma。
1 g1 n& ^9 y, L
& _0 u7 p% H0 u* ~; `+ E/ HU为LED工作电压,LED一般最大电流为20ma。
) O5 ?8 ]7 B8 \: f5 `0 ~0 Q* F  p8 }2 z* A* j3 W( l
在此R=(3.3-0.7)/0.02=130Ω。& ]8 _' }2 U7 m& t1 g& |- P

( Y% D- `' I* |+ H因此本次示例中限流电阻阻值大于130Ω,才不会烧坏LED。
, m, p; w6 x: J* u! @) I, J5 s
$ R+ h) B% B" T+ e" _, I# T" T  [+ d( i' q% t3 b7 u
再看代码。
, q  o* o& H4 _" a/ H& M' F  @
* L" G2 n) D" V5 p& T2 ]7 b1 YGPIO初始化。* S5 h* \0 L1 }- r" \0 O! q1 }: S
  1. void LED_Init(void)
    : z2 {+ r( A6 ?' p
  2. {1 `0 k" K+ u3 n1 U) ~: J' L
  3.     GPIO_InitTypeDef  GPIO_InitStructure;
    + J' [8 K& c, C4 J0 {) X
  4.          
    / D0 r, h0 S  P
  5.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOE, ENABLE);- g# p/ }% R! ^* U8 E: C6 f4 H' p) m
  6.         
    , Q0 |+ W8 }& ]4 R; t3 a
  7.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;9 X- j: H  o( {! z  ~+ L
  8.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    0 c7 Z& A8 Y5 {3 x
  9.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;9 q$ [. U- c1 g( \- M6 ?+ f7 W: h9 Q
  10.     GPIO_Init(GPIOB, &GPIO_InitStructure);* @, ], B, Y  Q4 b
  11.     GPIO_SetBits(GPIOB, GPIO_Pin_5);
    2 T# h5 q/ R! }" ]# |. u  r$ m: W
  12. ) u, `. N4 J1 n* A
  13.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;( O! p0 B2 w/ a0 j9 c. G& c
  14.     GPIO_Init(GPIOE, &GPIO_InitStructure);9 F" y+ }" I5 x  M' _' M
  15.     GPIO_SetBits(GPIOE, GPIO_Pin_5); 0 A7 F. `  ~0 V1 p; B4 M
  16. }
复制代码

: N2 R6 w: s$ ULED应用
2 b$ t4 w9 c: S# a% P# ]; k
  1. void HW_Led0_Off(void)
    ) ]4 f4 E) N/ L" M+ R+ m& Y  h
  2. {
    7 ?3 L; e! l: i; O) _6 w3 O
  3.     GPIO_SetBits(GPIOB, GPIO_Pin_5);    //设置GPIO输出1
    ( b) K' E4 G% @1 f9 O3 `) _
  4. }: [5 l  A: _4 J
  5. 0 A3 s# g8 \6 z* m, K
  6. void HW_Led0_on(void)5 e+ K7 J( g- b7 n) ~
  7. {
    ( P* {# T2 X9 ~4 v/ t- E4 L
  8.     GPIO_ResetBits(GPIOB, GPIO_Pin_5);  //设置GPIO输出0
    5 d: G1 F2 Q3 S0 j$ R* a
  9. }
    6 V. y  _7 i+ |, [
  10. % z9 d' I* L$ y. V+ s6 }
  11. void HW_Led1_Off(void)9 _% i+ `( y, m. ]  n1 E+ H
  12. {
    ! X& E/ o* f3 z5 ]" V' \: j
  13.     GPIO_SetBits(GPIOE, GPIO_Pin_5);    //设置GPIO输出1
    2 k/ V  E+ G3 ~1 M
  14. }' U4 {5 ]( J% T5 U% U

  15. - R6 q4 v" n- Q% `9 Q) G9 U! t
  16. void HW_Led1_on(void)* R4 `4 l  X9 j
  17. {
    6 p3 X  M1 H' m
  18.     GPIO_ResetBits(GPIOE, GPIO_Pin_5);  //设置GPIO输出0  J8 P2 y' u& }' u
  19. }
复制代码

0 m* [0 ~, e6 x0 A7 f! M# T思考:为什么IO输出低电平时LED亮,而不是输出高电平?5 Q2 X& o6 H' E0 |/ w) v2 ]' c8 u& o( ~
' e0 p9 S- x- B. Z0 M
思路:; p% _' U; L# Y7 b# m

( F& v; [2 j4 j% V5 w- {    1、由于单片机的I/O口的结构决定了它灌电流能力较强,而拉电流能力比较弱(即IO口的低平驱动能力较强而高电平驱动能力较差);1 Q, ?" ^1 z4 S7 _
* f# G7 q: B. \
    2、为了简化单片机接口的设计。高电平驱动和低电平驱动是同样的效果,另外,低电平驱动也简化了控制代码,避免了单片机上电复位时端口置高电平后对led的影响;
# n  P$ i6 D" m8 h9 C! `2 M1 ^& ]6 V2 L. s& Y2 P- f. y% o2 p
从STM32中文参考手册内得知,STM32的GPIO可配置为八种模式。! I9 @; \& P: ?* @
9 S* g* @/ K/ }
    1、浮空输入(Input floating)
3 y( r( `" R2 K& C% c$ z2 o5 I" _0 t
- Q8 D  [( g0 k- z' m) `% h1 @2 e    2、上拉输入(Input pull-up)9 Z$ b/ A; e/ L9 W
$ d2 |' e  J; j, s& z  s" o
    3、下拉输入(Input pull-down)4 q" m6 `% f- A. \" q( Y) F5 O

& s+ z- t1 S7 p5 I: U    4、模拟输入(Analog)" m! t& l) N. q3 r

( a- n* N4 K/ s6 t    5、开漏输出(Output open-drain)
! N7 D, B$ d' [- a* ?- Z$ p# A- a! O1 h9 ]- ?& j. Q
    6、推挽式输出(Output push-pull)  m+ C2 o& S; \8 M  M/ W' \) O
) V+ C1 D6 F" k" `# A
    7、推挽式复用功能(Alternate function push-pull)
: A  t3 s1 l8 F! ~, b, k9 F2 h9 u; i  F; n
    8、开漏复用功能(Alternate function open-drain)
$ j  ~3 e4 g, W" H" h* u* c, k4 q
  1. typedef enum+ i# s. E+ y# `. {+ r$ t
  2. {
    - Y; f! z: S: `* z" u7 W# C
  3.     GPIO_Mode_AIN = 0x0,& p1 V. w- Q4 T; R
  4.     GPIO_Mode_IN_FLOATING = 0x04,
    5 n: t9 p+ `# M% f* l/ i! F
  5.     GPIO_Mode_IPD = 0x28,
    * @  S+ a; q! V, N  j0 q
  6.     GPIO_Mode_IPU = 0x48,  u6 w5 ?4 a9 o! m5 ~0 v
  7.     GPIO_Mode_Out_OD = 0x14,
    8 s- |! e2 m/ ?" a" m" w5 A
  8.     GPIO_Mode_Out_PP = 0x10,
      O" D0 t( o+ ]6 \% W
  9.     GPIO_Mode_AF_OD = 0x1C,
    ) g; x% A2 f1 l. N( \7 E# E
  10.     GPIO_Mode_AF_PP = 0x18
    8 ]# {, Z6 O, M/ J& l3 j7 r
  11. }GPIOMode_TypeDef;
复制代码

5 d3 ]# s: q1 g; `3 Z' k- I& a& U6 h驱动LED使用的是推挽输出。推挽电路(push-pull)就是两个不同极性晶体管间连接的输出电路。" }: n9 T; I+ x0 J9 }- D1 ~
- o  K6 |" ^% ?2 y
20180820152844392.png

- |5 Q2 l% s/ }  t. ]+ c! X3 |, T6 O* @, h
简单理解推挽和开漏的区别:驱动能力不同。推挽驱动能力强。  p( c& V3 x0 v: Y' C/ O

: h" \) V0 e% ^  O. f! b, ]" A复用意思是GPIO不作为普通IO,而是特殊功能使用,比如ADC、USART等。9 c* m6 t0 W/ W/ w) z
- R1 S5 {* g% j3 k
引脚输出速度有3种:" i5 ?9 z+ H  V% x$ d! L
  1. typedef enum
    ; Q- y. n$ r2 x1 j
  2. {
    & Z, }5 U! x, |+ q9 _
  3.   GPIO_Speed_10MHz = 1,
    9 o& K7 y: @! ^' r
  4.   GPIO_Speed_2MHz,
    8 V* N2 E+ Y, U( O/ r& B
  5.   GPIO_Speed_50MHz
    . G3 m$ h7 a5 C6 g0 p
  6. }GPIOSpeed_TypeDef;
复制代码

& d# b/ D5 K2 O& t% F+ Q" ]GPIO的速度应该与应用匹配。速度配置越高,噪声越大,功耗越大。
  ^& s) W% E  C  C6 v7 f+ i! ?& Y. P9 ~" ?5 z7 b+ [) }; u
比如配置为串口应用,波特率为115200,此时GPIO的速度配置为2MHz就够了,既省电也噪声小。
1 I' ]+ `* _' T: B6 G: L% c( C" g' }) B  e
I2C接口,400K波特率,若想把余量留大些,可以配置为10MHz。
0 ?" ]2 t. r! x7 x4 o  b+ D8 R/ f9 R1 w
SPI接口,18M或9M需要选用50MHz的GPIO速度。. g6 q+ z6 P+ q

6 `/ n0 D& E; s  X. i
  s$ T. W. d$ |! I7 H" X3 d
收藏 评论0 发布时间:2021-11-30 21:17

举报

0个回答
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版