1、GPIO介绍
$ I6 E& P1 I, z `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)' U0 d2 E4 T1 _- x! ?; }
$ d9 L/ J; w' Y& X0 a I; L
2、GPIO主要特性. z; y0 Y) N: \# c% f# B0 L% Y
输出状态: 带有上拉或下拉的推挽输出或开漏输出
4 e! `3 m3 e% ~' f. }从输出数据寄存器 (GPIOx_ODR) 或外设 ( 复用功能输出 ) 输出数据
+ ?# w0 P% H: s; ^3 |可选的每个 I/O 口的速度
6 u( P/ K% G" W输入状态: 浮空、 上拉 / 下拉、 模拟输入
2 j2 |1 ^" @# m0 o: T从输入数据寄存器 (GPIOx_IDR) 或外设输入数据 ( 复用功能输出 )
% N& p0 ?7 H5 E+ ], B位置位 / 复位寄存器 (GPIOx_BSRR) 为对 GPIOx_ODR 寄存器提供位访问能力
. W5 M7 N! l. {1 J8 ]GPIO端口锁定机制(GPIOx_LCKR) 配置0 M0 ^6 Z' Y" P- I$ y1 F
模拟功能+ F" H0 S9 ~: E! N: h
可选的复用功能3 ]- z# ~8 e7 F* u& m6 X2 }! N
每两个时钟周期快速切换I/O值的能力
# `6 C. w! M% B' l, {1 y' t0 e允许GPIO口和外设引脚的高灵活性复用 c& p* \" o2 [6 J0 R
# P, ~& O- m. c: Y( b
3、GPIO 功能描述* S W# P4 R& A: ~4 u! Q. U
根据数据手册中列出的每个 I/O 端口的特定硬件特征, GPIO 端口的每个位可以由软件分别配; N3 z$ s0 k0 T7 c4 W$ o
置成多种模式:
1 t; M+ M! b, E. J' d3 m" _- [
浮空输入
9 c6 C: ~! P/ B) u7 N上拉输入
J2 [8 X g! m/ }: ], k( ^下拉输入
8 N: D& N6 K/ g5 p模拟输入
# k2 F; T d2 ?% N具有上拉或下拉能力的开漏输出 ?+ g0 v, D$ U- L* d+ D" T
具有上拉或下拉能力的推挽输出* u- c3 ?8 o S, e- [4 Q, k9 r
复用功能且具有上拉或下拉能力的推挽输出5 d. P+ k' b+ {: N6 w3 y
复用功能且具有上拉或下拉能力的开漏输出
9 a# M' g6 D5 i T, Y8 G每个 I/O 端口位可以自由编程, 然而 I/0 端口寄存器可按 32 位字, 半字或字节访问。 GPIOx_
- O4 r: M3 F, X8 bBSRR 寄存器允许对任何 GPIO 寄存器进行位读 / 改写访问。 这种情况下, 在读和更改访问之/ v0 V( d' K' \2 D5 z# }
间产生 IRQ 时也不会发生危险。
- q0 w3 V9 Q& m3 K$ Q4 m9 U; j4 k8 ?; X
标准I/O端口位的基本结构- W T/ G4 |5 R& l: F1 @5 R
' V8 ~& }0 V6 l9 Z; c' D* c5 q* I9 x" D. H: [
' j: K6 ]( d& E1 e0 W q5V 容忍I/O端口位的基本结构
|# s) e; d' L/ G$ Y$ F2 L8 _ S* S( C3 T! t' L7 A
7 [6 p* q$ r+ B$ [- X+ I
4 W: d% E7 }, x2 W6 T2 Y& A
4、GPIO端口配置说明2 ~2 B7 y6 j& E( h! t$ ?. |
① GPIO模式
, s G" C8 I+ q2 k# u6 H F8 |GPIO_Mode_IN 输入模式 ( 复位状态 )
7 R1 T1 Q8 B" {GPIO_Mode_OUT 通用输出模式
- n) \; b8 O0 A f; zGPIO_Mode_AF 复用功能模式
, w" A' K+ O% o' A" W/ xGPIO_Mode_AN 模拟模式( r3 \ U: h: q3 j+ P* G* B/ W/ P5 a5 m- X
) d$ W; E3 C+ p- h
输出模式类型:& T; n# O# u# }+ N* [9 `% O# g
GPIO_OType_PP 推免输出" e! P% s9 e- ^/ M$ Q4 m
GPIO_OType_OD 开漏输出
5 A2 @- \* P" R/ h! F" F5 |
! C) V+ _$ j) `② 是否带上/下拉9 h( h# E1 |. ]. }3 E
GPIO_NOPULL 不带上/下拉" Q, I$ O) O! e1 T0 c, } u& z
GPIO_PULLUP 带上拉4 ^2 Z9 s% b* N+ `! ~3 z
GPIO_PULLDOWN 带下拉
& }/ N: F5 N: J0 x7 C" C8 v$ l* s: i* ?6 q0 u8 x% `
③ 输出速度# k( r- R" ?* Q, r# M7 r* }# V
GPIO_Speed_2MHz 2 MHz' `0 F x, O, B- Q
GPIO_Speed_10MHz 10 MHz
. I3 l m1 {1 Z; r, }GPIO_Speed_50MHz 50 MHz0 N- h7 Z* [9 b
3 c2 I* T3 H8 X' a& R: R. {/ w5、GPIO工作模式配置5 B, z- ]/ w$ o$ I# e
5.1【标准库】的配置方式3 @5 B$ U( r R3 ?/ e' Z
步骤:2 i4 M1 M4 @$ m- ~
1、配置对应端口的RCC时钟1 L. r( R0 t8 x6 O, [; H" j) V5 @
4 v5 a0 c/ {6 ?5 y1 X
- /************************************************
1 B" K& X4 w& X% x0 I0 L - 函数名称 : RCC_Configuration2 M, q" y& s) D! L, V, |
- 功 能 : 时钟配置
* ~& L* {/ Z3 D! e2 v% D3 B - 参 数 : 无% n* X) f) I; ?, g2 e
- 返 回 值 : 无
- }) N: d( [3 Q' }! i! {1 p - 作 者 : JayYang/ W2 o4 \9 Z4 }2 v
- *************************************************/
) D9 [$ F- y5 _ j1 w - void RCC_Configuration(void)4 N- w% U+ v/ }; q# k f
- {/ c3 m: A$ W. E! W
- /* 使能AHB时钟 */; h5 W! i* R( C/ I+ n+ p* L3 |
- RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA | RCC_AHBPeriph_GPIOB |
; X: C, r( D( Z5 x- x& @ - RCC_AHBPeriph_GPIOC | RCC_AHBPeriph_GPIOF, ENABLE);
& P' H3 t$ N5 L. I1 h - }
复制代码 4 i. }; X+ [- h1 e0 B
2、配置GPIO工作模式
; X0 _9 K: @. a- q% I
4 s* E/ Z! J4 T4 u+ u7 Y( S- /************************************************
+ c! w3 i& ?2 j. y/ J9 Q$ d0 p3 k - 函数名称 : GPIO_Configuration9 x, N2 o+ e* U& W
- 功 能 : 基本输入输出引脚配置
5 h `; j/ o5 r) [0 v4 O% A( V - 参 数 : 无
1 |2 X5 T9 J9 \! g9 W - 返 回 值 : 无$ d; t0 R+ M7 ]9 t
- 作 者 : JayYang
& a/ S C. h( T6 {" j - *************************************************/4 q+ ]$ R3 h' ]/ \
- void GPIO_Configuration(void)3 o7 R d! @ {9 X. s, Z3 O
- {2 a9 ?5 h. i8 Q5 _8 S; w% C
- GPIO_InitTypeDef GPIO_InitStructure; // 定义GPIO初始化结构体5 m5 J( `, y6 |* R
- % f G, R3 a/ \9 E- M+ t
- //GPIO配置为 推免输出模式
: K' c% W3 @, ?( x! u! l - GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; // 配置使用的GPIO管脚号:0
$ ^, M3 o% e) {5 C3 u0 C1 P3 @ - GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; // 设置GPIO的模式为输出模式
5 b8 b5 c1 U1 l; ] - GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; // 设置端口输出类型为:推免输出7 B% n/ w' k7 ?5 }7 W8 G. L
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; // 配置 I/O 口的速度为:50MHz,还可选:GPIO_Speed_2MHz,GPIO_Speed_10MHz3 e. L+ m6 Y1 ]; y& `. n: A
- GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; // 配置 I/O 口的上拉或下拉:无上下拉(浮空),还可选:GPIO_PuPd_UP,GPIO_PuPd_DOWN
* P% i' g" s4 o) ~0 K2 O; L; Q! b - GPIO_Init(GPIOA, &GPIO_InitStructure); // 初始化GPIOA的0脚为高速推免输出模式
# o# [6 p7 K% B' ^ - / H8 Z# |2 i. W- p
- //GPIO配置为 开漏输出模式
: Q, ] w( ]5 [4 M$ U* Y - GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1; // 配置使用的GPIO管脚号:15 C# ?" [# |7 p- `& j; [: ^
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; // 设置GPIO的模式为输出模式+ J( N1 x, [) Q N; ]8 B1 |
- GPIO_InitStructure.GPIO_OType = GPIO_OType_OD; // 设置端口输出类型为:开漏输出$ X) d4 I* C+ E" M+ h
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; // 配置 I/O 口的速度为:50MHz,可选:GPIO_Speed_2MHz,GPIO_Speed_10MHz% D5 |* N# `0 @! c
- GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; // 配置 I/O 口的上拉或下拉:无上下拉(浮空),还可选:GPIO_PuPd_UP,GPIO_PuPd_DOWN
/ }" ^& Z: t3 o - GPIO_Init(GPIOA, &GPIO_InitStructure); // 初始化GPIOA的1脚为开漏输出模式4 S& c, ?8 x$ h( s
- : B, t: \# C- T' `, m, W
- //GPIO配置为 上拉输入模式
. Z2 l6 L1 `8 v5 U" Y- J - GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12; // 配置使用的GPIO管脚号:12
. W/ Q- e/ v0 O* v' I% w% O - GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN; // 设置GPIO的模式为输入模式6 v) k/ Y, ^( i1 q9 V
- GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; // 配置 I/O 口的上拉或下拉:上拉,还可选:GPIO_PuPd_NOPULL,GPIO_PuPd_DOWN
8 \' B; `0 U- Y" R/ C - GPIO_Init(GPIOC, &GPIO_InitStructure); // 初始化GPIOC的12脚为上拉输入模式* t0 a. x8 d5 h2 r/ ]
2 W0 S7 @2 r: X: H% ?- //GPIO配置为 下拉输入模式2 _7 Y3 c. C; q9 S- \
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13; // 配置使用的GPIO管脚号:136 J) }5 C( L) C5 d
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN; // 设置GPIO的模式为输入模式
6 Q8 a J ?3 V: J+ G: H; q - GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN; // 配置 I/O 口的上拉或下拉:下拉,还可选:GPIO_PuPd_NOPULL,GPIO_PuPd_UP+ F& v6 o5 o3 n& Q) `
- GPIO_Init(GPIOC, &GPIO_InitStructure); // 初始化GPIOC的13脚为下拉输入模式* J7 ?3 d x8 j/ J& g" l" o
- : _+ {' c; e' b& G H
- //GPIO配置为 模拟输入输出模式8 G% ~$ _* T; F7 g( J! e6 X7 r% n
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; // 配置使用的GPIO管脚号:08 |& l; b2 T* Z1 z' K; P2 {/ \8 { }
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN; // 设置GPIO的模式为输入模式- I; p8 e& H8 x& W
- GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; // 配置 I/O 口的上拉或下拉:无上下拉(浮空),还可选:GPIO_PuPd_UP,GPIO_PuPd_DOWN, q6 t8 t0 F, u2 j4 x; H* P8 h- @
- GPIO_Init(GPIOC, &GPIO_InitStructure); // 初始化GPIOC的0脚为模拟输入模式! y' l6 C( j w- f" h. j9 E
* W) v: Y+ y9 M, T- //GPIO配置为 复用输出模式6 o1 \. e$ u# v( D
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; // 配置使用的GPIO管脚号:9
7 ]# J/ @0 |! k. q$ r - GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; // 设置GPIO的模式为复用模式 @; r/ t+ D( {
- GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; // 设置端口输出类型为:推免输出
" G' y8 D& f0 C4 N" v - GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; // 配置 I/O 口的速度为:50MHz,还可选:GPIO_Speed_2MHz,GPIO_Speed_10MHz: }# f+ @2 p8 V. W; F
- GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL ; // 配置 I/O 口的上拉或下拉:无上下拉(浮空),还可选:GPIO_PuPd_UP,GPIO_PuPd_DOWN 9 g( y. O& R, g# Y5 e% ^! g1 C
- GPIO_Init(GPIOA, &GPIO_InitStructure); // 初始化GPIOA的9脚为复用推免输出模式
1 U9 Y7 E) V6 X" I- x - GPIO_PinAFConfig(GPIOA, GPIO_PinSource9, GPIO_AF_2); // 配置GPIOA的9号引脚复用为 TIM1_CH2 定时器1的通道2输出引脚' h/ N6 I! V4 d; Q9 Z; f$ ]
! {1 b0 d/ g6 `- }
复制代码
( P+ }; \- Q5 H9 @5 Q- O" P/ N& T3 _
5.2【HAL库】的配置方式* h1 y) l/ v0 W
步骤:) N5 G3 M; @" w, P7 |( Y
1、通过STM32CubeMX软件配置RCC时钟
9 X) n+ _# x9 ?5 [% x
8 C/ t; j4 f+ k; z# a* z8 {0 S
# K3 ?& [- X( B$ L" Y+ L3 x8 E1 e: @
选择【Clock Configutration】选项卡进行时钟的设置,如图下图:# h; @; z' F. E' W( |5 ]. q
2 c0 l) g# P# u% J* I4 |
" K w8 B3 r" t# e6 t2、选择需要配置的GPIO引脚的输入输出模式,这边的配置只是一个大方面的配置,比如是要配置为输入还是输出/ x: ^% m1 a8 E6 F1 c
& a! U0 J% {7 }7 F6 G
d' g( A( Q0 u8 o6 y+ Q7 v6 K/ O* s/ H* P2 U+ B5 I- F7 h
下面进行每个管脚的具体参数配置
" k, w1 A% ~* |3 y0 ]" \# o b! g" N& l4 d
( c- f6 b2 i6 z3 Y: I
7 G! z |) E5 w. q) y# Y点击 上图中的 GPIO 后会在左侧显示所有使用到的GPIO管脚,进入如下界面,点击每一个管脚可以进行详细配置:, Y* a8 n. y. F6 e! I: u$ P( ?
' y) Z- Y! w* H3 y$ N D& C
7 U8 Z7 z$ N" i8 l
0 E4 ^: F& n# Q6 Z% M5 M" O- A% z0 s1 w% |
; x/ k4 M. V& E0 p" b6 h
在【gpio.c】文件下,查看生成的GPIO工作模式配置代码,此处配置的是推免输出、开漏输出、上下拉输入和模拟输入的引脚
# d. H5 U! M6 b" Z: g& m$ s2 \5 B
- void MX_GPIO_Init(void). {1 a# S2 I! a/ D) A- o
- {! w1 R3 ?0 b. ?1 l
' p: p# K. s4 {4 ?5 e, W7 b9 W* ]- GPIO_InitTypeDef GPIO_InitStruct = {0};
; _" A6 B# P. c1 u0 K6 ?. S - 6 s1 O% k/ s) X( d+ v
- /* GPIO Ports Clock Enable */0 ` H/ K' U) O! V4 f! y0 M
- __HAL_RCC_GPIOC_CLK_ENABLE();+ j4 W2 K* m5 b: O' s
- __HAL_RCC_GPIOF_CLK_ENABLE();0 _9 Y& C. z5 t4 Y) Y& B- z
- __HAL_RCC_GPIOA_CLK_ENABLE();- c1 L/ c* S3 O$ j
- - y$ F- c+ d* d
- /*Configure GPIO pin Output Level */- y/ A/ |' P% A% ^6 G0 U0 S. L0 {
- HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0|GPIO_PIN_1, GPIO_PIN_SET);
$ Z, d5 ?4 V! y+ {2 y0 @/ M
. i; h" Z7 q1 f, \- /*Configure GPIO pin : PC13 */
9 v% F- Y0 o9 H) G - GPIO_InitStruct.Pin = GPIO_PIN_13;
V- S* c0 N1 B; k - GPIO_InitStruct.Mode = GPIO_MODE_INPUT;+ A6 c) h3 v3 l2 ]2 ?- x, M0 _
- GPIO_InitStruct.Pull = GPIO_PULLDOWN;: W. g6 f4 u! Y4 w
- HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);$ b4 m; K7 l( i4 I$ {1 \9 a
- ; ]' ]; u% P$ v1 m( o; }0 m
- /*Configure GPIO pin : PC0 */ B) L K2 P5 R. O
- GPIO_InitStruct.Pin = GPIO_PIN_0;# f! W5 X. j* s8 {# L
- GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;" f, ^3 T0 g3 U Q) B* [; P
- GPIO_InitStruct.Pull = GPIO_NOPULL;
% l3 a) ~% v [9 z; n: T: ` - HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
% m$ J. ^+ y" N2 ^. I# U( j
6 K; N1 t% q7 G# j- /*Configure GPIO pin : PA0 */5 M; [ m$ o' d3 @; P
- GPIO_InitStruct.Pin = GPIO_PIN_0;! c- P6 Y3 H+ Y/ F: E9 p% d
- GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;( w4 M/ O s' l. S4 m/ V
- GPIO_InitStruct.Pull = GPIO_NOPULL;- z' p& L. }) p+ W* A
- GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;' ]9 v. L2 m" k! I0 J# p
- HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
, R- q( U& U5 v$ q
" O A T. ?, a( x$ a- /*Configure GPIO pin : PA1 */; j* _1 F# z% `4 N) \
- GPIO_InitStruct.Pin = GPIO_PIN_1;! v( R, L( q" |+ V+ M; V) [: O
- GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_OD;
x4 F* \8 X* y - GPIO_InitStruct.Pull = GPIO_NOPULL;
* d1 z' B+ z3 e, a/ C1 _+ n - GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
" b; S% B6 p3 z, q - HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);$ w+ h( C3 X! Y( O# {
2 h1 ~; E8 S, A2 r- /*Configure GPIO pin : PC12 */
$ v/ @5 b. P, ^ - GPIO_InitStruct.Pin = GPIO_PIN_12;
8 n( t' a% ?: q0 G7 x7 S - GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
+ z' J' ?; u: h7 y9 z G - GPIO_InitStruct.Pull = GPIO_PULLUP;
8 l: p; a: U4 b+ v - HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
# P8 n+ K" V' I" a: P - ; Z* a: Y) |5 y- h2 V5 U
- }
复制代码 , [7 u2 o. f! S
至于复用功能的引脚,比如此例中将 PA9 复用为 TIM1_CH2 定时器1的通道2,则需要在tim.c文件中查看代码,一般都在相应外设的初始化源文件中
$ z N4 ?/ n; A! I1 U, O1 `- h2 K9 S1 E8 _# N* F3 |( m1 \
- void HAL_TIM_MspPostInit(TIM_HandleTypeDef* timHandle)
" b: w0 h2 ?- L% A7 f" _ - {. l- p' e5 U; i% f7 _: V3 e
+ V" o5 @; [, q- GPIO_InitTypeDef GPIO_InitStruct = {0};
4 J g4 j& I: y# v o - if(timHandle->Instance==TIM1)+ p1 A) m" G' A( h. V
- {
; d8 O& f3 ]. ]/ H/ Y, M! B - /* USER CODE BEGIN TIM1_MspPostInit 0 */
' D5 i2 Z9 R% L4 P z7 z - 8 l; @2 H0 Q/ z0 s
- /* USER CODE END TIM1_MspPostInit 0 */
$ a/ O9 r7 l$ T! F% L7 P
( E B6 @, H6 f- O4 x* b& D- __HAL_RCC_GPIOA_CLK_ENABLE();
! Y8 |1 _0 ^ e. ]2 O* y, ? - /**TIM1 GPIO Configuration
: E& w' m# R) T/ ^8 [5 x - PA9 ------> TIM1_CH2
: o" s8 ~; P( ]- y2 N- e) o ` - */) ]& s/ C% B# R. s' L
- GPIO_InitStruct.Pin = GPIO_PIN_9; //使用9号引脚
" F9 N; r6 q7 L) h# j3 x+ A& c& J* O8 n- z! q - GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; //配置为复用推免输出模式
8 G9 }' P+ A) V$ k- t - GPIO_InitStruct.Pull = GPIO_NOPULL; //没有上下拉- v% C" m( c4 K) W( Q. T
- GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; //高速输出4 t) d& f9 v; N$ N
- GPIO_InitStruct.Alternate = GPIO_AF2_TIM1; //复用为定时器1的通道29 e# ^/ X; ~9 a, m& J: I7 G
- HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);) Q* e; y# _/ S( i4 G, t! e
- # D# X+ u9 O ^# P: z
- /* USER CODE BEGIN TIM1_MspPostInit 1 */
, v! \- ?/ K! ?2 ]3 d
% k* y* o2 b7 Q& ~3 m- /* USER CODE END TIM1_MspPostInit 1 */) G+ F5 _, [5 Q! `% ^) l* M
- }
4 {( W% i7 f# E: S( T# Z
$ v! L0 y+ s8 H, P; D. C6 ]- }
复制代码
, T% T4 V8 Z& |至此,关于STM32F0系列的GPIO的配置以学习记录完成,如有不对的地方,希望各位看官指出,谢谢大家!
, T2 M( k' h" O; t& M! E- A9 S5 c7 }. T2 g( i0 N- \
/ _! m! s/ u" L; s
0 J! X/ a/ u& b1 R
2 m( e4 [$ N/ A: R |