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

【经验分享】STM32F4 GPIO八种模式及工作原理详解

[复制链接]
STMCU小助手 发布时间:2021-12-6 10:37
1 GPIO简介
/ u( p: }3 f) l8 ]GPIO,即通用I/O(输入/输出)端口,是STM32可控制的引脚。STM32芯片的GPIO引脚与外部设备连接起来,可实现与外部通讯、控制外部硬件或者采集外部硬件数据的功能。
# P! b# [& M7 G( y) G. v& u
% K9 A0 L6 h& S, g: K+ eSTM32F407有7组IO。分别为GPIOA~GPIOG,每组IO有16个IO口,共有112个IO口  通常称为 PAx、PBx、PCx、PDx、PEx、PFx、PGx,其中x为0-15。  并且F4系列是基于Cortex-M4内核  
! h0 L3 W* ]9 a" I' ~* y0 }6 |1 @5 G+ o* @7 N& W* G
GPIO的复用:/ b! ^* x) q# Z  x
2 v  ^* F) l  j+ l
STM32F4 有很多的内置外设,这些外设的外部引脚都是与 GPIO 共用的。也就是说,一个引脚可以有很多作用,但是默认为IO口,如果想使用一个 GPIO内置外设的功能引脚,就需要GPIO的复用,那么当这个 GPIO 作为内置外设使用的时候,就叫做复用。    比如说串口  就是GPIO复用为串口4 t/ h" d3 S1 |  s: m3 {4 Q5 z
7 Z. R& C! V3 d( i3 c8 z7 V
2 GPIO的工作模式  `9 j3 _( w* f( r9 Y5 c2 H; P3 g. O
1、4种输入模式
8 S6 g* k5 a- C7 w; r% t(1)GPIO_Mode_IN_FLOATING 浮空输入9 \! U% P0 X2 f+ N+ l
(2)GPIO_Mode_IPU 上拉输入  n$ g. K$ r+ I; N4 c: O
(3)GPIO_Mode_IPD 下拉输入8 m; f) w6 r  z# l
(4)GPIO_Mode_AIN 模拟输入
! Z0 Z% n7 X3 g* N) t
+ ]6 U/ B" u+ _" `2、4种输出模式
8 [+ q1 F  X7 }1 B: x% f(5)GPIO_Mode_Out_OD 开漏输出(带上拉或者下拉)6 y9 e# h- N9 j, G9 u3 n& w
(6)GPIO_Mode_AF_OD 复用开漏输出(带上拉或者下拉)0 k! x, k; D! P2 `$ d
(7)GPIO_Mode_Out_PP 推挽输出(带上拉或者下拉)/ H: `/ I' D  g# v7 @' Z
(8)GPIO_Mode_AF_PP 复用推挽输出(带上拉或者下拉)
6 Y3 ?! K1 {/ S- b) Q4 X- @7 x1 w/ B9 ~$ T$ d
3、4种最大输出速度9 I- }. Y0 q& ?6 P$ _2 _5 k
(1)2MHZ  (低速)# R9 m" s3 B" ~0 Q4 Q
(2)25MHZ  (中速)
7 I) z" \* J3 p4 k: m* f* ^(3)50MHZ  (快速)
# V2 J% x- e" z: C) o0 X(4)100MHZ  (高速)
3 F- L) i) s  Y1 }4 ^+ `. X4 c! B# X. d9 Z
关于他们的定义,都在  stm32f4xx_gpio.h 中,都为结构体形式的定义
- ?" O0 D) b. ]  z; N, Z. v) S! y0 s* G7 @! l- d: w$ y
3 GPIO框图剖析
7 B5 x  ^( Q2 `5 k- o' q+ r( E# z5 d4 o
20190801161834709.png
, m3 x5 @, [" b# O% i4 B

8 I; G! ?" C- @我们所用到的每一个GPIO其内部结构都是这样,分别对应着GPIO的八种模式  这里我们简单的介绍下:( R0 E" Y' m+ Z) P: z) M0 l

% d6 w/ j" Q2 T& H7 q( H保护二极管:  IO引脚上下两边两个二极管用于防止引脚外部过高、过低的电压输入,当引脚电压高于VDD_FT时,上方的二极管导通,当引脚电压低于VSS时,下方的二极管导通,防止不正常电压引入芯片导致芯片烧毁
1 r/ W; G4 N2 i1 W& s上拉、下拉电阻:控制引脚默认状态的电压,开启上拉的时候引脚默认电压为高电平,开启下拉的时候引脚默认电压为低电平4 H2 r# z2 n1 V3 x* Y; S" r8 j+ G
TTL施密特触发器:基本原理是当输入电压高于正向阈值电压,输出为高;当输入电压低于负向阈值电压,输出为低;IO口信号经过触发器后,模拟信号转化为0和1的数字信号    也就是高低电平  并且是TTL电平协议   这也是为什么STM32是TTL电平协议的原因
8 @% V9 B9 M# a) Z P-MOS管和N-MOS管:信号由P-MOS管和N-MOS管,依据两个MOS管的工作方式,使得GPIO具有“推挽输出”和“开漏输出”的模式     P-MOS管高电平导通,低电平关闭,下方的N-MOS低电平导通,高电平关闭
: |. z: b) q2 l5 Y6 {注:  VDD_FT  代表IO口,兼容3.3V和5V,如果没有标注“FT”,就代表着不兼容5V      
9 b7 L& w% Y9 ~5 i" g
2 W% P2 f! i6 h' m 在芯片数据手册的引脚定义中,会看到有“I/O电平”一列  有FT即为支持5V1 c& I2 l; y+ g4 G$ E, S3 R
5 G. k! `/ V' a; s$ X
20190801175317972.png
5 {: ]7 v  ]' x7 F% o
% b$ v5 D' s5 h. I
4 GPIO的八种工作模式剖析:
+ n( w, X  ?+ h) P1 A5 y 浮空输入模式
; Q  ^+ [8 X/ g* D7 a5 r5 j% C
3 }0 O6 W5 Y7 ^: q% h* @
20190801191842465.png

3 T% i3 ^5 T! q  T$ [% v. Y, w" d2 P. j, c% f6 u5 }- s
浮空输入模式下,I/O端口的电平信号直接进入输入数据寄存器。MCU直接读取I/O口电平,I/O的电平状态是不确定的,完全由外部输入决定;如果在该引脚悬空(在无信号输入)的情况下,读取该端口的电平是不确定的。 (接用电压表测量其引脚电压为1点几伏,这是个不确定值) 以用来做KEY识别4 `9 @: f- D9 ^8 d+ k6 u7 i
2 J% D& m2 N0 e) N. b7 I
上拉输入模式# l6 T" W$ J- i6 P  M7 [/ ?

$ T. \, Q$ k6 Q- m% @* t
20190801194218819.png
! a+ U2 v9 ~; a9 j
6 {! c+ |  _0 N8 a* U# d5 W7 O8 f
IO内部接上拉电阻,此时如果IO口外部没有信号输入或者引脚悬空,IO口默认为高电平  如果I/O口输入低电平,那么引脚就为低电平,MCU读取到的就是低电平
$ j% [% u" D# _& \# p" p. r4 S% y: J2 v$ f6 v
STM32的内部上拉是"弱上拉",即通过此上拉输出的电流是很弱的,如要求大电流还是需要外部上拉。
! C% l8 U! W( A. S* g  W
0 C1 U. z5 R+ ~下拉输入模式
+ b" L& q* \* r# @! x  v5 w8 P
2 ^1 j% J: h# Q. m1 @% M
20190801195135782.png
* R* l5 N* j- ]& b; N) m

* y3 N; y- Y" }4 I  O$ r  o' [ IO内部接下拉电阻,此时如果IO口外部没有信号输入或者引脚悬空,IO口默认为低电平  如果I/O口输入高电平,那么引脚就为高电平,MCU读取到的就是高电平% x8 U8 v$ V) t) e$ b( h# y! p
: c. p+ D8 {$ y, H. d
模拟输入模式
! ~$ I( d! }4 ?: e) K& k, c
* |" z% q3 J$ q4 ^
20190801200336884.png

) T  t0 Y% _+ C- I
, T' P" m8 W$ X! I当GPIO引脚用于ADC采集电压的输入通道时,用作"模拟输入"功能,此时信号不经过施密特触发器,直接直接进入ADC模块,并且输入数据寄存器为空 ,CPU不能在输入数据寄存器上读到引脚状态
' [0 @1 S. D+ `0 z2 O3 K( ~; {3 Z5 @8 L( `" E4 S$ l
当GPIO用于模拟功能时,引脚的上、下拉电阻是不起作用的,这个时候即使配置了上拉或下拉模式,也不会影响到模拟信号的输入输出4 h# u* o5 i4 b3 c, G

, ^/ ^" N4 K( v. Y1 u( t除了 ADC 和 DAC 要将 IO 配置为模拟通道之外其他外设功能一律 要配置为复用功能模式,
: |. S$ w0 W7 y$ t: d, C. L  _+ k4 T! o" [1 _& S& X1 l
开漏输出模式(带上拉或者下拉)$ ], [2 Y7 D. }" g5 J0 z

' [8 c4 c$ g9 z: S) s: n' N
20190801205006100.png
( x! t1 D4 W$ [9 W4 e5 x9 J

: n# t) j5 G. `: K4 W3 s$ D6 G3 @1 C5 p5 K* Z7 p+ E
在开漏输出模式时,只有N-MOS管工作,如果我们控制输出为0,低电平,则P-MOS管关闭,N-MOS管导通,使输出低电平,I/O端口的电平就是低电平,若控制输出为1时,高电平,则P-MOS管和N-MOS管都关闭,输出指令就不会起到作用,此时I/O端口的电平就不会由输出的高电平决定,而是由I/O端口外部的上拉或者下拉决定   如果没有上拉或者下拉 IO口就处于悬空状态( c" s8 R: e$ W, X
4 L' I8 K. h/ L0 Q
并且此时施密特触发器是打开的,即输入可用,通过输入数据寄存器GPIOx_IDR可读取I/O的实际状态。,I/O口的电平不一定是输出的电平   
3 U1 B- F$ x: |! f* T2 z. D6 i5 H! F/ l  K2 \! I' a2 p
20190801213632139.png
, n" H# ^- _6 d/ F# s

" c9 N2 h# V; s: `8 K在推挽输出模式时,N-MOS管和P-MOS管都工作,如果我们控制输出为0,低电平,则P-MOS管关闭,N-MOS管导通,使输出低电平,I/O端口的电平就是低电平,若控制输出为1 高电平,则P-MOS管导通N-MOS管关闭,使输出高电平,I/O端口的电平就是高电平,  外部上拉和下拉的作用是控制在没有输出时IO口电平! z: J- o6 M% U! \4 h7 R
: c( M- m1 ]. \1 F: v$ e
此时施密特触发器是打开的,即输入可用,通过输入数据寄存器GPIOx_IDR可读取I/O的实际状态。I/O口的电平一定是输出的电平   
+ H, T' d. S( c  v4 {' P
3 a# J% d% n$ ?" Z5 u# b复用开漏输出(带上拉或者下拉)) z: j& |7 }8 Y# q$ L" q" g/ m& u

2 ~( j9 g- X% O: A8 o* x1 i1 k
20190801214830330.png

7 g/ ]9 |- g  y! t% p7 _1 u5 p, z% `0 g5 l7 s& B5 {2 F2 A* K, U0 u
GPIO复用为其他外设,输出数据寄存器GPIOx_ODR无效;  输出的高低电平的来源于其它外设,施密特触发器打开,输入可用,通过输入数据寄存器可获取I/O实际状态    除了输出信号的来源改变 其他与开漏输出功能相同
7 Y) r8 B$ A' [, ~- A/ g( X8 S
6 D9 g; N( c# m/ A5 b9 Q$ a复用推挽输出(带上拉或者下拉)
! H# S7 y' \5 F& h7 v5 H7 W1 c# H. E  \/ ~" I1 [5 Y' D; Y) R
20190801215400510.png

6 f7 [& e) N, z3 U; n) l  }+ j2 K* G& P1 Q: v0 O. ^) _
GPIO复用为其他外设(如 I2C),输出数据寄存器GPIOx_ODR无效;  输出的高低电平的来源于其它外设,施密特触发器打开,输入可用,通过输入数据寄存器可获取I/O实际状态    除了输出信号的来源改变 其他与开漏输出功能相同
" h- a& Q2 b1 U. D8 n% t
% \* B( l! N, s6 @$ Z+ A: C$ T0 B& ?* I: O  g1 L
开漏输出和推挽输出的区别:
3 M4 H. a: F2 y4 ~. J2 B3 R9 d+ U! ~2 l) o: o! N1 `# [! F. C4 t, D
推挽输出:
/ S+ ~. W, M8 A/ e3 ]+ x3 F% [' U# A* K, O' I- B( m
可以输出强高低电平,连接数字器件 : c* e  y& E' D5 i+ C# O
  z/ o1 K: `1 n* ^
推挽结构一般是指两个三极管分别受两互补信号的控制,总是在一个三极管导通的时候另一个截止.1 x" l! X+ g& k
% h& }0 B! N* y0 _$ U
开漏输出:' X3 y1 E; |4 g6 Y
! n$ {/ V& G+ b1 w
可以输出强低电平,高电平得靠外部电阻拉高。输出端相当于三极管的集电极. 需要外接上拉电阻,才能实现输出高电平  合于做电流型的驱动,其吸收电流的能力相对强(一般20ma以内);
8 s6 q* d% D. g% o  U0 i/ y2 s, ~
4 b" R$ h# D# S4 n在使用任何一种开漏模式时,都需要接上拉电阻,否则只能输出低电平0 J  I) {( g1 ]8 {
, k! e7 L5 B9 z; W
20190802084009482.png

8 b# y3 y" |3 I4 N  l" T4 j7 v  f% n% I% P
推挽输出电路: 其中IN端输出高电平时下面的PNP三极管截止,而上面NPN三极管导通,输出电平VS+;当IN端输出低电平时则恰恰相反,PNP三极管导通,输出和地相连,为低电平   % Z, d( |5 w* j! o+ r7 p
" ?: g# W' _0 z+ \
开漏输出电路:IN端输出低电平时,三极管导通,使输出接地,IN端输出高电平时,三极管截止,所以引脚既不输出高电平,也不输出低电平,为高阻态。为正常使用时必须接上拉电阻,
: g7 Z$ G5 L2 e( }* x
# I5 X+ ]+ L+ ?6 X" X在STM32中选用IO模式:
7 h  d2 s, g( q; P, h2 @" {( w' q8 Z
上拉输入、下拉输入可以用来检测外部信号;例如,按键等;
( t. R) l" C2 L3 P" y模拟输入 ——应用ADC模拟输入,或者低功耗下省电% I- E# z: I" U9 s
开漏输出一般应用在I2C、SMBUS通讯等需要"线与"功能的总线电路中。
, I% X: H9 G* D: D 推挽输出模式一般应用在输出电平为0和3.3伏而且需要高速切换开关状态的场合。在STM32的应用中,除了必须用开漏模式的场合,我们都习惯使用推挽输出模式。$ r  p) F3 w1 [4 C
复用功能的推挽输出_AF_PP ——片内外设功能(I2C的SCL,SDA)
" o+ {% ?2 T5 w9 U* D+ v复用功能的开漏输出_AF_OD——片内外设功能(TX1,MOSI,MISO.SCK.SS)
  S: W! L! G( b/ k3 r  N8 l. UF4系列与F1系列区别:
* A( w% V" n! i  Y) m' D" u本质上的区别是F4系列采用了Cortex-M4内核  而F1系列采用Cortex-M3内核) s+ B) J# B2 V5 M8 V* F

6 G5 \- ]9 o0 P( Y% XF1系列(M3)IO口基本结构:
9 z/ ]8 E* E  A% ?
+ K9 e' F" c2 E
20190801221426325.png

, ^. L1 W! |* F& B8 O! T! d$ D: F" h" B5 B% V. ?/ x# x
F4系列(M4)IO口基本结构:

- r% U5 t, x7 n2 c
( y# |4 w4 k/ }& b. @
20190801221500464.png
1 F& {  u% z! Y

+ T! q, S, z$ u$ U, ~  pF4系列设计的更加高级与人性化,他将外部上下拉电阻转移到了输出/输入驱动器外部,使得输出模式下也可以实现内部上拉与下拉,方便了用户的使用,增加了灵活性
: G( F$ t  ^9 `; }( j* {, ^' |) `, }
GPIO的初始化(F4)
# \8 F. \* \5 w  Z这里我们以初始化LED为例" r; c1 _! J  n+ I

: ]' |7 b5 _/ F0 c/ Z( q1.定义一个 GPIO_InitTypeDef 类型的结构体
! U) t' M4 Q2 G) M- k4 |0 X" S# }5 {( Y: x- J
  1. GPIO_InitTypeDef GPIO_InitStructure;   /*定义一个 GPIO_InitTypeDef 类型的结构体*/
复制代码
一共有5个参数
7 }! T5 y8 b5 u! A9 l/ b1 h, a9 G: e$ w$ w! S6 _/ Z( R
20190802082555844.png
( J7 Y* \/ h4 K6 B) `. c' S9 f

7 P  X& k' V9 R3 t2 |6 J* D* C; [& W- x' ^# F
  h' N( T8 U' ^6 Z9 G6 v
2开启 LED 相关的 GPIO 外设时钟
$ H, ~# W$ ~  A) c* A7 y8 f" G  [6 a
  1. RCC_AHB1PeriphClockCmd ( RCC_AHB1Periph_GPIOB, ENABLE);     /*开启 AHB1时钟*/
复制代码
# d) f1 S, Q& Q" o# N5 ?
   Q:为什么要设置时钟?2 D2 Q& U. q/ L

$ J% [% ]0 U; \" E% x    任何外设都需要时钟,51单片机,stm32,430等等,因为寄存器是由D触发器组成的,往触发器里面写东西,前提条件是有时钟输入。stm32是低功耗,他将所有的门都默认设置为disable(不使能),在你需要用哪个门的时候,开哪个门就可以,也就是说用到什么外设,只要打开对应外设的时钟就可以,   其他的没用到的可以还是disable(不使能),这样耗能就会减少。9 q: S: R/ N+ w$ E% b3 q

& j" C  u( R$ t% A0 qQ:为什么 STM32 要有多个时钟源呢?
) f3 y5 C# @5 w7 u3 r# m! D* S+ L  m. |0 _, P/ i
因为首 先 STM32 本身非常复杂,外设非常的多,但是并不是所有外设都需要系统时钟这么高的频率, 比如看门狗以及 RTC 只需要几十 k 的时钟即可。同一个电路,时钟越快功耗越大,同时抗电磁 干扰能力也会越弱,所以对于较为复杂的 MCU 一般都是采取多时钟源的方法来解决这些问题。  @; q) n7 S1 F1 d: [

" F, a1 y7 m" n: m6 @$ A& D8 K
) q3 A: |9 d# U- n+ J而相对应的外设功能所使用的时钟 在stm32f4xx.h 中即可查看到
) P4 b1 \# c& l( E' A# W" z
$ B% v% z- l! Z7 f" R+ |RCC_AHB1
9 q! j/ H& d- `) F  V) W$ \0 G, X
, v  }, c2 b% t" k
20190802093032688.png

# u: K2 V( |2 c1 ~: c% ^( _5 \' n
RCC_APB1& G! X5 Z: p$ ^

( t2 e/ o% z6 s6 @) y
20190802093048325.png
1 n  f6 S* Y* d) g& ?8 Q" B9 O
9 j, t9 q; j  i6 d- T! Z
3选择要控制的 GPIO 引脚( w( c! }& E% i% ~

/ D" ^; @2 Z& Z% b) Q
  1. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;  /*选择Pin9引脚*/
    ) n; R6 N7 \: c0 ~+ N2 N
复制代码
' B) [1 C% [7 O: j; L' F
可选引脚为0-15 一组IO口有16个引脚, A0 c; a/ v) p$ r7 U

9 S$ @+ z# S2 E. {3 K
2019080122332587.png

" D+ ?/ l+ ?5 R- k9 F+ D* @# Z
; v% G# `1 A. B4设置所选引脚的模式
( y# g  _# u( d0 g
  1. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;   /*设定为输出模式*/
复制代码
& C0 Z: _0 F6 v8 {
引脚的模式共有四种,分别为输入,输出,复用,和模拟模式
/ Y+ k2 _3 Y* ^- o' U( \+ J/ O* r. i! a- ]5 }
2019080209031850.png

7 m( J, h+ V& a  |3 o* M4 x7 A( ?
& H* C+ f* d, t. J$ `+ l" x' L) C7 C0 e) J  k  R) _: ?
5 设定所选引脚的输出类型3 l; n/ T& k3 o% F. x8 @
8 \. Q0 \) F6 A: ]
  1. GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; /*设置引脚的输出类型为推挽输出*/
复制代码

5 R: G1 o. {+ Q输出模式有两种:推挽输出和开漏输出   4 |$ J& o' k( `5 p
3 K( n$ {- P' g5 Z
3 S8 v( R4 [- o' [1 v

* v4 J. l  B3 [8 |! q9 }: q3 l1 n5 |只有输出模式才需要配置,输入模式下不需要配置
6 `  H7 s" P1 R
  K- ?3 M6 p% s  e  C6 设定所选管脚的速度
1 e# V$ a( h/ I
* C3 B. X4 r4 r6 ?- A* V
  1. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//设定速度为100MHz  高速模式
复制代码
/ B" Z, |8 ~4 e/ Q( u
2019080209104520.png
8 y6 D) z" R# l/ \3 `

. F5 W$ f7 i' K) {) f% G  q9 F3 v% V( F3 V
7 设定所选管脚的上拉与下拉# W( O, @! C2 ]2 Q

; l1 g  d/ A9 n3 r0 _
  1. GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; /*设置引脚为上拉模式*/
复制代码
0 l: ]& k6 L) l3 v  x- v
可设置为:上拉,下拉,与浮空( [) e: A4 U/ p5 a# h
4 u1 l$ z" O4 u5 a- m
20190802091352838.png
, k1 l  o: `6 _! R2 M. D9 P9 d

7 u' Y6 j, S8 ?. Q" r* N8初始化GPIO" z1 T- O& Y' _( i/ [; G

* ]7 R3 Y, p0 b7 i
  1. GPIO_Init(GPIOB, &GPIO_InitStructure);    //初始化所设置的引脚
复制代码
  \; |' v- y: ]# S
GPIO_Init() 是官方配置的初始化函数  第一个参数是GPIOX 第二个参数是结构体所对应GPIO各种参数的配置5 r" F8 I  f; N/ G5 _0 Q/ g' o
3 v/ n7 U8 g( b/ }9 o- E4 H* I
GPIO的初始化(F1)
2 q! ~+ E9 R2 X. d. |$ wF4的初始化相较于F1系列有了很大的改变,在配置F1系列时,结构体只有三个参数  
, s* Q  M% s+ N6 _; ?$ b( |' m
8 P6 ~( I* l# o. f' ~" L" s GPIO_InitTypeDef 类型的结构体+ z, C' @% O1 j- `3 G; m' E

7 `1 Q) c" C- }; P2 p! ~
20190802093751960.png

  I. M8 W& m6 G( c9 j
9 p4 s# f' {( }4 c0 A* M5 s" @所选管脚的速度
) E( K& g; [. H& k* [6 ?$ S; e) ~, B! |4 V
20190802093918542.png

0 Y) \( ]: J$ H; u" h5 _3 D
0 d4 s9 ^; Q1 M# H所选管脚的8种模式
3 d, i. u% Z$ C; o  ]+ I: d# P1 R  Z  D$ r2 Z! r4 R0 b+ s
20190802094236801.png
; s2 M/ B5 }  ~0 M' ?$ R

- M) P2 o& ?, K: y  B( u区别:
: n* j9 N3 h2 {3 n# N
! x3 K1 \7 y: r F1(M-3)系列管脚速度只有三种模式  并且管脚的模式配置八种模式全部都在一起定义,直接设置即可
1 V3 A2 y3 \+ L& v. P3 F- L
3 t; B1 f( B* _8 V总归还是大同小异,不做过多介绍,看下下方配置即可
6 j: E" R# u% S9 z/ f& @: M5 l& T& E) o& q" n# R
  1. void led_init(void)9 N. s+ `, i! D& E. x- ]: B
  2. {
    5 F0 T7 y- n: U$ A- D  [4 [( Y! P
  3.         GPIO_InitTypeDef GPIO_InitStruct;                    //定义初始化结构体
    * N( s0 Y' V' d7 ^( \8 H
  4.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); //使能GPIOA时钟
    * [% z$ X, l* @1 O. U& i/ q$ `
  5.         0 G- k2 j' h" n1 Y. u6 g5 l) {
  6.         GPIO_InitStruct.GPIO_Mode    = GPIO_Mode_Out_PP;     //配置模式
    8 N8 B1 {; n; m5 S. g6 d; w- F8 Z+ w% @
  7.         GPIO_InitStruct.GPIO_Pin     = GPIO_Pin_0;           //配置哪个IO口
    . h9 U' v" H) B1 \+ w
  8.         GPIO_InitStruct.GPIO_Speed   = GPIO_Speed_50MHz;     //配置IO口速度,仅输出有效& E; o' K( W& [8 H' B
  9.         GPIO_Init(GPIOA,&GPIO_InitStruct);                   //初始化GPIOA的参数为以上结构体
    * K- N; `7 i  n
  10. }
复制代码
' z$ }9 i0 u; }  i$ v( P  A1 Y2 \

, ^  g  f" [! D
' r5 d7 }0 F, w- d7 t* I; B6 M& u" p4 ~. o2 J; x
20190802090723845.png
收藏 评论0 发布时间:2021-12-6 10:37

举报

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