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

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

[复制链接]
STMCU小助手 发布时间:2022-5-24 10:12
  1. #include "stm32f10x_lib.h"* R; T4 B. N& t+ F5 K
  2. #include "stm32f10x.h"& T5 m2 c) S0 b
  3. $ u% b- N& ]& L5 y0 p
  4. GPIO_InitTypeDef GPIO_InitStructure;                 //定义GPIO宏操作结构体% `  I2 C" Z: I( r0 S

  5. ( D' X9 \  n6 Y! m) j7 i
  6. void Delay(__IO uint32_t nCount)//__IO的宏定义volatile
    ' T* q2 z: F( m& k" n1 ^3 u' d& w
  7. {3 M. D- [0 F5 C- V  F: o$ P/ b+ V
  8.   for(; nCount != 0; nCount--);0 O! @' [1 J* n5 I
  9. }& a6 s' b+ C" |

  10. ' h5 A* `5 M$ h. P4 M0 k; v
  11. /*初始化嵌入式Flash接口,初始化PLL使其达到系统可用频率*/
    1 [: E, y" [( E' h" n
  12. void RCC_Configuration(void)! g! d$ D- \' L9 @# C
  13. {   . T3 w, G- P8 w$ P$ O  x
  14.   /* Setup the microcontroller system. Initialize the Embedded Flash Interface,  / L: D, A; P, R! p4 y( H
  15.      initialize the PLL and update the SystemFrequency variable. */9 i8 m. I! \4 ?6 ]) [; x: z( S
  16.   SystemInit();$ t- a' H5 K5 w% v' t
  17. }, ]- r* c6 Q. l" ~" h8 W
  18. int main()
    3 j. {* S8 y+ Y$ o( H; H
  19. {: p, m$ V$ M( ^) R2 S, j. h
  20.           3 E5 e* C5 R4 c
  21.          int i;
    ' U4 p- g. w( G- I/ g' i. u
  22.          RCC_Configuration();   //初始化FLASH及其PLL,系统时钟配置
    6 G8 O4 ]" h/ E. b* r% Q
  23.          4 _$ Q+ s1 @# s3 N" r

  24. # z; v( Y7 Q! P0 k0 n9 c, J( p
  25.          RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOB,ENABLE);        //外设时钟配置,开启GPIOC的时钟        
    # @; c$ Z; _" e
  26.          GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_9;                                        6 A9 j5 z  r( ?0 A/ T4 \
  27.          GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//将PC6\7\9口配置为通用推挽输出
    0 i5 ^  A! v. x( _; e! v
  28.          GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;           //口线翻转速度为50MHz
    4 Y+ Q, g7 _# B
  29.          GPIO_Init(GPIOC, &GPIO_InitStructure);                        //配置GPIOC口
    & [) N  I8 I- K, z2 M' {6 ^" F: E
  30.         / A  n! b; e: j1 T! Y; {0 S" _. O. Z# T
  31.          
    5 H5 B3 ~$ c; F9 Y' u  `, G0 j2 y
  32. / Q9 `3 F9 K& |( v3 X! B5 c
  33.          while(1)
    3 K3 b! Y; B' q$ ]& @- `  K0 {+ C5 W5 Q
  34.          {  k/ O! p3 K. r) F9 ~
  35.                   
    . d5 E6 f) l; F- C7 k& I  N
  36.                  GPIO_SetBits(GPIOC, GPIO_Pin_6);                         //PC6口输出高电平
    ; b6 e0 r' H5 s% d
  37.                  GPIO_SetBits(GPIOC, GPIO_Pin_7);                                   //PC7口输出高电平                         GPIO_SetBits(GPIOC, GPIO_Pin_9);                  //PC9口输出高电平        
    8 ?2 U6 C) u7 \+ s7 h1 h$ R" R
  38.                 % k# f2 S' b7 K* U; ]# g5 R# n
  39.               for(i=0;i<1000000;i++);
    8 H- m% k% H! \+ ^* |
  40.                  GPIO_ResetBits(GPIOC, GPIO_Pin_6);
    2 [5 F! J* g* z% E0 S6 n# v) \: ?1 N
  41.                  GPIO_ResetBits(GPIOC, GPIO_Pin_7);8 Y8 g3 S+ d* G. x. n
  42.                 //         GPIO_ResetBits(GPIOC, GPIO_Pin_9);- Y+ w! {, S5 [  Z
  43.                 // Delay(0xAFFFF);
    ( W( Y: l" W: _
  44.     . n, L9 O: X$ {" }  M0 x
  45.                  for(i=0;i<1000000;i++);0 a1 E5 b; c0 i; w* o
  46.           }. y4 [" I; d; G. |9 Z' M
  47. }
复制代码
5 f% g- C6 G$ K

) ]* N8 i4 y9 Y0 e) Y# E- A( `. e5 i$ q2 r! e0 H( c, n: m0 {
步骤一声明GPIO的结构:
; q  U% e3 ^; i. \' \8 J
7 ]* E% j- Z* _, q/ I. Y1 A4 |            GPIO_InitTypeDef GPIO_InitStructure;
. }. x& Q' }5 v% z  z0 W  F0 r6 y7 l; `' L% v! o3 {1 i

. |' z9 I& @5 [9 l( a! g+ P; u
& L9 Y0 i, N' Q' l+ ]7 a步骤二为变量GPIO_InitStructure的成员赋值,如果只设置其中的一部分成员,我们需要如下代码:
5 H8 y& o4 L, q6 H1 Y# |! o- N; r! o
/** * LED1->PC6,LED2->PC7,LED3->PC9 */9 j: U+ I, y6 l
5 y* U( D0 U( i5 N0 r

% x7 i  ]) y% m  m9 G+ c8 e1 ~2 n: n; ^
      GPIO_InitStructure.GPIO_Pin=GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_9;
5 L  q" H+ \6 f( l) o6 F8 h/ X
( [( e9 h0 d5 O      GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;+ P5 j* r6 N6 W# f7 h" K* T

# [$ |" d5 w: h! p      GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
/ _* Y2 d+ G) K0 |: S, J+ \. A. c: }+ ?& b& m7 D" s- U
      GPIO_Init(GPIOC,&GPIO_InitStructure);
+ |8 }+ r8 s, ^
! m5 n( y% H# N$ R) W
7 n) G( U  f) i2 E  R
) i, e" i7 G4 L+ x实际上这里省略掉一个函数:% Y9 ]4 ^* s- X5 I+ k- h. j1 e
4 u, m3 o2 d" v6 i$ E  R  E7 @6 \7 Y, r
GPIO_StructInit,它是用来初始化变量3 O' v; M1 R6 E7 L
1 W4 Z* }; U- t- F& g
GPIO_InitStructure的,经过实验,发现不用也可以。大家可以尝试一下:)然后
. f! j( r' T* X  @; L% m
# V8 }5 j- {. R5 d4 G修改该变量中的成员,有三个成员。在STM32开发板上,GPIO端口接的
, F' g8 N' A2 b1 |4 E, ?' x- P! i: N: g# w: P: Z& |+ U$ P/ a
PC6、 PC7、 PC9引脚。因此,我们在GPIO_Pin成员这里赋值GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_9。; T& [8 C  N/ W4 `. ^: y

% y+ I0 B6 a; K" g1 f/ K- _在GPIO_Speed成员上赋值 GPIO_Speed_50MHz,
! t7 u) g4 n  H9 @! H( Y" T7 H4 Q6 _0 u; O
GPIO_Mode成员则是设置为 GPIO_Mode_Out_PP,表示推挽输出模式。
+ c$ |$ l% u% ~; Y4 b
! k- g6 ^! [! }( ?! K0 c, `6 b, R+ r

# H8 A' Q! ?' _8 h推挽输出——>(输出高电平电流和输出低电平电流一样大)

% T" x6 \" U. N" l/ m7 w, r. V4 M: `* I/ j& I+ d
! ~% D8 D: P+ ^
        推挽电路是两个参数相同的三极管或MOSFET,以推挽方式存在于电路中,各负责正负半周的波形放大任务,电路工作时,两只对称的功率开关管每次只有一个导通,所以导通损耗小、效率高。输出既可以向负载灌电流,也可以从负载抽取电流。
# `4 K! D- K, J$ @" ]. ^
- E0 g6 i. S" R0 s. t  W2 G' N       推挽电路适用于低电压大电流的场合,广泛应用于功放电路和开关电源中。
7 a5 _! W6 n+ ^4 }: D
7 }3 W/ }) D7 U优点是:
结构简单,开关变压器磁芯利用率高,推挽电路工作时,两只对称的功率开关管每次只有一个导通,所以导通损耗小。
- a5 U- q0 b5 v0 S+ M, F
1 e. x$ r- I9 l3 m' i$ ~* b缺点是:
变压器带有中心抽头,而且开关管的承受电压较高;由于变压器原边漏感的存在,功率开关管关断的瞬间,漏源极会产生较大的电压尖峰,另外输入电流的纹波较大,因而输入滤波器的体积较大。
) c" S  B1 f6 `& ?
3 ~# }- V# F4 P$ X       三极管的推挽部分的简化电路图如图* z- M9 \8 I3 n9 r4 e8 F7 q

8 b, A: f0 z+ B. y" n! n! g9 y  O 1344779687_2379.jpg
' q4 `7 g4 I# r5 T, W, e. |
- l  l( V# R* x& J! L5 M
6 f6 d1 K4 p4 L' K4 _# a步骤三 调用函数GPIO_Init()来初始化外设GPIO,代码如下:- r  C8 _2 x8 u
  g& Z6 y7 ^8 @7 l: a7 L4 M
        GPIO_Init(GPIOC,&GPIO_InitStructure);
4 R8 [$ w* A$ ?3 ]5 r5 f& j* d, e) x8 Z! l$ c) H
9 B% i0 `8 l  k7 s' R- O- M( Y) t

  q) y  X1 [! {- n( N步骤四使能。注意,在固件库中,GPIO没有GPIO_Cmd的函数,因此这个步骤省略。
2 X$ Y" h, d' r  O: ]$ N$ h2 T) R1 J2 K1 H% ^% D8 t. W

; B5 V7 Q; B1 d+ e; ?+ K: u; l  M. r1 b  ~7 M, b  Y
通过以上四个步骤,我们已经对GPIO进行了设置。还有一个问题不能忽略:, v4 G4 C& b0 m+ J) A3 ~
2 {. x  A, }4 O% L  U: n- @
在设置外设前,我们必须给它调用一个时钟函数来使能外设时钟。
- ^  y# K5 S# a' \5 d- d, M" H
+ A- N* n+ Y4 i- Y' Y5 p0 s% u! N    在CPU的用户手册中,我们知道,stm32有好几个时钟的,现在我们用哪个                                      6 ~6 v  O9 _1 d9 k

; A% ^, ^* E$ l' l时钟呢?打开《STM32F10xxx参考手册》中文版的P25页,截图如下页所
" W4 H( E, J% S  j4 k' M* n. }' h* Z  a
示。我们使用的是GPIOC端口,因此,使用的是APB2。2 |, I9 _& k, p7 |6 y

0 H& a5 _0 e' k) ]' y8 c6 I9 H
- b2 C# D# X' E& V5 R 1344777830_1135.jpg 2 ~' N: Z7 |8 [* h$ L: B( N

, H: A* {* a2 s* V. w* N# k6 J
- g$ I# T* D* l2 F步骤五:定下这个APB2对应的函数后,我们就调用它:

" I/ k$ B3 r" |; o0 v+ _# p( W0 I& S- t) p% ]
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);" H! N8 v. \* @) S4 k+ v9 D$ U

( u* W* ?3 f7 N8 I+ N* J
& @, d& ?# H* O, ^# W1 F
6 r, T% i1 a1 O' _4 ]2 O, l! `其中,第一个参数需要指示要开启什么端口的时钟,RCC_APB2Periph_GPIOx就是开启GPIOx的时钟,第二个参数需要指示是开启还是关闭,ENABLE/DISABLE。! W, C/ `0 O% @& f& }9 B3 i
& b& x# {# Z" A$ \2 h

, y3 R# f) f3 m: a  y: F* R3 _/ {% w$ W6 o! ~9 c/ R
注意,这个时钟的使能函数,应该放在最前面。必须先有时钟,才能做后续的操作。
; }$ R2 _; C2 `" `1 W/ B: s8 Q6 a" y
我们先看原理图里,LED如何连接的:, C; }8 w2 [8 K  n
9 n7 k6 t$ e9 s4 N
1344777939_1341.jpg 1344777967_4383.jpg
& G, R7 @) }# v5 F+ r1 o$ M! ^. g/ c( g2 `
1 }' j7 ~! f. B) }6 Q3 L" u
5 B+ q' U  R5 y& ]  ], c' C
从原理图,我们可以看到,要使得3个LED都亮起来,必须把对应的引脚' F% n* X# e/ |8 G# F
6 [" v( y6 Q7 r: X+ H1 ^$ P! i
清零。置1会让LED灭。现在打开STM32固件库文档,找到10.2小节,GPIO8 l: q& o8 \, [( q5 k5 U# {
0 A1 h9 \6 A% a- [. p6 q6 q
库函数。GPIO设置的所有函数,都在这里。我们看下要使用GPIO库的哪个函
2 w, ]9 c; K- Y# j2 l3 y" `6 `; W1 B6 p, {; ~
数。找到:GPIO_SetBits();和GPIO_ResetBits();
7 ]3 k$ q' @# h+ g6 w9 A4 G: p# ]
: m; w( e% L0 j    这两个函数,根据说明,分别是设置某个引脚为高电平和低电平。0 q3 ]- f5 G8 m# d
, e- N! y. Q! x7 A* k# }2 E# U
GPIO_SetBits函数是设置高电平,' ?7 n! Q$ Q( t* ?: R2 }& W
* W* C( U# ]' C9 S
GPIO_ResetBits函数则是清零操作。根据我们
- y- l2 d  X5 _, V& D+ B
- |1 e# `/ D2 ?3 `, K5 g5 I获得的信息,写出如下代码:我们的目的是让所有的LED有规律地闪烁,并且无限循环。
/ I3 B' S% p3 F; ~/ z2 Z
# X8 }1 E- M, }8 O1 U$ H2 ^8 d+ h* f  S3 v" c5 `3 n. ]1 @& y+ O9 W

& V! ?7 u9 a$ M! I* D/ M3 N我们还需要调用SystemInit();函数,来初始化整个系统,包括时钟设置到
* J' C! X8 r" G) j* u! f6 f! S( {! T5 i5 ]* U. E
72MHZ。以上配置结束后,您就可以根据MDK+Jlink的相关教程,下载HEX
% t/ T+ I  o! F' C* s6 r
8 z0 B  J* l; Q" n! g文件到板子里进行调试了。- n( W# L+ [% k) S

0 B( E% i+ u! c9 m# Z  r; F+ h' b' l. t
2 E$ p! u7 g+ ^$ P7 ]9 K# D* s) E

5 U7 K  J2 i# i5 r" j
收藏 评论0 发布时间:2022-5-24 10:12

举报

0个回答

所属标签

相似分享

官网相关资源

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