1、GPIO介绍* u( h6 j, Z3 W. V2 u4 f
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)* |+ F* _$ z! t n( k4 j) \5 ]
, P. |( h* f9 i4 K) w2、GPIO主要特性
9 x! ~! c2 z( P1 }7 C输出状态: 带有上拉或下拉的推挽输出或开漏输出8 z& F0 a& p2 O$ j
从输出数据寄存器 (GPIOx_ODR) 或外设 ( 复用功能输出 ) 输出数据
8 J& r3 `* a+ z) c+ ]可选的每个 I/O 口的速度
8 z* j2 m7 a) C6 W输入状态: 浮空、 上拉 / 下拉、 模拟输入
$ I6 Q- U: g- U* T# B从输入数据寄存器 (GPIOx_IDR) 或外设输入数据 ( 复用功能输出 )
/ g" |8 i& ~6 J' b位置位 / 复位寄存器 (GPIOx_BSRR) 为对 GPIOx_ODR 寄存器提供位访问能力, f( t5 }. p' j2 A$ o5 Z1 W R
GPIO端口锁定机制(GPIOx_LCKR) 配置
& l- N2 d* _1 Z, P+ J1 o4 G模拟功能
' h2 \1 X$ G* @7 _+ H可选的复用功能
2 O: B/ i1 y# q% [ M ?$ J每两个时钟周期快速切换I/O值的能力
; U' U( A1 y, _, W1 n0 N允许GPIO口和外设引脚的高灵活性复用
" G5 t8 m! i% e2 R1 |" u8 c5 I2 a' Z Y; Y
3、GPIO 功能描述
5 j: `) {; O2 }( M: v, [' L/ Q根据数据手册中列出的每个 I/O 端口的特定硬件特征, GPIO 端口的每个位可以由软件分别配
& z3 V" `; I* l- Y: W- {置成多种模式:
, V# o0 o3 z& V* w' {* f" Q3 [9 a( g& x) n5 @; I' z5 G
浮空输入
3 N( ~3 A% I9 f6 E I1 C6 S( Q上拉输入* ]- z! n; Q H$ Q7 Z) |
下拉输入
* u# x0 s7 \+ Z6 _2 i模拟输入+ f6 H; R* t7 D+ g& m6 k+ u$ b
具有上拉或下拉能力的开漏输出: e' C) u/ X, H* W/ k
具有上拉或下拉能力的推挽输出
7 ?( J# Y. i7 g/ q: W! w! n复用功能且具有上拉或下拉能力的推挽输出
0 G* v9 f! r! \) L9 b$ d复用功能且具有上拉或下拉能力的开漏输出
$ i3 ^4 M* v- j& a每个 I/O 端口位可以自由编程, 然而 I/0 端口寄存器可按 32 位字, 半字或字节访问。 GPIOx_
5 D2 P @& r3 s0 NBSRR 寄存器允许对任何 GPIO 寄存器进行位读 / 改写访问。 这种情况下, 在读和更改访问之% S- @6 g# K) R# g& [: B* o
间产生 IRQ 时也不会发生危险。5 p W( @) K {$ U, O
1 ^! J$ F# k# V" y. C1 f8 }' ^
标准I/O端口位的基本结构
: y, [7 V2 S+ R" k
) d0 R5 m U: M
" f) h1 U, D S" u# M/ o" X8 w" ]5 D
q a! [- C0 k" t5V 容忍I/O端口位的基本结构
/ l( k: w* \* m% x# w8 D( i) C
' D4 c' y; A6 ~ j0 Z u' q9 Q# d) J4 M( k
2 f1 i" U' D" K! F1 N8 e4、GPIO端口配置说明: \6 M$ R C2 M( ~
① GPIO模式
% \' {0 Q% r8 |: KGPIO_Mode_IN 输入模式 ( 复位状态 )3 {* C) R) Z6 P/ V- `! o
GPIO_Mode_OUT 通用输出模式
?5 H) B2 |# K8 j& zGPIO_Mode_AF 复用功能模式
) V: q+ ^& C2 x% ^GPIO_Mode_AN 模拟模式
; G, J/ {- I8 l) m; P! F5 F l4 K% R/ E, b! {" ^) o) ^5 S! L
输出模式类型:
F9 |5 m, m4 l/ X+ |' { a0 gGPIO_OType_PP 推免输出" J; \% S+ k+ z) W3 j: z+ v
GPIO_OType_OD 开漏输出
2 ~ R' ^; e. [4 [: C/ v0 d5 `( i8 R7 L7 [0 j1 L
② 是否带上/下拉4 I, y- v4 g# ~% H2 ?$ l5 S5 a
GPIO_NOPULL 不带上/下拉& J! }& X" b* P6 p
GPIO_PULLUP 带上拉1 F1 ?$ U6 z' L5 f. X( [# N; T( p, Q
GPIO_PULLDOWN 带下拉( S3 ]- T" E ^! w: A1 W( \
6 m* H1 j. x# b7 H/ I8 m! P
③ 输出速度
- Z8 p1 L+ U( H3 `GPIO_Speed_2MHz 2 MHz
/ ~7 k$ n" G' X' NGPIO_Speed_10MHz 10 MHz0 M$ J' D3 Z( J+ [
GPIO_Speed_50MHz 50 MHz, T/ C; T% E2 J, \% b
! T2 ]( h( y: J. N; g9 K* q
5、GPIO工作模式配置8 t5 z& S' k! n1 {# V5 K
5.1【标准库】的配置方式1 u. k: n! h/ U: P7 ]4 m f
步骤:1 ~. F i1 j5 S5 Z, C" s8 `) z5 z7 @9 `
1、配置对应端口的RCC时钟4 M8 Y+ n# V/ |8 f3 u0 R! z
; W! @4 V: E! ~! q# w7 r' ~: c- /************************************************: i; F4 v5 I7 [: Z
- 函数名称 : RCC_Configuration
: ?0 l1 F0 N% v. ^ - 功 能 : 时钟配置+ V. N8 m5 {1 _
- 参 数 : 无
" Q, S! H F; T% k - 返 回 值 : 无
/ z1 I5 Z# j2 b5 _( T" |' U7 f - 作 者 : JayYang
0 j9 F! s0 Y7 B, ^1 o0 |4 z - *************************************************/, R( f8 X# h' D! r
- void RCC_Configuration(void)
6 o+ s6 o/ T I2 S! q' A - {
0 C$ ^2 v2 O& m0 } - /* 使能AHB时钟 */
7 C/ q4 y* c9 D4 z( i# i) ]3 f - RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA | RCC_AHBPeriph_GPIOB | * ~- o7 m6 I" z
- RCC_AHBPeriph_GPIOC | RCC_AHBPeriph_GPIOF, ENABLE);: s3 l. J/ K; g6 J
- }
复制代码
' J2 J- H k+ f8 l2、配置GPIO工作模式! S+ j9 V; B& s K- G
" `7 R m, ~# g1 v
- /************************************************
% ^, E3 W( B8 o; N# J0 |9 x5 K - 函数名称 : GPIO_Configuration/ m5 M2 C. ?& d
- 功 能 : 基本输入输出引脚配置" [0 V r4 O# n- B3 R! A
- 参 数 : 无* `5 s" C) N9 }8 b8 Q
- 返 回 值 : 无
. Z* J- q$ f! ?( n' D* m' G( U5 s - 作 者 : JayYang
( z8 |6 d% E9 [. `% }; j- S - *************************************************// O$ W' u9 ^! X
- void GPIO_Configuration(void)6 m; U, r2 w% B! y+ H
- {
$ ~; I% Z; g$ x- m/ ]+ X8 t - GPIO_InitTypeDef GPIO_InitStructure; // 定义GPIO初始化结构体, I, {$ S2 l) G
- # R0 l* y0 u0 S
- //GPIO配置为 推免输出模式% [) P5 C6 O) ]- F* {& L5 D, u
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; // 配置使用的GPIO管脚号:0
4 d$ z# I- D0 U' d6 V& B - GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; // 设置GPIO的模式为输出模式
9 v, D, A+ `) p+ y$ }4 X - GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; // 设置端口输出类型为:推免输出
' h5 R6 _- E3 Y - GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; // 配置 I/O 口的速度为:50MHz,还可选:GPIO_Speed_2MHz,GPIO_Speed_10MHz: c) j9 E$ M$ j3 L: {
- GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; // 配置 I/O 口的上拉或下拉:无上下拉(浮空),还可选:GPIO_PuPd_UP,GPIO_PuPd_DOWN& ~& j# ?) P% U/ S4 C7 _) t
- GPIO_Init(GPIOA, &GPIO_InitStructure); // 初始化GPIOA的0脚为高速推免输出模式, a2 R ~. `) g1 l/ i
- * Z0 X1 R0 \9 d8 ]% d& r/ f- b5 e
- //GPIO配置为 开漏输出模式
2 L; y! D/ a. F, o; \" G - GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1; // 配置使用的GPIO管脚号:14 Z8 P' c' W" P( C/ b% V# }! [. l0 r
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; // 设置GPIO的模式为输出模式
# p$ D3 o' T+ q, n* U$ w - GPIO_InitStructure.GPIO_OType = GPIO_OType_OD; // 设置端口输出类型为:开漏输出
, O6 a+ k6 z, P( v. ?6 R0 K - GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; // 配置 I/O 口的速度为:50MHz,可选:GPIO_Speed_2MHz,GPIO_Speed_10MHz
# J+ I1 G4 e" u4 r. P M$ H# M - GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; // 配置 I/O 口的上拉或下拉:无上下拉(浮空),还可选:GPIO_PuPd_UP,GPIO_PuPd_DOWN
, R0 \6 T2 f% g* M - GPIO_Init(GPIOA, &GPIO_InitStructure); // 初始化GPIOA的1脚为开漏输出模式
9 `; E: l! h6 w4 ~
. t, [- Z7 A5 |7 U4 h- //GPIO配置为 上拉输入模式. ^) I& f( v* r' Q m+ w# `
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12; // 配置使用的GPIO管脚号:12
2 W& |% c* e4 Q5 b3 e5 T' M - GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN; // 设置GPIO的模式为输入模式' V# ]* r& w% |( S) b" I
- GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; // 配置 I/O 口的上拉或下拉:上拉,还可选:GPIO_PuPd_NOPULL,GPIO_PuPd_DOWN* w( J5 k" x9 ~, l5 E6 l& @
- GPIO_Init(GPIOC, &GPIO_InitStructure); // 初始化GPIOC的12脚为上拉输入模式
3 M& N. e9 P! l
! Y W2 e2 R9 B8 {/ x( o# R* i- //GPIO配置为 下拉输入模式
7 N# t) g# \/ M( J4 Q - GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13; // 配置使用的GPIO管脚号:13
1 u# l3 j' Y7 l: t. X% N/ \ - GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN; // 设置GPIO的模式为输入模式
6 o$ v- G0 Y/ c - GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN; // 配置 I/O 口的上拉或下拉:下拉,还可选:GPIO_PuPd_NOPULL,GPIO_PuPd_UP
0 q4 u) \7 v9 Q" h: j+ u - GPIO_Init(GPIOC, &GPIO_InitStructure); // 初始化GPIOC的13脚为下拉输入模式
+ }: k4 A* I3 n1 }9 y! Y
P9 B* H4 ?8 L% k* O0 N6 A9 O1 T5 {- //GPIO配置为 模拟输入输出模式& |1 V/ o6 K/ L, x% |
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; // 配置使用的GPIO管脚号:0+ m! t- o% C" ?0 H
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN; // 设置GPIO的模式为输入模式
- H: g: g* F$ W* O& e7 b$ O1 ~ - GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; // 配置 I/O 口的上拉或下拉:无上下拉(浮空),还可选:GPIO_PuPd_UP,GPIO_PuPd_DOWN
* _, U* ]4 N: w - GPIO_Init(GPIOC, &GPIO_InitStructure); // 初始化GPIOC的0脚为模拟输入模式
# f% x# l2 k" Y* Y - # ?# V8 J- _( x) y) d N
- //GPIO配置为 复用输出模式
5 |2 E/ T+ K9 v8 X1 ] - GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; // 配置使用的GPIO管脚号:97 a( e& |6 J7 A" r9 T( _* v9 q
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; // 设置GPIO的模式为复用模式
$ U/ G) r \6 ^6 c# e - GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; // 设置端口输出类型为:推免输出+ T3 D# U' E9 e7 t$ X6 U1 H
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; // 配置 I/O 口的速度为:50MHz,还可选:GPIO_Speed_2MHz,GPIO_Speed_10MHz
# Z* i# p/ K$ I3 k4 P- Z, P" K - GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL ; // 配置 I/O 口的上拉或下拉:无上下拉(浮空),还可选:GPIO_PuPd_UP,GPIO_PuPd_DOWN
" f6 @4 E; E$ g: \6 }: `) x3 ~, K - GPIO_Init(GPIOA, &GPIO_InitStructure); // 初始化GPIOA的9脚为复用推免输出模式
. q* L! _5 ^! t% s J9 O - GPIO_PinAFConfig(GPIOA, GPIO_PinSource9, GPIO_AF_2); // 配置GPIOA的9号引脚复用为 TIM1_CH2 定时器1的通道2输出引脚
/ `1 n' |8 Z1 f. Q9 r - 6 w; J6 S- P% r2 K$ L7 X
- }
复制代码
: {. A' g) z& y/ d* g$ @ w4 f4 n" d& I% t+ L* P a
5.2【HAL库】的配置方式
" a8 d$ ]& j/ }: E$ X3 o步骤:
+ W4 K4 g' p+ d4 x U8 Y1、通过STM32CubeMX软件配置RCC时钟" Y. s; Y5 v, d6 [
) O' I8 q! [1 P/ l3 R" \" t q+ _0 a$ ]
6 k6 K& p# C) |0 l选择【Clock Configutration】选项卡进行时钟的设置,如图下图:
/ N& F) x1 Y. {& J
( w3 d, H, U2 Y4 S, X3 ^4 P2 C, w' ]2 n, d4 Y
2、选择需要配置的GPIO引脚的输入输出模式,这边的配置只是一个大方面的配置,比如是要配置为输入还是输出
( V( i9 M, C# x6 t
; S# A( v P; s, ^% H3 {8 P* O# y0 o: d6 a# x/ s
F% R7 W! O9 u0 W' R( k! X
下面进行每个管脚的具体参数配置
' t# H1 D W4 N. [) \. Q! R' J; C* s8 ]. M: R3 m' Z4 m
) ?6 }% Z" ~; z# T( j. |4 z' J2 q. H9 ~
点击 上图中的 GPIO 后会在左侧显示所有使用到的GPIO管脚,进入如下界面,点击每一个管脚可以进行详细配置:
( Y/ s+ `( }) l- r6 i
' e! C, c* A0 o- m9 U: z6 [4 m# g1 h' H1 ?% P8 v' R F
# a3 c8 n1 n; ]' z
: I- x# A$ E& Q9 `7 V u' e! b" z7 ]! y3 m$ u# [
在【gpio.c】文件下,查看生成的GPIO工作模式配置代码,此处配置的是推免输出、开漏输出、上下拉输入和模拟输入的引脚* ]$ r# i* O6 Z6 Z- W& w+ N$ v' {
+ _6 j) i: O# l
- void MX_GPIO_Init(void)
3 a; [ X6 C- \( I; `0 a z. e - {/ H/ ?0 ^0 m, q3 O
+ b: @0 @" ~* ]- GPIO_InitTypeDef GPIO_InitStruct = {0};
8 d" M. P' U8 N2 U - ?' n, `9 S$ G: M
- /* GPIO Ports Clock Enable */
2 ^7 S9 ^4 F: n0 }; c8 W9 O! n - __HAL_RCC_GPIOC_CLK_ENABLE();( E8 d& T0 ?) y
- __HAL_RCC_GPIOF_CLK_ENABLE();
5 M3 e* t. A, B1 m - __HAL_RCC_GPIOA_CLK_ENABLE();; k3 U) v# u/ b3 u! m! ]
- $ b! @7 w/ v# I- D0 T% c/ R
- /*Configure GPIO pin Output Level */, S" H5 Z. |( P
- HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0|GPIO_PIN_1, GPIO_PIN_SET);
& N; t' z% s3 o" G: h6 F
; A2 e; Z v) E9 S: Q3 d- /*Configure GPIO pin : PC13 */
' L) |, T: [1 T - GPIO_InitStruct.Pin = GPIO_PIN_13;
) |3 u$ @: A. R" m" e - GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
. h4 M" |+ y) D) A2 b - GPIO_InitStruct.Pull = GPIO_PULLDOWN;5 G7 B) R4 V/ H! L- s6 V3 r% h- I" q
- HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);, Q4 F7 e! S5 ?
& R+ ]/ @6 D( _5 x# i" W& N: L- /*Configure GPIO pin : PC0 */" ?$ }- e% Q2 S, C% }& u' @# |
- GPIO_InitStruct.Pin = GPIO_PIN_0;) P# K. t) t) [* m N# [) A1 @
- GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
1 O4 r8 h: }" t: a) }% J - GPIO_InitStruct.Pull = GPIO_NOPULL;
9 K: [: }4 O" I7 ~ F - HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);; K7 v0 T w) I# C: A$ ^# Y
- - H+ b) ^4 j+ c* K; w" F+ D
- /*Configure GPIO pin : PA0 */, M0 k [* n5 m( n0 [: i5 j, Z
- GPIO_InitStruct.Pin = GPIO_PIN_0;, i' i' t" u5 `" w3 y* [- Y
- GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
6 }: Y! G& c+ `4 Y ], I/ ? - GPIO_InitStruct.Pull = GPIO_NOPULL;0 \/ r F. I; }" E6 ?
- GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
1 p! h% c2 i! F+ ^$ x4 b$ T0 I - HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
. @6 | S" k+ j" [' D! q
0 K. C. [7 ]6 Y5 g, T& e" w3 F# R8 t- /*Configure GPIO pin : PA1 */+ e9 O3 F1 U# i6 m& J k
- GPIO_InitStruct.Pin = GPIO_PIN_1;
6 X: \" c Y. L6 V8 e0 @7 y( j - GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_OD;" `2 G4 x& S( l" {+ y; g1 D. i
- GPIO_InitStruct.Pull = GPIO_NOPULL;5 s$ y/ |1 H# T/ R1 J
- GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
# g+ ^1 j; O- v3 K - HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);) R7 _' i0 [8 s$ Z" U
4 ]1 D) R7 H6 p9 {$ E- /*Configure GPIO pin : PC12 */6 q J3 h; N) g* r w# g8 C
- GPIO_InitStruct.Pin = GPIO_PIN_12;
; d3 c; {5 t8 o# {7 X' l3 m" x - GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
& e( k& `4 O1 a9 V - GPIO_InitStruct.Pull = GPIO_PULLUP;
* h; `/ n+ V# j x/ h - HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
" S6 y$ o* D7 n9 _1 S: I
6 w" J' b$ ]$ h" s' j- }
复制代码
' q( t) n" m. ]- _! B至于复用功能的引脚,比如此例中将 PA9 复用为 TIM1_CH2 定时器1的通道2,则需要在tim.c文件中查看代码,一般都在相应外设的初始化源文件中! H% \' y( C9 x/ E# K
3 a0 M/ y0 q3 O! M( o+ {
- void HAL_TIM_MspPostInit(TIM_HandleTypeDef* timHandle)
9 a7 G. V' R- } - {
) n* D$ y0 \/ Z- B& ?$ O0 a+ b - # c) Y0 f3 c7 U [
- GPIO_InitTypeDef GPIO_InitStruct = {0};
$ C4 B K: O) N* T# H8 e/ z9 y& x% ` - if(timHandle->Instance==TIM1)7 ^" l; L+ m' t
- {
: F3 a7 t; s1 e4 {$ G - /* USER CODE BEGIN TIM1_MspPostInit 0 */2 F3 f# C* ~+ j. A7 { Q1 M
7 a9 S$ F, \/ b! o; t; P" w8 y3 M- /* USER CODE END TIM1_MspPostInit 0 */
0 e5 y: E3 A) O7 y; G* P8 f
/ f( N7 W* J8 R1 _ _. e7 h- __HAL_RCC_GPIOA_CLK_ENABLE();5 X, ]. V1 `+ Z5 c5 U* P* n; T
- /**TIM1 GPIO Configuration % U. F0 |9 ^: l# J; _% f, U" t8 S6 L
- PA9 ------> TIM1_CH2 " z7 | D* S V( C+ u% b0 s
- */: i+ @; r3 @; l" Q0 u
- GPIO_InitStruct.Pin = GPIO_PIN_9; //使用9号引脚
: \0 f4 \, D+ n, j! c) H F3 r - GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; //配置为复用推免输出模式$ ^$ ~; Q1 F9 s/ E" @) G3 W
- GPIO_InitStruct.Pull = GPIO_NOPULL; //没有上下拉
% d0 o5 s! S0 P2 J4 w - GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; //高速输出! G( Q6 L3 E: E: d
- GPIO_InitStruct.Alternate = GPIO_AF2_TIM1; //复用为定时器1的通道2, L; P3 t* ?& c E& L0 A
- HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);0 B. A9 D- z9 j
: Y3 T2 I# K$ o+ O" P- /* USER CODE BEGIN TIM1_MspPostInit 1 */7 Q8 u' z# K: m" s% ~# U2 `. _" T1 w
- 7 `" B. a. c" t8 W0 A$ e+ B! H
- /* USER CODE END TIM1_MspPostInit 1 */
7 q" |0 t/ F# h3 Z* z, `" q5 V - }
9 z' {% }; H9 t5 W( \ - ! H* o+ e7 J/ E9 I+ i' L
- }
复制代码 0 |- [, T9 R/ f% B6 N& \
至此,关于STM32F0系列的GPIO的配置以学习记录完成,如有不对的地方,希望各位看官指出,谢谢大家!
* T; Z* r, M4 X4 U- p$ l
/ A* W; C0 |- i5 ?! k8 n1 u1 z
F0 ]# C, Z/ }1 Q% n* Q* J& V7 k. e
& K! T2 {0 K$ j7 k- G6 d3 ~ |