1、GPIO介绍
1 M/ O* X1 V9 {* d5 F6 jSTM32F0x1/STM32F0x2/STM32F0x8系列每个通用I/O口都有4个32位配置寄存器(GPIOx_MODER, GPIOx_OTYPER, GPIOx_OSPEEDR 和 GPIOx_PUPDR),2个32位数据寄存器(GPIOx_IDR and GPIOx_ODR)和 1 个32位置位 / 复位寄存器 (GPIOx_BSRR)。GPIOA 和GPIOB 还含有 1 个 32 位锁定寄存器 (GPIOx_LCKR) 和 2 个 32 位替代功能寄存器 (GPIOx_AFRH and GPIOx_AFRL)' b. t+ A+ h0 B$ b6 a0 N
' f X W5 E; x8 z5 j! p: y( u2、GPIO主要特性
3 S4 s' Z9 _% s! E7 C9 S- b2 e7 @输出状态: 带有上拉或下拉的推挽输出或开漏输出
. W8 |, j2 X7 _从输出数据寄存器 (GPIOx_ODR) 或外设 ( 复用功能输出 ) 输出数据1 v j1 B* t- R1 x- _
可选的每个 I/O 口的速度
9 o- h0 h- I0 S& _' |6 U输入状态: 浮空、 上拉 / 下拉、 模拟输入1 k, R* b: k# E. K2 ?6 v
从输入数据寄存器 (GPIOx_IDR) 或外设输入数据 ( 复用功能输出 )
, n) f) Z. B5 Y位置位 / 复位寄存器 (GPIOx_BSRR) 为对 GPIOx_ODR 寄存器提供位访问能力
* I7 f& m+ K iGPIO端口锁定机制(GPIOx_LCKR) 配置6 l2 N! Q5 K+ L
模拟功能
# w) ` f& r/ d$ c可选的复用功能- d+ E7 Y: R# i( `/ {$ @; c
每两个时钟周期快速切换I/O值的能力( r5 p) V- D: _. g, c
允许GPIO口和外设引脚的高灵活性复用3 T. {7 ?/ [! p0 J( \
( p6 G& P3 |* L+ R
3、GPIO 功能描述; S0 o% G8 P; U, F, ]0 `1 Q
根据数据手册中列出的每个 I/O 端口的特定硬件特征, GPIO 端口的每个位可以由软件分别配" I% z, u, i: Q4 @- i0 O9 Y+ C% [
置成多种模式:9 Z& d# r( O; q5 J
2 U5 f+ c3 o; r浮空输入. T: w5 g- ^- |5 c- h9 {/ R
上拉输入/ C- c1 k/ ~* }
下拉输入
, A9 H& F* ]2 S7 ^; O模拟输入
8 o7 }! H$ v3 F( W2 W具有上拉或下拉能力的开漏输出
( G! a$ d, E% R- U( m具有上拉或下拉能力的推挽输出# y/ c g! ^7 J( o" `% h
复用功能且具有上拉或下拉能力的推挽输出$ X" a6 H, y1 R( Q- K+ s
复用功能且具有上拉或下拉能力的开漏输出" u X5 N1 u, A& b$ l% A' X" |
每个 I/O 端口位可以自由编程, 然而 I/0 端口寄存器可按 32 位字, 半字或字节访问。 GPIOx_
: S, s0 L" r0 m8 f6 p( p5 uBSRR 寄存器允许对任何 GPIO 寄存器进行位读 / 改写访问。 这种情况下, 在读和更改访问之9 ~; s9 S7 u9 h: x' u+ ~
间产生 IRQ 时也不会发生危险。9 O2 i: A9 Z/ p# J1 L$ b3 [
0 K* S& u: [* B标准I/O端口位的基本结构0 K$ z4 y, Z1 k5 W1 a$ r6 |
. j2 Q& j; u1 b2 b7 l
( [) s* z& j5 C8 E5 L
8 E$ g/ T6 M, U) ^0 b5 G5V 容忍I/O端口位的基本结构4 u9 n& [% x8 T( b
) F9 t# w3 w% X8 B# |: C% [/ U7 l2 | W! H5 ?! V3 ?3 _2 l
5 g7 w2 x/ d5 S! f3 k6 \4、GPIO端口配置说明
# |/ r. a5 ]) {7 s" i/ t% t$ c① GPIO模式
5 I, P1 x5 G& b. _GPIO_Mode_IN 输入模式 ( 复位状态 ). f4 p0 e: Z" L# ]) Z8 S& ^
GPIO_Mode_OUT 通用输出模式2 _$ ^: w# X2 o
GPIO_Mode_AF 复用功能模式
# u( r5 D8 ` {- RGPIO_Mode_AN 模拟模式
: J; Q n; S5 d& I4 {
J! O) |* B2 y7 l5 y8 k输出模式类型:: U$ |' _/ I4 B: k# U
GPIO_OType_PP 推免输出( X' m3 s+ j7 |3 k
GPIO_OType_OD 开漏输出: o9 d; K9 @$ Y' ]) v& d9 |7 J( B
( G7 f9 V: q a) s( i% g6 C* K
② 是否带上/下拉
0 F4 i. D& s! M5 P+ v5 GGPIO_NOPULL 不带上/下拉
1 U" J# N8 L/ |6 |. P' c" ]1 cGPIO_PULLUP 带上拉
1 x$ y4 Y ?3 F/ i9 ?6 U4 iGPIO_PULLDOWN 带下拉
8 A: R, q' `6 B5 G7 l4 _# J" A: @- N& }8 D$ P
③ 输出速度3 u. D8 A+ h2 q6 `3 w( t+ c8 M; V
GPIO_Speed_2MHz 2 MHz
% S- ]8 t5 H0 D- a8 |1 g' ^GPIO_Speed_10MHz 10 MHz& w3 B4 ]* {5 ~2 [9 k: e
GPIO_Speed_50MHz 50 MHz U5 C3 l% b3 N8 @, D% M- r I
9 N! A- j7 z6 @! p |. B1 C
5、GPIO工作模式配置' L4 w6 Q% K9 R6 }; y
5.1【标准库】的配置方式( F$ Y6 s7 Z( E$ d g3 O8 c
步骤:9 _0 ^. b- B2 Y- K/ m1 r! G* `
1、配置对应端口的RCC时钟
! m2 K7 u6 l3 y3 O' W5 V# f9 u; X3 Z- q5 g
- /************************************************& w2 }: z+ _! S+ V4 _
- 函数名称 : RCC_Configuration1 T/ `: v7 t! Z$ ~8 z- a7 a- ]
- 功 能 : 时钟配置. B8 n9 U0 c& G- E6 B+ h
- 参 数 : 无
- |1 O5 J6 Q! D0 E! a+ Q - 返 回 值 : 无- {! Z1 l; Z5 F' \$ k8 b
- 作 者 : JayYang
3 e5 I$ R9 _0 a# E% k$ g: I3 j - *************************************************/* w5 x( T7 E% h' L$ {8 `* G( ~
- void RCC_Configuration(void)* C( a' i t3 e" Y7 N
- {, h3 F9 `0 X/ l* E/ A
- /* 使能AHB时钟 */3 ]9 o) a/ `: U4 ^! }- v. J1 k
- RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA | RCC_AHBPeriph_GPIOB |
! C3 e- t! r) y5 Z - RCC_AHBPeriph_GPIOC | RCC_AHBPeriph_GPIOF, ENABLE);* Y) {$ U, ?9 [2 K) Z
- }
复制代码
& q4 W' S$ k9 v- n$ Q' }' h9 [2、配置GPIO工作模式
7 K5 y3 s5 v4 n2 x s! W$ i( h- P
2 u- z3 o# u m- /************************************************- |7 @0 \" c7 t
- 函数名称 : GPIO_Configuration
) t. I- n/ |6 L9 V; q5 H8 x - 功 能 : 基本输入输出引脚配置, y. g5 b/ N# k$ V8 H T4 p6 u
- 参 数 : 无
3 o4 {( n1 e: P$ P; ]8 M" `3 D - 返 回 值 : 无
6 H5 |& c1 p# c2 k - 作 者 : JayYang2 _+ P- `. J# s0 T$ A C
- *************************************************/
: J8 r' M, V9 `/ v+ f - void GPIO_Configuration(void)
: O1 _# T( E- |% G, k# N' P8 ~, E' E - {9 {" v8 m7 P4 n% o9 n4 [
- GPIO_InitTypeDef GPIO_InitStructure; // 定义GPIO初始化结构体
! l/ J8 T& _& u$ c' K
9 B9 Q, ~. ]: z5 F. t- //GPIO配置为 推免输出模式% G5 ] Q" D1 y9 P; Z
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; // 配置使用的GPIO管脚号:0
' A+ C- a1 ~7 b8 Q- W/ N+ j - GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; // 设置GPIO的模式为输出模式& K! z' i2 z1 M+ b4 q. O
- GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; // 设置端口输出类型为:推免输出
! O4 @% B- f/ {' ]( v4 P8 J0 L$ ?* j - GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; // 配置 I/O 口的速度为:50MHz,还可选:GPIO_Speed_2MHz,GPIO_Speed_10MHz7 W6 c& ~5 D* c0 s6 e+ h" `- A4 \
- GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; // 配置 I/O 口的上拉或下拉:无上下拉(浮空),还可选:GPIO_PuPd_UP,GPIO_PuPd_DOWN
4 ?3 H: ?- D# @! j - GPIO_Init(GPIOA, &GPIO_InitStructure); // 初始化GPIOA的0脚为高速推免输出模式# \: S& o) x/ Z( B9 @1 ?
o& I2 H" R) J- //GPIO配置为 开漏输出模式 g9 L/ Q2 [: g( l/ i9 |: W- }5 \7 @
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1; // 配置使用的GPIO管脚号:15 P1 T! \2 P2 }$ s
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; // 设置GPIO的模式为输出模式- \* d O! W; ?/ s" l7 B" i
- GPIO_InitStructure.GPIO_OType = GPIO_OType_OD; // 设置端口输出类型为:开漏输出
/ B* W0 G$ F1 m# E. [5 z - GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; // 配置 I/O 口的速度为:50MHz,可选:GPIO_Speed_2MHz,GPIO_Speed_10MHz
( U! ^$ ~) B, a/ v1 y/ }/ _) t* w - GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; // 配置 I/O 口的上拉或下拉:无上下拉(浮空),还可选:GPIO_PuPd_UP,GPIO_PuPd_DOWN
* ^ o7 ^0 M) Y, @ - GPIO_Init(GPIOA, &GPIO_InitStructure); // 初始化GPIOA的1脚为开漏输出模式% t7 p$ z' P: w7 h2 n4 n% `& O
$ `2 y% \2 n. X8 L- //GPIO配置为 上拉输入模式- J/ I% t' F7 N% I" R' }
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12; // 配置使用的GPIO管脚号:12
2 |$ M6 R- f e+ X, s - GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN; // 设置GPIO的模式为输入模式
' p. v" m/ G' d# S& F1 o7 q8 ] - GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; // 配置 I/O 口的上拉或下拉:上拉,还可选:GPIO_PuPd_NOPULL,GPIO_PuPd_DOWN8 C" S- E% Y2 c& x3 J J
- GPIO_Init(GPIOC, &GPIO_InitStructure); // 初始化GPIOC的12脚为上拉输入模式
( S9 ^ {4 d$ ?+ F% _
& f$ E) L9 b& D6 t2 @( c6 b- //GPIO配置为 下拉输入模式
9 q' D* C9 u: j7 Y% H& Y) M1 y - GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13; // 配置使用的GPIO管脚号:13) R" O0 x* N) t8 d
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN; // 设置GPIO的模式为输入模式. c; x% Q9 J# n9 x" a
- GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN; // 配置 I/O 口的上拉或下拉:下拉,还可选:GPIO_PuPd_NOPULL,GPIO_PuPd_UP
/ p3 B( ?7 ^9 F7 j$ u - GPIO_Init(GPIOC, &GPIO_InitStructure); // 初始化GPIOC的13脚为下拉输入模式& W! u7 @+ @+ L' I1 r
- : B; |) e3 N' G Z! p' [4 o
- //GPIO配置为 模拟输入输出模式7 Q; ~! y+ J. ?( M9 F
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; // 配置使用的GPIO管脚号:0
7 X$ G/ \3 `* {8 u& P d - GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN; // 设置GPIO的模式为输入模式0 l$ { O$ H8 ?" Q+ a
- GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; // 配置 I/O 口的上拉或下拉:无上下拉(浮空),还可选:GPIO_PuPd_UP,GPIO_PuPd_DOWN
! ~3 Y* U J% l! V+ |2 D* v0 u# A - GPIO_Init(GPIOC, &GPIO_InitStructure); // 初始化GPIOC的0脚为模拟输入模式
5 v4 y7 ~% ]9 c5 R - 4 ~1 \; g+ g6 e! C% N
- //GPIO配置为 复用输出模式
5 [/ k& C, D7 x8 C4 D - GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; // 配置使用的GPIO管脚号:90 X4 g( h! I9 L3 y8 |+ r% t
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; // 设置GPIO的模式为复用模式
, z6 Q; G$ A- _4 T: V2 Y - GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; // 设置端口输出类型为:推免输出1 T4 Y$ n+ T. o$ C7 j' Z$ }
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; // 配置 I/O 口的速度为:50MHz,还可选:GPIO_Speed_2MHz,GPIO_Speed_10MHz$ ]( }, T% K* k5 L* {
- GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL ; // 配置 I/O 口的上拉或下拉:无上下拉(浮空),还可选:GPIO_PuPd_UP,GPIO_PuPd_DOWN
+ {3 j2 V1 A# K# ^& ~$ v! c - GPIO_Init(GPIOA, &GPIO_InitStructure); // 初始化GPIOA的9脚为复用推免输出模式
9 d, S# w% T' C1 K' ]$ ~ - GPIO_PinAFConfig(GPIOA, GPIO_PinSource9, GPIO_AF_2); // 配置GPIOA的9号引脚复用为 TIM1_CH2 定时器1的通道2输出引脚7 M) W, [+ h" n! ^, j4 q6 [( e- N
+ A" N6 m7 b7 M0 I- }
复制代码
4 w4 m: ~( k1 I+ Q2 @' k( X' d3 q8 H4 n, D* B; D v
5.2【HAL库】的配置方式/ s/ B& T9 V) u H
步骤:# R: r/ D4 d( N& U1 F( R
1、通过STM32CubeMX软件配置RCC时钟4 Y( @: l6 i# _9 m g" J
! i' m; { r# p/ e% M2 a: |( y: j( c; p& ^1 N& \1 @4 e
4 s. T7 C; \7 h5 F0 U选择【Clock Configutration】选项卡进行时钟的设置,如图下图:+ Z' y- M F0 W& p% E* L ]0 P/ Z* x2 [
7 ]* k) n8 |# D* {# R" `' f2 i
: v1 c* ~# z. u; o
2、选择需要配置的GPIO引脚的输入输出模式,这边的配置只是一个大方面的配置,比如是要配置为输入还是输出' r |: q6 {1 v. ]7 R+ |: [8 Z9 Z
$ d2 i1 m, o& k8 G- T. I! l; c$ @' F' E" F
C6 T! w& Y3 X# R0 o2 @; P下面进行每个管脚的具体参数配置2 b/ o6 _2 {& Y/ f
. f+ n3 ?) E# g. H8 B
4 a3 P1 n. n: j) q9 |" q$ R1 j6 w: v7 D \
点击 上图中的 GPIO 后会在左侧显示所有使用到的GPIO管脚,进入如下界面,点击每一个管脚可以进行详细配置:
2 I+ u7 m7 S: ?- k0 v
$ ^% t- j" {5 ?6 h5 K7 P
2 z* B, l; o+ O% g5 ~) t7 i B2 G! N8 D
3 K+ h) }9 _" a- I. R0 L: z
& n3 p" u( r+ b/ @% i3 Z+ X/ g! T2 b) n0 [6 h3 X+ m
在【gpio.c】文件下,查看生成的GPIO工作模式配置代码,此处配置的是推免输出、开漏输出、上下拉输入和模拟输入的引脚
& I# Z- u. w# e% T: Y* G. t$ o6 G
% O+ O! g' M9 d- void MX_GPIO_Init(void)% f/ F% t* W/ V
- {1 B4 W5 W& t0 W( T5 Q0 r: w
4 m% \9 A2 q% ~- GPIO_InitTypeDef GPIO_InitStruct = {0};
3 @5 J# S! X4 d3 u, U4 @ - . Q' D. ^; J1 {8 Q
- /* GPIO Ports Clock Enable */
9 M# d1 s! G5 ?0 Q - __HAL_RCC_GPIOC_CLK_ENABLE();
4 [* ?( M1 o( h7 C, K9 d - __HAL_RCC_GPIOF_CLK_ENABLE();
3 {" x2 C! R+ N6 E* {2 n* C8 l/ {1 ? - __HAL_RCC_GPIOA_CLK_ENABLE();; L; M2 I8 ?, ^
6 p: x# V# t, a3 }- /*Configure GPIO pin Output Level */
" \6 w k: l- y* z+ j) r" N$ x - HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0|GPIO_PIN_1, GPIO_PIN_SET);
. _! c9 N' n3 {0 ]. z - * {8 q9 h2 A& ]& }
- /*Configure GPIO pin : PC13 */
' I, x5 k& F; y3 E6 A, j* n - GPIO_InitStruct.Pin = GPIO_PIN_13;
7 V7 G5 B! K6 ^$ L9 X3 N* o/ L4 E - GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
; E ]) h( P& e7 { - GPIO_InitStruct.Pull = GPIO_PULLDOWN;
& c3 O- k& F7 x5 @6 V - HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);$ R/ I n6 D6 e) i1 N
e& c' o; K4 `2 d$ t- /*Configure GPIO pin : PC0 */
; f& b c% t0 l9 L" y0 R - GPIO_InitStruct.Pin = GPIO_PIN_0;# O5 m o6 X# ], x
- GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
+ L& z$ q+ f g. g2 ?1 | - GPIO_InitStruct.Pull = GPIO_NOPULL;9 U. J* n4 {; R! h+ U9 c9 A
- HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);1 B- ]" F8 y1 \) A+ J% m" Z. z& L
8 Y- B+ I* g1 H; x- /*Configure GPIO pin : PA0 */" I% b0 r# S9 d) |+ y* D
- GPIO_InitStruct.Pin = GPIO_PIN_0;
, b$ ~3 x/ {) F0 e8 M6 N, K6 e - GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;" U+ b: f) P8 i
- GPIO_InitStruct.Pull = GPIO_NOPULL;
$ W' @6 l5 W. @' F1 A - GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;$ Z* K# w9 o. q* s" Z
- HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);$ I8 r" E+ O/ e1 x
5 A7 n" g7 ^+ ~& ^+ C5 a- /*Configure GPIO pin : PA1 */+ {2 |* W$ t' j r: T2 k1 ]
- GPIO_InitStruct.Pin = GPIO_PIN_1;) d! L, t, J) |: d, X+ W
- GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_OD;
- U U3 | F- ]3 Y1 _- y1 N( R: R, } - GPIO_InitStruct.Pull = GPIO_NOPULL;
! W9 ?& o6 _% M' c( K2 w - GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;$ Y/ B1 l2 n. @; x9 o
- HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);1 i. u8 r, @7 K3 c2 L( X
) B" A. r5 _3 Q$ M+ e+ n A$ T5 @- /*Configure GPIO pin : PC12 *// U: O }. l2 t) u
- GPIO_InitStruct.Pin = GPIO_PIN_12;
- `% m# Y, c7 G* v, Q5 `; z& `: U% F - GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
. {& k& Y3 \' t$ F$ Y' M - GPIO_InitStruct.Pull = GPIO_PULLUP;
- I$ X; u/ R+ m4 h" Z" }5 V5 ` ~ - HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
2 N, j5 x5 c! w: d I( D- b - * ?0 a) S" o& \$ T! m$ z ]
- }
复制代码 ! f3 R: e) B) L* ^- M
至于复用功能的引脚,比如此例中将 PA9 复用为 TIM1_CH2 定时器1的通道2,则需要在tim.c文件中查看代码,一般都在相应外设的初始化源文件中3 A( q5 |; C6 } y7 G3 M
3 ]" Z( i0 b1 l% h2 L
- void HAL_TIM_MspPostInit(TIM_HandleTypeDef* timHandle)) n8 k$ f1 a/ |& f* t
- {5 c; r- O6 ~2 T4 k! A) M$ V# x
7 E9 K( Z& {- g$ |- N, E- GPIO_InitTypeDef GPIO_InitStruct = {0};
4 V. c+ x9 L. U% e4 ~) ~ - if(timHandle->Instance==TIM1)% E( V ^+ t& _ p9 J& U- h/ ]6 R
- {
4 n* m* t1 i, k1 L8 \7 ?1 L& s - /* USER CODE BEGIN TIM1_MspPostInit 0 */" ?8 X' x% E0 X8 J4 e) T- P
: [) d+ T# X7 w: [+ n0 J( ?- /* USER CODE END TIM1_MspPostInit 0 */9 g' N2 S/ P, I2 c& {) i
- . x6 G1 F" B) z" k" Z" h
- __HAL_RCC_GPIOA_CLK_ENABLE();
* u, C% P4 x+ [, j9 b3 M - /**TIM1 GPIO Configuration ( ?9 a' W4 S) I# J7 H# N% C" a& B
- PA9 ------> TIM1_CH2
( M1 n L4 n4 `+ U9 D3 A - */
: X( H. F1 q! v8 ^3 i; r - GPIO_InitStruct.Pin = GPIO_PIN_9; //使用9号引脚
3 s5 S5 ]8 Z! ]% x7 I - GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; //配置为复用推免输出模式
! q' B" y2 ^% V( o - GPIO_InitStruct.Pull = GPIO_NOPULL; //没有上下拉
. C) h9 T) r I! \ - GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; //高速输出
5 M# R! a8 o9 v0 s+ @ - GPIO_InitStruct.Alternate = GPIO_AF2_TIM1; //复用为定时器1的通道2
) B) H$ {4 e4 p, Q2 s) t! R4 y - HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
. f1 T1 T& C1 ? - - `' n+ v+ p) S! W
- /* USER CODE BEGIN TIM1_MspPostInit 1 */ B& Y7 z2 K3 i+ T$ ~
/ ^7 R6 |8 k' a7 Q, c/ ?) A- /* USER CODE END TIM1_MspPostInit 1 */2 `& G7 b4 i9 x/ Y% |
- }# T* ?: O' q+ o: v
- % T# \ W- |# F2 q4 a/ l5 |
- }
复制代码 ; W0 L' M( g# ~, r: ?- m
至此,关于STM32F0系列的GPIO的配置以学习记录完成,如有不对的地方,希望各位看官指出,谢谢大家!/ b3 _& @3 Q, U
' d9 h0 j* F! @" F# C/ {# J* f! }1 c4 t, f
' @; D5 E' v& g" v. k5 Z
& E/ Q9 K& |1 [+ M" G |