1、GPIO介绍
8 f0 j3 j/ X+ ?STM32F0x1/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)( i7 G; O2 ?1 }" f
& @/ W* y/ N4 r; V* y
2、GPIO主要特性4 m* [2 m7 a3 Y
输出状态: 带有上拉或下拉的推挽输出或开漏输出6 P& S1 d5 h$ ?9 t; J
从输出数据寄存器 (GPIOx_ODR) 或外设 ( 复用功能输出 ) 输出数据; F4 p) E% ]$ y* Y" y1 p& t
可选的每个 I/O 口的速度
$ j2 G, d7 a& a: \2 F4 j输入状态: 浮空、 上拉 / 下拉、 模拟输入
" L3 p( p+ |" k从输入数据寄存器 (GPIOx_IDR) 或外设输入数据 ( 复用功能输出 )% Y6 h2 c2 {$ b1 C/ y5 f' ?! w. L
位置位 / 复位寄存器 (GPIOx_BSRR) 为对 GPIOx_ODR 寄存器提供位访问能力, s& ~ [$ b J
GPIO端口锁定机制(GPIOx_LCKR) 配置) k8 S- \+ Y, k0 f( |5 Y
模拟功能1 s$ R; K1 j( a
可选的复用功能9 s% H; u2 w# m! `3 d! [
每两个时钟周期快速切换I/O值的能力
% q% w0 d' o% C/ ]+ Z: Q允许GPIO口和外设引脚的高灵活性复用+ H9 V1 p3 e% L
6 M8 d. \4 j; N/ P1 E& y
3、GPIO 功能描述
* v9 w I# H' V( [根据数据手册中列出的每个 I/O 端口的特定硬件特征, GPIO 端口的每个位可以由软件分别配
4 [3 S4 C2 z' |' L$ @置成多种模式:$ t& D' k* U- k
y; r: ?( G, o0 d. u浮空输入
& x$ u- M" j0 g+ e上拉输入
9 o& t( J p2 ]# L下拉输入# u! {; g! C) D* M% `6 J- n! Z
模拟输入
# E9 M& k @) q3 I8 j具有上拉或下拉能力的开漏输出 ^' N% c- K: A9 [2 B/ f( ~5 z
具有上拉或下拉能力的推挽输出) s: F9 v, H( P% @
复用功能且具有上拉或下拉能力的推挽输出
: |$ R" n9 |/ |4 w3 F, L9 x复用功能且具有上拉或下拉能力的开漏输出
3 \1 z8 y! @! q7 p$ M* s. E每个 I/O 端口位可以自由编程, 然而 I/0 端口寄存器可按 32 位字, 半字或字节访问。 GPIOx_+ d* H5 f5 M1 ~; T) `
BSRR 寄存器允许对任何 GPIO 寄存器进行位读 / 改写访问。 这种情况下, 在读和更改访问之
/ ?( s1 H- y: J0 ]" A6 D6 a间产生 IRQ 时也不会发生危险。
6 X8 O9 P; p; S1 s: ^+ A
! p5 B" w, k6 R标准I/O端口位的基本结构
: w5 G5 F7 Z7 c% i' F0 y& Z( Z! h" M7 F, u* A6 R( n
+ W+ J' W6 F. k2 D3 x$ }+ I- q) ^; d! [$ P0 l0 P
5V 容忍I/O端口位的基本结构
! V" w& i u# ~4 B5 {5 @
3 P/ C" }6 d }/ [
5 |( ?/ E5 M3 q8 {! M8 }5 t4 b+ {# @. F
4、GPIO端口配置说明# J$ {; \! `1 T: r K5 H
① GPIO模式
) d* F/ ~% O0 `' H# l6 r6 ~, xGPIO_Mode_IN 输入模式 ( 复位状态 )" G: O' i% w& i# R( A
GPIO_Mode_OUT 通用输出模式3 m0 W8 v0 i, I# l5 `
GPIO_Mode_AF 复用功能模式
1 Z3 R- u: L0 A% v- r1 b, `( c1 i' M5 UGPIO_Mode_AN 模拟模式 R8 W) s6 U$ d0 Q0 Y4 |% h
2 J8 K# N5 K9 k1 N! j9 i$ K
输出模式类型:
8 m( w* v' d5 F% r% c6 FGPIO_OType_PP 推免输出
4 e' {2 y- p/ }; k$ ?GPIO_OType_OD 开漏输出4 E$ u1 u( j! f
J: G9 `3 M' u: ~/ k% e) w
② 是否带上/下拉
+ P9 k$ Y O) nGPIO_NOPULL 不带上/下拉
- m' \ G: b" j5 c2 A$ A v$ t- FGPIO_PULLUP 带上拉
7 x h( s6 V) N0 gGPIO_PULLDOWN 带下拉
/ u6 [) P8 m9 h; J# c# u! f3 p( ] z2 n: D2 y/ Z
③ 输出速度 l& w. `4 j& x6 }
GPIO_Speed_2MHz 2 MHz, G: T0 O# v' Z8 u6 s/ ?* C$ T
GPIO_Speed_10MHz 10 MHz: U9 _3 `. V( R* p, M
GPIO_Speed_50MHz 50 MHz
; v! z, Y" M. i, K! F5 j8 g( {; n3 c+ Y7 X1 M7 }
5、GPIO工作模式配置 v5 s* p, ?- e
5.1【标准库】的配置方式
( A4 Z, h, x! z* F( @, M步骤:
& L# i# Z1 [5 ]2 j1、配置对应端口的RCC时钟, _: a3 q" U: B. U
) U% ^( x' d! U/ Y9 G/ {- /************************************************
' l; {% a+ p0 {. E( r- Q1 O3 } - 函数名称 : RCC_Configuration
5 f8 {6 \) ?9 L* B - 功 能 : 时钟配置- Z2 ]. ]3 P! {" V) }0 D
- 参 数 : 无5 }/ ~, _: @, P( f) |
- 返 回 值 : 无
; ~1 _7 I% y; [) r* S* X( | - 作 者 : JayYang" ]" D0 { H/ m* a+ f+ @2 a8 `
- *************************************************/
! ~9 J: B( ?9 y6 Q& B4 q- @ - void RCC_Configuration(void)
3 r% m6 T3 C: t1 A- S' }, V - {! a) e7 L* S3 K T7 K+ g% f" k
- /* 使能AHB时钟 */
( {7 C; j$ @+ Q3 K' P9 A; x3 m - RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA | RCC_AHBPeriph_GPIOB |
& f x a( S, g! b) W& x1 f - RCC_AHBPeriph_GPIOC | RCC_AHBPeriph_GPIOF, ENABLE);
; z9 Q4 h; m+ ]/ R3 X1 u - }
复制代码 . h, }' A( v7 E* O3 x1 T
2、配置GPIO工作模式, [5 l7 h% W5 G: _, K" f
% }8 `9 s; t ~9 s. _
- /************************************************7 Y }/ k& S# ]. ?8 B0 _/ i
- 函数名称 : GPIO_Configuration* Q. ^7 N8 O L, x1 @) w
- 功 能 : 基本输入输出引脚配置. }3 D8 l* Z: G+ j# H
- 参 数 : 无
. ]2 x1 w( n/ T J - 返 回 值 : 无8 z* E* i" v! r4 G; V* @8 @6 N
- 作 者 : JayYang
# g( G. D$ J: n5 s - *************************************************/
% J( {0 J1 }3 [: x- I9 `. b - void GPIO_Configuration(void)# A1 r9 z: d' ~. ^
- {
4 G9 v3 `$ O8 Y' X+ y - GPIO_InitTypeDef GPIO_InitStructure; // 定义GPIO初始化结构体
$ S: K, l7 l4 F$ p2 k* i
( g& S# f6 g& h- //GPIO配置为 推免输出模式
' c* B" p0 W$ m T" } - GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; // 配置使用的GPIO管脚号:0
" @! c P. y( j8 o, A - GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; // 设置GPIO的模式为输出模式
" a( R, i/ ^6 ?( P7 t+ i9 K - GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; // 设置端口输出类型为:推免输出
; I) t" {. L2 z - GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; // 配置 I/O 口的速度为:50MHz,还可选:GPIO_Speed_2MHz,GPIO_Speed_10MHz
' V3 l8 b; U: C) A q6 t P2 T - GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; // 配置 I/O 口的上拉或下拉:无上下拉(浮空),还可选:GPIO_PuPd_UP,GPIO_PuPd_DOWN7 T+ [, x; q$ n8 f7 I7 g
- GPIO_Init(GPIOA, &GPIO_InitStructure); // 初始化GPIOA的0脚为高速推免输出模式7 D% H. \ o2 n9 g4 c- `: y
3 u5 S0 F/ h7 D7 n k- //GPIO配置为 开漏输出模式2 g- j& D9 k. y: s; [; ~1 u
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1; // 配置使用的GPIO管脚号:1! a! F( K; `6 x, M* _: w. ~
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; // 设置GPIO的模式为输出模式5 `1 @5 I8 k( [( a6 `' I7 C( i
- GPIO_InitStructure.GPIO_OType = GPIO_OType_OD; // 设置端口输出类型为:开漏输出7 Z2 ~3 t2 M6 w! K8 h9 W. Q q
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; // 配置 I/O 口的速度为:50MHz,可选:GPIO_Speed_2MHz,GPIO_Speed_10MHz* n9 D( F/ ^/ H" l5 Z1 i- R& P: P$ e
- GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; // 配置 I/O 口的上拉或下拉:无上下拉(浮空),还可选:GPIO_PuPd_UP,GPIO_PuPd_DOWN
0 s7 k8 C: h1 b ]! f - GPIO_Init(GPIOA, &GPIO_InitStructure); // 初始化GPIOA的1脚为开漏输出模式
4 d" L. {9 {6 d# B* J( Z - 2 \4 X H8 u" R; ]7 B: }& k
- //GPIO配置为 上拉输入模式! C- J' B& L h: j% Q# `. `
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12; // 配置使用的GPIO管脚号:12
7 G9 a) O% K) M9 d/ N - GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN; // 设置GPIO的模式为输入模式2 r6 o5 W4 I, T" W
- GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; // 配置 I/O 口的上拉或下拉:上拉,还可选:GPIO_PuPd_NOPULL,GPIO_PuPd_DOWN
1 \1 B! T/ c+ H% k1 T - GPIO_Init(GPIOC, &GPIO_InitStructure); // 初始化GPIOC的12脚为上拉输入模式" Z+ _3 l0 I$ s; J2 n. [$ s
& r0 ~, J( B9 ?8 o- //GPIO配置为 下拉输入模式; G( V: J* v) M6 d4 R
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13; // 配置使用的GPIO管脚号:13+ q" y4 s5 _* j( j# R
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN; // 设置GPIO的模式为输入模式6 G3 w8 G' Y" L# L
- GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN; // 配置 I/O 口的上拉或下拉:下拉,还可选:GPIO_PuPd_NOPULL,GPIO_PuPd_UP" L. |: ^0 V4 R. {
- GPIO_Init(GPIOC, &GPIO_InitStructure); // 初始化GPIOC的13脚为下拉输入模式6 @' }6 U8 U' s7 h9 g5 [5 L. T+ ~" k5 P( C
- / y3 B0 j$ y% _, Y% Q$ _9 }6 J0 p
- //GPIO配置为 模拟输入输出模式! ?; U* \( ^; M& p5 [
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; // 配置使用的GPIO管脚号:0
# ]5 C6 I9 S+ K. `. I: @5 }5 J& G - GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN; // 设置GPIO的模式为输入模式1 ?3 f2 @- @4 I
- GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; // 配置 I/O 口的上拉或下拉:无上下拉(浮空),还可选:GPIO_PuPd_UP,GPIO_PuPd_DOWN( b9 B; ~- e: m. A# W& M3 N, C
- GPIO_Init(GPIOC, &GPIO_InitStructure); // 初始化GPIOC的0脚为模拟输入模式
8 e, k' U) q5 k8 ^3 y - ) x; Y& n N- X* S. d9 }
- //GPIO配置为 复用输出模式
8 R |9 M6 I. h# f - GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; // 配置使用的GPIO管脚号:9
* b. s1 j4 \; r9 O* x4 a8 w! T5 K - GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; // 设置GPIO的模式为复用模式9 d- e) a/ s# y5 j' E
- GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; // 设置端口输出类型为:推免输出
6 {0 Q! ]) A4 S7 [ - GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; // 配置 I/O 口的速度为:50MHz,还可选:GPIO_Speed_2MHz,GPIO_Speed_10MHz
^) \4 a6 m9 ^$ B+ A, x( H - GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL ; // 配置 I/O 口的上拉或下拉:无上下拉(浮空),还可选:GPIO_PuPd_UP,GPIO_PuPd_DOWN
3 J8 z! J+ N0 j& E - GPIO_Init(GPIOA, &GPIO_InitStructure); // 初始化GPIOA的9脚为复用推免输出模式
% @" _/ w. N5 s9 O - GPIO_PinAFConfig(GPIOA, GPIO_PinSource9, GPIO_AF_2); // 配置GPIOA的9号引脚复用为 TIM1_CH2 定时器1的通道2输出引脚
' ~0 ~4 A' O' U$ K9 A* S% M3 L& ~ - 0 G' m, n& O% Z# A0 `6 O
- }
复制代码
# x( X0 i& E7 O7 Z% n' P
* ^% g4 w8 f# G% i5.2【HAL库】的配置方式0 Z2 [5 [* ^, ~" ?7 f
步骤:) J8 a' {0 l, Q% Q" }
1、通过STM32CubeMX软件配置RCC时钟
% L @7 C& p0 Z( k1 X4 C
, {6 g- r+ l" ?3 ]. I! v; ?7 B4 ]: T' ], @" m# |: j0 {; l1 E/ v4 }
& ]# i+ R/ ?0 x0 T% Y3 ?选择【Clock Configutration】选项卡进行时钟的设置,如图下图:+ Y5 ^& p, y6 g0 f, k( J
$ ` B$ `* k/ G4 X( S9 b& T9 T
6 h8 m: n, _' X8 ^4 E
2、选择需要配置的GPIO引脚的输入输出模式,这边的配置只是一个大方面的配置,比如是要配置为输入还是输出. \" J/ N- ` C( \: T+ A u5 s$ }
8 z/ Z3 X' [" ]! _
4 v- `: {( G8 ~1 s9 O6 h* C' A) ?! \+ a1 f y
下面进行每个管脚的具体参数配置
4 A9 ]- f0 N2 @1 \ U
6 L, N/ J, H- j7 {7 x- i: Q
5 P" ]$ D6 u. n4 Z' f% q8 Y @% j! B( i7 l- C
点击 上图中的 GPIO 后会在左侧显示所有使用到的GPIO管脚,进入如下界面,点击每一个管脚可以进行详细配置:
& u: u8 J8 t! a: n( d4 k* d+ t
( O0 B( }! g4 R p, Q
% a- | D( q2 e P$ p* g/ J/ s/ k) Q- s1 i1 [
- y4 }7 m6 B& H% ?) f
! T8 E0 T: T# ~$ X4 I
在【gpio.c】文件下,查看生成的GPIO工作模式配置代码,此处配置的是推免输出、开漏输出、上下拉输入和模拟输入的引脚
5 A* G6 s+ c( z$ q* F- h1 y
9 D5 [& y( K+ x8 {; ~9 c0 J* D- void MX_GPIO_Init(void)8 G5 `, s$ U- g+ z+ J4 `+ p. {6 M
- {; e/ k+ t% O8 L' ?+ D9 |8 {
# k1 D4 P9 c/ J- GPIO_InitTypeDef GPIO_InitStruct = {0}; Y0 v0 g% K% @5 r, q5 v
- ! N6 o; I! j0 Y8 M
- /* GPIO Ports Clock Enable */ _- g7 |+ N& l. l
- __HAL_RCC_GPIOC_CLK_ENABLE();
- T! ~. T4 \+ A7 s$ G% {" w7 J - __HAL_RCC_GPIOF_CLK_ENABLE();3 Z' ~% X k+ [$ H; Y, w
- __HAL_RCC_GPIOA_CLK_ENABLE();
- r6 i: `1 u1 t: e/ B- P1 f - ! O3 }7 c# ^! Z6 _9 N0 M
- /*Configure GPIO pin Output Level */- B# F- K5 _5 V# H1 k# r, B
- HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0|GPIO_PIN_1, GPIO_PIN_SET);2 l6 L9 I& M( Z( U3 P
4 d3 s( `! G: `8 L; T- /*Configure GPIO pin : PC13 */) r) D0 Z5 d) ]5 i: f* v4 @2 ^
- GPIO_InitStruct.Pin = GPIO_PIN_13;7 Z1 C! D; }' H* b
- GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
) l6 P5 p* M4 H$ w8 W4 ^ - GPIO_InitStruct.Pull = GPIO_PULLDOWN;
5 V8 h: m1 Q! v2 Z2 ^$ r- ^; P4 | - HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
* v- d" m9 l6 Q0 g; P7 F
/ O& j1 ]3 ?& X+ r3 n1 v1 a- /*Configure GPIO pin : PC0 */5 Z: J: ?/ Y8 O" b! V
- GPIO_InitStruct.Pin = GPIO_PIN_0;+ `: k5 k4 Q: t) c
- GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
8 p- ^& f' p8 Y: t& Q; Z$ v' j - GPIO_InitStruct.Pull = GPIO_NOPULL;
( k3 i. o( |- v6 J6 b# }5 ?7 R5 z# C - HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);8 n8 g- Z5 ~5 T4 T% R7 ]7 v
- 2 [7 A; V, t; [$ t/ A8 k
- /*Configure GPIO pin : PA0 */2 H$ ?3 f b2 @3 ]+ c5 ?, b: u5 F! K
- GPIO_InitStruct.Pin = GPIO_PIN_0;
& y- E$ L* h5 F2 I - GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
8 g* Q* t d3 g7 m - GPIO_InitStruct.Pull = GPIO_NOPULL;8 X# j( u) |* _8 b. @: u, W
- GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;% j* n$ e" P7 d+ r1 g1 J
- HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
1 O+ J- N% |/ S E; c1 X) ^$ u - 1 b0 o6 |3 v$ M0 i# F
- /*Configure GPIO pin : PA1 */8 {8 t. q& @, L) F2 Y2 M( W
- GPIO_InitStruct.Pin = GPIO_PIN_1; o7 Q! C/ ^4 J1 s8 J
- GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_OD;# O! M- `- E" u5 H1 n( p
- GPIO_InitStruct.Pull = GPIO_NOPULL;
5 X2 x$ Y- G3 B - GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;4 o' i0 x" `; D4 }% P8 l# z
- HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);9 K6 m7 V# j% `' l- D. ?
- 0 i' L. t- _: C
- /*Configure GPIO pin : PC12 */
, k, J4 s4 Z/ w) F% ~6 q - GPIO_InitStruct.Pin = GPIO_PIN_12;: q2 t* @- G% P$ S* D+ u7 ~# S- s3 }
- GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
9 C2 U8 v4 A3 h - GPIO_InitStruct.Pull = GPIO_PULLUP;
4 Y% u9 ?, K9 R - HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);8 |4 S6 w0 B/ A- D4 o0 x
- + p+ P- t3 Q! a! r' h
- }
复制代码 ; _; g) V& E Y+ q. I
至于复用功能的引脚,比如此例中将 PA9 复用为 TIM1_CH2 定时器1的通道2,则需要在tim.c文件中查看代码,一般都在相应外设的初始化源文件中
. M: Z5 R6 n5 |9 W4 m0 R' p( `# t) P( K C% h
- void HAL_TIM_MspPostInit(TIM_HandleTypeDef* timHandle)
7 O' s& }* P. I( f/ I+ M - {
9 [* s1 `2 w* U1 L3 D$ @
# z1 k/ G! @4 M; E( f5 p- GPIO_InitTypeDef GPIO_InitStruct = {0};
3 ^' h' A4 p1 X' }3 w; b' u. \ - if(timHandle->Instance==TIM1); ]! L) a% I# Z6 ?& J$ |' r
- {
0 q0 g) c$ ]! o, C: r% c - /* USER CODE BEGIN TIM1_MspPostInit 0 */, _* p9 R N) n
- $ Q+ z3 H$ M. g; B6 I8 r
- /* USER CODE END TIM1_MspPostInit 0 */
: n; c/ M' U1 v j) r - & ^# F |" }3 w
- __HAL_RCC_GPIOA_CLK_ENABLE();% w. h1 N7 j5 m) u2 U0 L# K- l# B
- /**TIM1 GPIO Configuration 1 V; n* ~% H4 y. G. y% h4 Y `
- PA9 ------> TIM1_CH2
4 T9 b6 X1 y6 W% D& q - */1 r9 v/ v3 s. ?$ U: J l
- GPIO_InitStruct.Pin = GPIO_PIN_9; //使用9号引脚
% H8 }7 Y+ y1 F6 l! e8 @ - GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; //配置为复用推免输出模式! w6 M& Q+ t9 d6 b& A
- GPIO_InitStruct.Pull = GPIO_NOPULL; //没有上下拉
/ k. |7 x. e/ v2 c - GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; //高速输出5 s% v% @6 I) Z3 {" |+ ^( n
- GPIO_InitStruct.Alternate = GPIO_AF2_TIM1; //复用为定时器1的通道2
: z0 ~) W# K( h) F) O4 v - HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);4 ]6 ~" ]% L5 M
- ) j5 g2 R( r. V3 _) }- F, @9 M# ?
- /* USER CODE BEGIN TIM1_MspPostInit 1 */* H+ P& j; ^' l4 S9 C+ |$ s
/ B; U/ a0 ]( v I& E2 a- /* USER CODE END TIM1_MspPostInit 1 */
3 q2 f7 U# d _- U6 }2 P - }
L: B* W4 s) k4 M( k4 t
/ m% S/ }, h! f- @4 ^- }
复制代码 : E' l% {! g4 i# }$ a/ m! z7 j9 w
至此,关于STM32F0系列的GPIO的配置以学习记录完成,如有不对的地方,希望各位看官指出,谢谢大家!6 Y& f' r2 X- |1 ^: I6 T
) [2 }; G: q: t& V2 p* F
& U$ X+ h$ F) N' ?8 X- I9 B; L& S5 X- {2 a
, X, ^6 \; u6 C& B& n0 c& f) H |