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

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

[复制链接]
STMCU小助手 发布时间:2021-12-6 10:37
1 GPIO简介
$ N$ c3 x. s5 `$ ~( J: w, FGPIO,即通用I/O(输入/输出)端口,是STM32可控制的引脚。STM32芯片的GPIO引脚与外部设备连接起来,可实现与外部通讯、控制外部硬件或者采集外部硬件数据的功能。
; e6 K- l# `4 D3 F! r8 b* O" T" K& o1 C
STM32F407有7组IO。分别为GPIOA~GPIOG,每组IO有16个IO口,共有112个IO口  通常称为 PAx、PBx、PCx、PDx、PEx、PFx、PGx,其中x为0-15。  并且F4系列是基于Cortex-M4内核  # e0 s& ?( a4 S; {+ R; }# y+ M

4 N2 ^4 O0 r/ u0 F. [4 U0 R) i; Q/ JGPIO的复用:
0 I* g: K, ^% r) R7 b
3 u2 ~4 b, G6 ~/ P! y  \STM32F4 有很多的内置外设,这些外设的外部引脚都是与 GPIO 共用的。也就是说,一个引脚可以有很多作用,但是默认为IO口,如果想使用一个 GPIO内置外设的功能引脚,就需要GPIO的复用,那么当这个 GPIO 作为内置外设使用的时候,就叫做复用。    比如说串口  就是GPIO复用为串口
8 Y, Y( n* w) o  y& O1 H7 H! ~, f7 b2 D! H5 \" P
2 GPIO的工作模式4 ^2 D! _) h  Q* s+ \) J
1、4种输入模式3 X% o! a! ?, a) e, o* `0 @
(1)GPIO_Mode_IN_FLOATING 浮空输入. ~) I8 O$ t& ?; F( ]
(2)GPIO_Mode_IPU 上拉输入7 w  F8 B. m5 j
(3)GPIO_Mode_IPD 下拉输入
. S( r6 u2 A( n3 ?/ o5 v(4)GPIO_Mode_AIN 模拟输入
8 G) S* G1 s7 Z8 W: [: c: ?# Q. A: }  x7 Y% f
2、4种输出模式 8 ~/ T  s. x/ V7 _4 J
(5)GPIO_Mode_Out_OD 开漏输出(带上拉或者下拉)
  K& x- r5 t) Z# C" k6 L, e0 n(6)GPIO_Mode_AF_OD 复用开漏输出(带上拉或者下拉)
: \" y0 J2 s: s: J/ j  N6 D0 J(7)GPIO_Mode_Out_PP 推挽输出(带上拉或者下拉): v/ O+ J) U  t, I
(8)GPIO_Mode_AF_PP 复用推挽输出(带上拉或者下拉)
5 i1 Q8 m7 d, L1 k( }2 }  C7 c, {9 O" `8 z$ N6 h) _* v) s  u. i5 t
3、4种最大输出速度
5 ?9 e' {7 [) B, z/ z(1)2MHZ  (低速)$ _2 j7 j# V( l9 R/ ^
(2)25MHZ  (中速)8 {5 @0 \1 |7 q& q4 D/ c8 J2 C+ O, h
(3)50MHZ  (快速)7 F+ o1 j* O4 ~& i
(4)100MHZ  (高速)
6 Q; S% P. T9 n9 E1 h" l4 k
) }& u4 T4 O( {" p关于他们的定义,都在  stm32f4xx_gpio.h 中,都为结构体形式的定义
7 w& d' }, E; S2 _1 D, A/ V. x- p. X3 `1 v! _# M! M/ B
3 GPIO框图剖析
7 z9 l* ]% d) u1 G5 `' ], r/ r. f6 F) ^& G3 O. |! y) c
20190801161834709.png
" Q9 Y# W' M4 ?9 h1 b
" j! @$ r% \# f
我们所用到的每一个GPIO其内部结构都是这样,分别对应着GPIO的八种模式  这里我们简单的介绍下:* L2 Z% G3 I  v9 ?9 |% L% c3 A0 p
% M) W5 i6 X- y
保护二极管:  IO引脚上下两边两个二极管用于防止引脚外部过高、过低的电压输入,当引脚电压高于VDD_FT时,上方的二极管导通,当引脚电压低于VSS时,下方的二极管导通,防止不正常电压引入芯片导致芯片烧毁
6 q  Y. }  F2 ]/ _" Y6 _上拉、下拉电阻:控制引脚默认状态的电压,开启上拉的时候引脚默认电压为高电平,开启下拉的时候引脚默认电压为低电平) V( n" w7 w6 @0 Y; S
TTL施密特触发器:基本原理是当输入电压高于正向阈值电压,输出为高;当输入电压低于负向阈值电压,输出为低;IO口信号经过触发器后,模拟信号转化为0和1的数字信号    也就是高低电平  并且是TTL电平协议   这也是为什么STM32是TTL电平协议的原因
! _$ w2 k! x$ @7 } P-MOS管和N-MOS管:信号由P-MOS管和N-MOS管,依据两个MOS管的工作方式,使得GPIO具有“推挽输出”和“开漏输出”的模式     P-MOS管高电平导通,低电平关闭,下方的N-MOS低电平导通,高电平关闭& e( p2 K/ T$ l' i
注:  VDD_FT  代表IO口,兼容3.3V和5V,如果没有标注“FT”,就代表着不兼容5V      4 _. t% e) W: T( f9 U1 I# w

$ P1 ]) ?6 Y8 G! V! M1 ?# O% ` 在芯片数据手册的引脚定义中,会看到有“I/O电平”一列  有FT即为支持5V9 z6 w/ U' Y2 D* K" z# u
3 ?3 J, v  L+ d) ~+ b
20190801175317972.png

/ R0 a  u- n5 _# i8 V1 M
/ T: k$ E3 e8 V2 Z" L; ]6 z4 GPIO的八种工作模式剖析:6 v; R4 w! y1 E, g( y/ ^! g
浮空输入模式, T- R+ r# T1 t" ]  y! s8 X3 w
9 P# ~" \9 Q. b, y7 |  F8 A
20190801191842465.png
5 |$ R. e- x- G) \  v+ r
! j+ [, S% N" d/ u# e: J1 s
浮空输入模式下,I/O端口的电平信号直接进入输入数据寄存器。MCU直接读取I/O口电平,I/O的电平状态是不确定的,完全由外部输入决定;如果在该引脚悬空(在无信号输入)的情况下,读取该端口的电平是不确定的。 (接用电压表测量其引脚电压为1点几伏,这是个不确定值) 以用来做KEY识别
& P  D# {" a7 c) `* E3 [: S( O
6 [. N. J# K) j* J, N上拉输入模式
; e* W* W$ F& x; W8 |2 f6 c4 \) d; |1 w
20190801194218819.png
3 u% S6 j% j- S) _

* o% ?% q! V! D' ^& h% o IO内部接上拉电阻,此时如果IO口外部没有信号输入或者引脚悬空,IO口默认为高电平  如果I/O口输入低电平,那么引脚就为低电平,MCU读取到的就是低电平  ?$ M9 L) ^: @( S' Y5 e2 h; r
4 ]& D" {5 |! A) h
STM32的内部上拉是"弱上拉",即通过此上拉输出的电流是很弱的,如要求大电流还是需要外部上拉。8 M# f0 Q0 {6 h- F  z

1 I0 n' F) ?- I: @. H( g4 t下拉输入模式( c" A0 o9 U- ]* R( i
1 c" o& S1 s- H
20190801195135782.png

6 s! e3 @# u9 \) |6 r/ x0 T0 v4 h- [( }
IO内部接下拉电阻,此时如果IO口外部没有信号输入或者引脚悬空,IO口默认为低电平  如果I/O口输入高电平,那么引脚就为高电平,MCU读取到的就是高电平
( i  o4 x  U4 Y6 s; ~* ]! j
9 W$ r, Z2 v3 [0 R; V% Q模拟输入模式& p# ~( N( m; e5 K( W0 y1 S; f/ P. w' b

" V2 r4 w$ z  ~
20190801200336884.png
& O1 |' k# r6 Q+ G) s
: ?( L5 Z6 @5 {9 \- U- p
当GPIO引脚用于ADC采集电压的输入通道时,用作"模拟输入"功能,此时信号不经过施密特触发器,直接直接进入ADC模块,并且输入数据寄存器为空 ,CPU不能在输入数据寄存器上读到引脚状态
/ X2 |3 M. L# a
* M1 Q* v( X; [# i当GPIO用于模拟功能时,引脚的上、下拉电阻是不起作用的,这个时候即使配置了上拉或下拉模式,也不会影响到模拟信号的输入输出
3 z& X2 Q: w3 P$ r; a- H0 K! A
$ e3 @( ~, W/ B9 h5 h除了 ADC 和 DAC 要将 IO 配置为模拟通道之外其他外设功能一律 要配置为复用功能模式,; i# E5 x6 m( v5 l% d+ _
, U1 r7 k. Y" w$ ]" |! E. @
开漏输出模式(带上拉或者下拉)" w& M8 k) [2 K3 ~  w. ?3 b3 _0 B# |/ Y

- j9 l& M# a+ b4 \8 U
20190801205006100.png
8 d+ P/ O8 i& F$ r6 [( @) {0 l

) ?: f% k3 m* W' W- o1 Q4 a% |: _# `
在开漏输出模式时,只有N-MOS管工作,如果我们控制输出为0,低电平,则P-MOS管关闭,N-MOS管导通,使输出低电平,I/O端口的电平就是低电平,若控制输出为1时,高电平,则P-MOS管和N-MOS管都关闭,输出指令就不会起到作用,此时I/O端口的电平就不会由输出的高电平决定,而是由I/O端口外部的上拉或者下拉决定   如果没有上拉或者下拉 IO口就处于悬空状态6 w! t% N% D; H2 b- x, T
' H- W+ w$ C; o" g' K! R
并且此时施密特触发器是打开的,即输入可用,通过输入数据寄存器GPIOx_IDR可读取I/O的实际状态。,I/O口的电平不一定是输出的电平   
0 r' f/ X$ w; E; T1 M; t3 y- P8 l3 ]) o, Q
20190801213632139.png
9 Y" q. `& x: g& t

4 l6 N7 {; ^1 ]' U, l4 d在推挽输出模式时,N-MOS管和P-MOS管都工作,如果我们控制输出为0,低电平,则P-MOS管关闭,N-MOS管导通,使输出低电平,I/O端口的电平就是低电平,若控制输出为1 高电平,则P-MOS管导通N-MOS管关闭,使输出高电平,I/O端口的电平就是高电平,  外部上拉和下拉的作用是控制在没有输出时IO口电平; a7 x' Y/ G' K: Q

- K, M! S; b9 J' Q此时施密特触发器是打开的,即输入可用,通过输入数据寄存器GPIOx_IDR可读取I/O的实际状态。I/O口的电平一定是输出的电平   
/ W* o8 g5 N3 W% ~1 w8 M8 n# p( X8 y1 b- o( b9 h
复用开漏输出(带上拉或者下拉)# b6 ~  ~- ^, Q8 O* V

8 m, t/ h1 P5 \, Z) ^, a' \
20190801214830330.png
+ F/ J6 V$ L0 L2 A9 \
/ ^* Z- Q1 Q/ d& s# W
GPIO复用为其他外设,输出数据寄存器GPIOx_ODR无效;  输出的高低电平的来源于其它外设,施密特触发器打开,输入可用,通过输入数据寄存器可获取I/O实际状态    除了输出信号的来源改变 其他与开漏输出功能相同
; u8 x' t- q1 A7 ~: m% n, g2 y8 Q( U" d2 Y* c! u& k( R
复用推挽输出(带上拉或者下拉)
  C  o2 T  Z7 k% N- |  s$ U# d9 ?) a9 o0 r
20190801215400510.png
. M2 f+ v( |$ h1 v  Y  h

+ ~6 {/ y& _  o, ~7 R2 H. CGPIO复用为其他外设(如 I2C),输出数据寄存器GPIOx_ODR无效;  输出的高低电平的来源于其它外设,施密特触发器打开,输入可用,通过输入数据寄存器可获取I/O实际状态    除了输出信号的来源改变 其他与开漏输出功能相同+ z8 Z( `! _9 |& E  s1 }: V4 E2 `
. N1 B. N4 B$ E0 @+ f; Z
) E% w# Z$ Z- l( i. P# {% s
开漏输出和推挽输出的区别:
3 }* ?/ i- F5 c- M# t2 F7 ?! t8 d9 e1 x: m) l0 i, `+ r* L8 l% G, D
推挽输出:. W# ^+ e; k! D" l- d$ C
7 a3 G# E7 p- h6 K
可以输出强高低电平,连接数字器件
9 e6 {3 b5 W1 b' @$ R4 p, z9 B5 e
" H( ]7 O9 ^& Q% W推挽结构一般是指两个三极管分别受两互补信号的控制,总是在一个三极管导通的时候另一个截止.
0 q: S* @+ o& G4 W9 ?6 @
1 R0 S, H; I3 j5 o* P( X开漏输出:
+ X( j% M  e& L/ s  K
; T/ n: h# V. \0 H/ c) X可以输出强低电平,高电平得靠外部电阻拉高。输出端相当于三极管的集电极. 需要外接上拉电阻,才能实现输出高电平  合于做电流型的驱动,其吸收电流的能力相对强(一般20ma以内);
% W8 H& [/ G4 u" ]$ ?) M4 q. }8 K& \% C
在使用任何一种开漏模式时,都需要接上拉电阻,否则只能输出低电平! ^0 z! c% {+ l
7 }. ?, I! C% W8 F1 {8 J/ @  ]
20190802084009482.png
" I+ c; b2 X1 J4 ~

% d3 {" m6 L( \% g% G! X" R推挽输出电路: 其中IN端输出高电平时下面的PNP三极管截止,而上面NPN三极管导通,输出电平VS+;当IN端输出低电平时则恰恰相反,PNP三极管导通,输出和地相连,为低电平   . f" z# f# I4 }% K- i

5 ~% B) k% [% r/ M, V  [& y5 t  R8 S; I开漏输出电路:IN端输出低电平时,三极管导通,使输出接地,IN端输出高电平时,三极管截止,所以引脚既不输出高电平,也不输出低电平,为高阻态。为正常使用时必须接上拉电阻,
% ]: G: d6 s0 ~- j! Z0 ~, U" I# v7 E6 `4 l% x
在STM32中选用IO模式:
. i* {9 J. J. v/ r. i+ J) A
+ m/ H+ F% f$ q4 y 上拉输入、下拉输入可以用来检测外部信号;例如,按键等;
% Q9 ~8 i) ~; ^# Y0 H+ H模拟输入 ——应用ADC模拟输入,或者低功耗下省电
- P5 [# \5 a& @2 z开漏输出一般应用在I2C、SMBUS通讯等需要"线与"功能的总线电路中。
9 j7 \# E3 E' A1 } 推挽输出模式一般应用在输出电平为0和3.3伏而且需要高速切换开关状态的场合。在STM32的应用中,除了必须用开漏模式的场合,我们都习惯使用推挽输出模式。+ b6 Z3 }' X% I) b4 `! h1 k$ d5 A
复用功能的推挽输出_AF_PP ——片内外设功能(I2C的SCL,SDA)
( Z4 ~9 {) _* H. u" Z复用功能的开漏输出_AF_OD——片内外设功能(TX1,MOSI,MISO.SCK.SS)  |! u8 |8 _* ?8 n* ^
F4系列与F1系列区别:8 z  |5 I: f1 M
本质上的区别是F4系列采用了Cortex-M4内核  而F1系列采用Cortex-M3内核- h) W0 J. W  `: I1 s( T! k3 T3 h$ m- Y
7 H; O9 e9 F, a/ {$ _! c2 t
F1系列(M3)IO口基本结构:
6 A! }$ W: [3 G* M  s# k+ B% U
( ?! j  {1 F& l7 W* J
20190801221426325.png

0 r* o1 N5 j5 G$ ]& K7 n, M
2 N$ A6 g" V/ K2 y0 K8 p% w! ^+ sF4系列(M4)IO口基本结构:

  L8 Q4 U) d( j+ f7 `- A) g' `& u: s2 v
20190801221500464.png

' b* T- P: h# _) J* }
7 W) K6 O* d+ T, l: J& YF4系列设计的更加高级与人性化,他将外部上下拉电阻转移到了输出/输入驱动器外部,使得输出模式下也可以实现内部上拉与下拉,方便了用户的使用,增加了灵活性7 u- q- f( q( f( L! q/ }

4 L# ~- N( D: o4 H4 FGPIO的初始化(F4)
' y9 @: ?) u- V: C/ ?/ S这里我们以初始化LED为例- q7 c" `2 O2 F- {

# w5 ]1 f% x8 ^+ \% B- j6 N& k- \& G* q1.定义一个 GPIO_InitTypeDef 类型的结构体8 J9 _5 z2 s# b6 A

6 T& Y( S/ }- y- P# @, r- r& Q
  1. GPIO_InitTypeDef GPIO_InitStructure;   /*定义一个 GPIO_InitTypeDef 类型的结构体*/
复制代码
一共有5个参数
, c2 ^6 ]3 S6 z( G
" X* Q8 X! Z; d1 Z2 s( C) e
20190802082555844.png

: f# S4 X- d2 y; z- w, \" @6 F/ b; s- j0 I/ t' z/ O0 T) \- i% Z5 C* h

* _9 G' F/ w6 ?
+ n" V& o# s! g. T& }2开启 LED 相关的 GPIO 外设时钟7 X9 C' h9 Q4 T( X  Y

$ k9 R6 J# _+ c2 k! I" ?
  1. RCC_AHB1PeriphClockCmd ( RCC_AHB1Periph_GPIOB, ENABLE);     /*开启 AHB1时钟*/
复制代码

( s+ [0 p$ j- y  E/ v' f3 A% C5 o/ p   Q:为什么要设置时钟?, O3 O3 M$ R3 ~! I) X# r

5 b9 z3 ~) x( c" t4 Z. d6 l+ u; E. c    任何外设都需要时钟,51单片机,stm32,430等等,因为寄存器是由D触发器组成的,往触发器里面写东西,前提条件是有时钟输入。stm32是低功耗,他将所有的门都默认设置为disable(不使能),在你需要用哪个门的时候,开哪个门就可以,也就是说用到什么外设,只要打开对应外设的时钟就可以,   其他的没用到的可以还是disable(不使能),这样耗能就会减少。
: `; c0 Y, l2 ^) u' O$ E# h5 o0 v4 k
Q:为什么 STM32 要有多个时钟源呢?1 K! H! H  J3 c+ ]" H% j! z
0 \/ r2 o) c- d. z$ w* W( T- x  ~
因为首 先 STM32 本身非常复杂,外设非常的多,但是并不是所有外设都需要系统时钟这么高的频率, 比如看门狗以及 RTC 只需要几十 k 的时钟即可。同一个电路,时钟越快功耗越大,同时抗电磁 干扰能力也会越弱,所以对于较为复杂的 MCU 一般都是采取多时钟源的方法来解决这些问题。) S6 i0 I6 m" |( j: C
+ {, C9 {. w7 I8 p. X* j4 f' w+ _
3 V- V" ~; M" }0 r4 Y
而相对应的外设功能所使用的时钟 在stm32f4xx.h 中即可查看到  s" g3 V: ?7 G

3 s8 |  L! i7 D/ L) v) ?! BRCC_AHB1/ z2 M8 [# Q0 n! h" t/ h4 {
$ D0 n  w5 t; T8 A" @# d! H3 U
20190802093032688.png
; H7 r. p) y6 L& X* }9 p5 s! x

+ j6 A9 Y- x7 W3 G8 h9 c* bRCC_APB1
) |* _- p3 P* D5 D6 q. c, `( J8 T# f1 O# J$ }
20190802093048325.png
2 c/ @) F. b% I0 l+ y. w0 |
* w: r, g; I5 ?9 a6 F6 ^1 V* ]
3选择要控制的 GPIO 引脚6 u; l9 X) @0 ?; W' g

! G; [+ C5 ^4 _
  1. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;  /*选择Pin9引脚*/' Z3 b! z* Q" r; {9 [6 n5 \
复制代码

' P# A1 h6 l) A( n) ^5 E8 b8 P可选引脚为0-15 一组IO口有16个引脚0 Z! S6 ~4 ~6 L- p6 Z* D

5 G+ O$ M" f1 l: D- M/ z
2019080122332587.png

) |0 {0 N: _) w
* [* i" r1 q; R  K& ~' w4设置所选引脚的模式
# P) k+ c- S+ L! j. I' q( N
  1. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;   /*设定为输出模式*/
复制代码

+ u0 G+ P! `; ~+ x7 J引脚的模式共有四种,分别为输入,输出,复用,和模拟模式7 G$ I5 q- O6 J$ g
+ x" U+ m5 g  D
2019080209031850.png
" Y) d$ f* a! o& m" q: ^5 S- Q
- `2 h# O- H6 q% A5 G$ G0 u

2 G& c' X0 D+ }5 设定所选引脚的输出类型+ G9 p/ ?6 ?+ X* @
2 }- \! c" t4 {1 ?- N
  1. GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; /*设置引脚的输出类型为推挽输出*/
复制代码
4 [2 i0 E- d4 Z. ?4 N
输出模式有两种:推挽输出和开漏输出   
3 E! [5 W5 w5 `! ]
( k, D5 P. o( R
0 o7 z3 X/ x5 S, w1 R4 o
! o* s$ I& ~- I. {
只有输出模式才需要配置,输入模式下不需要配置
- e% T3 x1 B) f) [3 l( i- @! V! n' }; Y1 Y) m+ J6 I. d
6 设定所选管脚的速度# F- n7 d: e  P5 Y& L- w5 f
# Y" q! R; E2 \& a
  1. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//设定速度为100MHz  高速模式
复制代码

9 b- e. x6 z. x; Y* Y
2019080209104520.png

+ X' Q. R$ r) g$ c) a# P3 Z* E
2 u) \! X7 p/ f+ n1 q. e" \6 M9 O8 @* t( \( S. l' D
7 设定所选管脚的上拉与下拉
3 \% h5 V/ R0 o8 d% ^  U
% H; r# F9 J4 I5 \* F
  1. GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; /*设置引脚为上拉模式*/
复制代码
4 H) x; Z. |: U7 d0 c( M4 L8 U
可设置为:上拉,下拉,与浮空, l: u! X8 Y* n. n) ~

9 D* ]8 A( r8 k5 \9 f1 k
20190802091352838.png

6 j! x( ]9 ^; h6 M) s# ?3 p' @" C! c+ _4 v) ^3 ]; a/ t" h+ R
8初始化GPIO3 D& Y6 V+ U' m

, p0 _  U  \5 V* s  \' Y
  1. GPIO_Init(GPIOB, &GPIO_InitStructure);    //初始化所设置的引脚
复制代码
4 M. J; \: w5 g+ p; C
GPIO_Init() 是官方配置的初始化函数  第一个参数是GPIOX 第二个参数是结构体所对应GPIO各种参数的配置
2 d: ^1 d2 D) V9 p3 R5 o
) R5 f* x9 S1 }GPIO的初始化(F1)
% e7 c" V9 Y( g" D3 K* zF4的初始化相较于F1系列有了很大的改变,在配置F1系列时,结构体只有三个参数  8 y+ e! Y1 @" U3 v3 n1 I8 z6 M

5 D  s* G0 o$ O# H& ^3 L GPIO_InitTypeDef 类型的结构体3 `2 j4 U' G9 Z1 V+ I) W& T4 k! Y
2 x" Y) H5 I1 `  ?% ~
20190802093751960.png
+ H: q  `/ ]' ?; [

+ d( R9 ?* |5 D1 V$ W所选管脚的速度! j- F0 q0 n. m; ~7 t5 P' X" V
( I7 b2 ^2 p3 b9 \
20190802093918542.png

. R0 f9 W" j) F; c$ o
. Y. [9 ?- _3 ^3 I7 g所选管脚的8种模式
+ v& P' D. J9 n! L9 g( z% A
9 W1 j5 r/ v' R4 _6 M5 M( h& n  ?
20190802094236801.png
5 F- H, v* f7 ?4 x

' j* B! w* e" |5 x# u  M1 ?区别:
% b0 P8 D+ M% T4 Q! o, Q8 R& v8 \: S& ^9 F  @, M& C
F1(M-3)系列管脚速度只有三种模式  并且管脚的模式配置八种模式全部都在一起定义,直接设置即可2 S) {# d9 L% N/ G9 A( d( E# Q

% U9 \1 w0 T, x总归还是大同小异,不做过多介绍,看下下方配置即可
& k- p) \) k; L  V' w& p7 ^
" p) S! L4 d, P3 X, s* b9 T
  1. void led_init(void)
    ( z/ m5 f- D( W; \2 X5 c
  2. {3 F+ o3 a2 b. W- e0 M
  3.         GPIO_InitTypeDef GPIO_InitStruct;                    //定义初始化结构体1 c- @) m; u+ j+ {; Z; D# q0 W+ Q
  4.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); //使能GPIOA时钟- r( ~9 V" f/ Z& F- f# w' V& @
  5.         , A2 b/ z* W8 }" Q: V) J' f* Y
  6.         GPIO_InitStruct.GPIO_Mode    = GPIO_Mode_Out_PP;     //配置模式
    8 A, P2 B2 P2 X
  7.         GPIO_InitStruct.GPIO_Pin     = GPIO_Pin_0;           //配置哪个IO口* ?. D, V6 M' `/ m
  8.         GPIO_InitStruct.GPIO_Speed   = GPIO_Speed_50MHz;     //配置IO口速度,仅输出有效9 S' U. x) ^: n
  9.         GPIO_Init(GPIOA,&GPIO_InitStruct);                   //初始化GPIOA的参数为以上结构体  s8 \" a' V2 _* s
  10. }
复制代码
- r- R" b3 @; M8 J; h/ J: B/ T

& k; C! t( ~/ U1 z$ b6 y4 d* v8 D0 \( ]3 y- N

0 K0 G: U7 d  U
20190802090723845.png
收藏 评论0 发布时间:2021-12-6 10:37

举报

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