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

【经验分享】STM32---GPIO的使用

[复制链接]
STMCU小助手 发布时间:2022-5-24 10:12
  1. #include "stm32f10x_lib.h"+ O2 Y; s8 c: |/ p
  2. #include "stm32f10x.h"
    $ ^/ ^4 m2 r1 w  t3 L

  3. 5 t# Z" e3 g$ ^( H( v
  4. GPIO_InitTypeDef GPIO_InitStructure;                 //定义GPIO宏操作结构体0 X, E; m) O9 I7 @  L# _

  5. , }, g( L1 S1 }2 D& V9 Z1 r
  6. void Delay(__IO uint32_t nCount)//__IO的宏定义volatile  M( X; H5 i* C, t1 G
  7. {+ ?0 C/ w$ W2 `, F* w; q( E
  8.   for(; nCount != 0; nCount--);8 P+ D( G0 \' G
  9. }1 {7 [9 Z( [. v

  10. , u/ Q' x- O$ m+ q  r3 h* O" G
  11. /*初始化嵌入式Flash接口,初始化PLL使其达到系统可用频率*/! p, ~$ b4 c; l. A" E- `
  12. void RCC_Configuration(void)2 }& C1 t7 U/ a2 M% B
  13. {   
    - ~$ O9 D# q  B7 m
  14.   /* Setup the microcontroller system. Initialize the Embedded Flash Interface,  
    : Z2 l* O4 I* T) I1 @
  15.      initialize the PLL and update the SystemFrequency variable. */
    , n( M) u" F+ y% G3 t0 A
  16.   SystemInit();
    ; e+ q0 S9 m6 N+ G
  17. }
    3 _: k8 d  v: {0 E2 x
  18. int main()
    % w. M. _, l) S; v
  19. {
    ; ~. l2 ~& Z1 Z! y+ ^
  20.           ' x' [: U* u0 w( [  w* s. g
  21.          int i;7 @2 n" D. `0 G/ w" ^
  22.          RCC_Configuration();   //初始化FLASH及其PLL,系统时钟配置+ T- F5 R4 J6 k: M
  23.          / `8 K! }" u% \* j

  24. 0 ]3 E; D" N: s1 x" y
  25.          RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOB,ENABLE);        //外设时钟配置,开启GPIOC的时钟        4 Y/ v: m* C, u& x' X
  26.          GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_9;                                        2 O( G# s( w6 V- D- s7 t$ p7 |
  27.          GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//将PC6\7\9口配置为通用推挽输出
    : U/ m% Q; e. H
  28.          GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;           //口线翻转速度为50MHz
    . {7 B6 l/ E5 t& F
  29.          GPIO_Init(GPIOC, &GPIO_InitStructure);                        //配置GPIOC口: n7 E; U; o1 o1 g! ^/ y
  30.         
    - O2 B0 {) E8 R  I/ @
  31.          ! D* v1 ]" w: `/ d
  32. , E6 y5 U- y8 o- n* W! q
  33.          while(1)
    / [; q; w6 _. @8 u& S" W" F( d
  34.          {* w6 ]- w' _5 d% W& ]# S& w5 R
  35.                    ! B) c9 @; ^- ~  \: ]' N3 ]+ r. W3 n
  36.                  GPIO_SetBits(GPIOC, GPIO_Pin_6);                         //PC6口输出高电平% J# }+ }) @( _$ h  J5 u
  37.                  GPIO_SetBits(GPIOC, GPIO_Pin_7);                                   //PC7口输出高电平                         GPIO_SetBits(GPIOC, GPIO_Pin_9);                  //PC9口输出高电平        
    ( U7 b6 I' }( X; u
  38.                 ; K- Q' v8 c: C$ K% g! u
  39.               for(i=0;i<1000000;i++);7 J8 k0 _0 l" u
  40.                  GPIO_ResetBits(GPIOC, GPIO_Pin_6);
    4 B1 h& h! r3 F7 S$ K
  41.                  GPIO_ResetBits(GPIOC, GPIO_Pin_7);
    2 k7 w3 \/ D5 I1 h) L
  42.                 //         GPIO_ResetBits(GPIOC, GPIO_Pin_9);
    7 ?+ {2 v; O. Z& l9 N! w' V
  43.                 // Delay(0xAFFFF);
    ) X, ]0 h" Q" f/ `2 R1 S9 T2 a. q
  44.     5 F; }9 Z  m' Z3 e+ |' x
  45.                  for(i=0;i<1000000;i++);
    ) D1 v" J$ ?+ ~% L/ [
  46.           }# p8 p' L1 [3 w* g
  47. }
复制代码
$ O/ a5 I3 H  }6 c" r$ P4 b  E
3 o- ^- E% t" {1 O% h- W& x  x; T

& r5 W$ b8 e: _, Y6 W$ z# S步骤一声明GPIO的结构:' f  ]: ~" ]" b3 E$ v1 g( U# ~$ Z
3 A, x1 i& q7 p4 a! C* e
            GPIO_InitTypeDef GPIO_InitStructure;/ T! {! L8 X2 ~& p, [$ l9 K5 v0 r
0 I6 e- _, H, u! |' q  U) g3 k2 a

, w- h6 V% I, J6 j) F6 k) @5 z5 \$ C; [% E2 V+ b9 a3 ~
步骤二为变量GPIO_InitStructure的成员赋值,如果只设置其中的一部分成员,我们需要如下代码:
8 p6 H+ m& ~8 l# {6 h; N
& L3 G1 T+ b9 n( A+ Y; Q/** * LED1->PC6,LED2->PC7,LED3->PC9 */) |( f. Q  n/ s
. A' f+ z2 }! J$ W. `9 R8 x1 j
6 |2 G8 G2 O" ?- N& ]3 l! s
8 F0 a+ R0 G1 k  a' u& f
      GPIO_InitStructure.GPIO_Pin=GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_9;
7 U( Y7 F3 b1 F5 o8 z9 r
1 y6 N4 ?2 o$ b/ O, w6 E      GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
) {% u( p  g, ?, S8 b$ p3 n& p0 D: N/ [) ?# Y
      GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
4 ]# V, |4 P: G
& J0 H/ j$ I& i9 B+ K      GPIO_Init(GPIOC,&GPIO_InitStructure);+ j0 K( \( F- W
0 v5 Z3 q0 y1 T
4 O1 R. B3 D+ L0 u+ Z7 `
4 `) n, a- ^; _5 e5 E7 B3 h8 t6 r9 H
实际上这里省略掉一个函数:
7 E5 X; D  i! b7 u. d5 G3 P; u0 i, a! E: v0 b/ M7 n
GPIO_StructInit,它是用来初始化变量
5 e  z4 }. S& Z( M) c# C( a3 ~& }3 F5 G4 T  f
GPIO_InitStructure的,经过实验,发现不用也可以。大家可以尝试一下:)然后0 `- F: P# @* p% t
& z; H' h5 ^+ b
修改该变量中的成员,有三个成员。在STM32开发板上,GPIO端口接的
6 z8 H6 T. F$ x: s4 n$ k$ H6 E, j8 y7 G
/ _* Y% k' K  m% nPC6、 PC7、 PC9引脚。因此,我们在GPIO_Pin成员这里赋值GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_9。1 b1 I* u7 g: E' S) }& p

1 n$ Z/ G! \+ B7 L在GPIO_Speed成员上赋值 GPIO_Speed_50MHz,
( a* g2 h& I; [& |* @0 K/ x
4 L& }4 D1 [( D5 }1 a GPIO_Mode成员则是设置为 GPIO_Mode_Out_PP,表示推挽输出模式。
$ }( a0 e, @! Q9 j7 V) j9 V9 V3 D* a* v, n4 A/ Q% ?

0 p& }* u* a1 {
3 h) {% C( Q7 T" N+ [推挽输出——>(输出高电平电流和输出低电平电流一样大)
( E3 T5 z3 p* x. x4 E% z- }& @
2 Z5 F; s( x% m, J0 h4 ?; H

6 l7 @2 A1 ~% `- o4 h        推挽电路是两个参数相同的三极管或MOSFET,以推挽方式存在于电路中,各负责正负半周的波形放大任务,电路工作时,两只对称的功率开关管每次只有一个导通,所以导通损耗小、效率高。输出既可以向负载灌电流,也可以从负载抽取电流。
3 v5 Y  @* e: z# o- o8 k
# y* S( u7 l9 |       推挽电路适用于低电压大电流的场合,广泛应用于功放电路和开关电源中。
- g* d; _5 }* \3 s; D) J' Y
: A4 h: P3 ?7 @6 j优点是:
结构简单,开关变压器磁芯利用率高,推挽电路工作时,两只对称的功率开关管每次只有一个导通,所以导通损耗小。% U$ l3 N6 c  f5 W) S' B  M7 R' t

& [& l# h0 ^+ s  a5 `缺点是:
变压器带有中心抽头,而且开关管的承受电压较高;由于变压器原边漏感的存在,功率开关管关断的瞬间,漏源极会产生较大的电压尖峰,另外输入电流的纹波较大,因而输入滤波器的体积较大。
. \+ H; y' Z: y, R) I
* b7 d/ ]" M: E: O7 s, \" e       三极管的推挽部分的简化电路图如图
4 N1 U" H5 e, f9 R& O/ v( a, w3 _& X+ q& W5 n
1344779687_2379.jpg 3 N7 k; t! X, ]: [. V( r# W1 }3 b* |( ~% I
$ P' v+ a' u/ ?

) c3 `+ P0 T  a* l步骤三 调用函数GPIO_Init()来初始化外设GPIO,代码如下:
9 ~0 k& Q# {8 |) B
/ d# b0 r4 S0 }        GPIO_Init(GPIOC,&GPIO_InitStructure);
" O8 b; c5 Q/ K, g+ u8 B  C6 I% q  h1 ]) E. ^( n

3 j) d$ I6 f- a. x; B% l
# b1 U$ W. k: D3 |: U步骤四使能。注意,在固件库中,GPIO没有GPIO_Cmd的函数,因此这个步骤省略。2 P) K* X" \6 ]' t' F, T/ x; N
/ t# _# f4 s1 H/ ?% m8 R
) b# U' N( \" ]$ [0 a
% G2 M/ _& p) D9 A
通过以上四个步骤,我们已经对GPIO进行了设置。还有一个问题不能忽略:9 z2 ?+ H, H4 B4 r' W1 ~/ u( w
: U$ H3 Q8 z! E# n( T
在设置外设前,我们必须给它调用一个时钟函数来使能外设时钟。
% ~' t9 |* K* U: Y. b1 ]
6 U, X7 z' p; x' }' I. C" u    在CPU的用户手册中,我们知道,stm32有好几个时钟的,现在我们用哪个                                      
5 u% w5 |" ?; Y% w5 f/ C' i) L* F. Z" ?, m
时钟呢?打开《STM32F10xxx参考手册》中文版的P25页,截图如下页所
5 `2 O% }% a1 m2 {3 h9 F
2 O% @* J" q! U% d示。我们使用的是GPIOC端口,因此,使用的是APB2。
  k" m  l0 U3 }8 q
, C' }4 w. z6 l( O: V7 r7 b! R- O" O+ e/ h! j4 ^( X
1344777830_1135.jpg ) ?/ d7 F) r0 s# X  r8 T

" e9 K; n* ~6 h4 T2 E/ V$ k: G( i! d: J
步骤五:定下这个APB2对应的函数后,我们就调用它:
  j4 |7 d, ?3 A& q# e) g

; @" a4 k- A8 B7 G9 }    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);, c6 _7 e/ x, Y- u" {1 A0 X

4 j% y$ g. v7 h9 F% a! X
1 ]' i: a- ?$ @7 s" L' X- L
1 C6 ?  H" R2 N5 P其中,第一个参数需要指示要开启什么端口的时钟,RCC_APB2Periph_GPIOx就是开启GPIOx的时钟,第二个参数需要指示是开启还是关闭,ENABLE/DISABLE。3 n0 O/ }. [' n- D

2 ~' o! p2 @" |0 ^8 s1 O6 w' w$ Y% w8 ^; n4 [$ a2 D1 c

7 V" c# e8 O3 Q; w! M* ^注意,这个时钟的使能函数,应该放在最前面。必须先有时钟,才能做后续的操作。
' b  ?6 u% _4 o1 q+ v2 \. c, {: }$ m! ^1 s& W8 |
我们先看原理图里,LED如何连接的:0 e2 @  l# J( D; Q) O9 @" X5 g" @

0 @& F. C6 l1 ]7 h7 I! W) ]4 b, r" P/ h 1344777939_1341.jpg 1344777967_4383.jpg 1 ]1 M8 q7 T- U  F
$ X8 n; f5 B; z) N

  h, f; U3 i( I+ U# U$ }/ c
3 G4 D2 {  O7 Q# U( { 从原理图,我们可以看到,要使得3个LED都亮起来,必须把对应的引脚
" q9 p: Q4 r' H9 f6 [/ x: [7 ?0 `4 f5 U. ?) }
清零。置1会让LED灭。现在打开STM32固件库文档,找到10.2小节,GPIO
. |0 x+ X' Y, [  c) r( }' h5 [) M3 U! Z, T2 {: ~) d, z  Y; p$ G
库函数。GPIO设置的所有函数,都在这里。我们看下要使用GPIO库的哪个函; X2 L2 Z( ?- x
* b2 h! b# f! C" C9 R' F( l
数。找到:GPIO_SetBits();和GPIO_ResetBits();3 c. z+ Z: ~- }2 t+ j  N# p) q, _; Z
& g- ^9 v. J/ b
    这两个函数,根据说明,分别是设置某个引脚为高电平和低电平。
& m" L' N; G0 w7 Z. u# e( c& Y4 T9 A* h% @
$ ?7 R! W+ q0 j& YGPIO_SetBits函数是设置高电平,
& ~( K* R0 O: ^$ s2 e. c* P+ r2 {, {
9 J* z" N3 f0 WGPIO_ResetBits函数则是清零操作。根据我们
6 o% b8 K9 @" `8 \  j8 m
& x9 J+ n5 l6 z& _( ~' [3 e7 g获得的信息,写出如下代码:我们的目的是让所有的LED有规律地闪烁,并且无限循环。3 G  @; Q7 p' |- b( p$ S3 a
: U' T, ^8 o  q: f& k. X4 e

  T6 N* m$ H, p* n. [
5 x7 H, k, c/ C2 E! K- F! t我们还需要调用SystemInit();函数,来初始化整个系统,包括时钟设置到
0 f9 h9 a% F# f) W$ w$ b6 K% W* F1 _/ e% s* B
72MHZ。以上配置结束后,您就可以根据MDK+Jlink的相关教程,下载HEX$ @, g$ a) \6 y! D
! Y' [, c. ?& n2 n( r
文件到板子里进行调试了。( X4 U  Z' n) e9 m2 o- }6 T7 L
; h4 [7 E7 G6 K$ I7 V/ k
+ f# ?" q" u/ X( ]) ?& u$ ~& D

; p$ i3 E- r, G, K* Y3 D0 L  J; t, S. A
* }; F. ^) R, E/ i
收藏 评论0 发布时间:2022-5-24 10:12

举报

0个回答

所属标签

相似分享

官网相关资源

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