1、GPIO介绍
( ~; ?% h w# h1 B, @& ?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)8 `0 B, \0 w; Z1 k
6 y8 t# Y" E- ]' ^
2、GPIO主要特性( x8 \8 e4 ]8 d' m& ], F9 r2 M
输出状态: 带有上拉或下拉的推挽输出或开漏输出$ e) ^& n2 b1 I, U. [ ?) E* I- w
从输出数据寄存器 (GPIOx_ODR) 或外设 ( 复用功能输出 ) 输出数据7 j2 z! {3 @8 l% Q- U
可选的每个 I/O 口的速度5 u% K/ f2 Y! ^+ R. |( ~
输入状态: 浮空、 上拉 / 下拉、 模拟输入* _. L1 X/ B0 l
从输入数据寄存器 (GPIOx_IDR) 或外设输入数据 ( 复用功能输出 )7 g( m6 ^ Q' |
位置位 / 复位寄存器 (GPIOx_BSRR) 为对 GPIOx_ODR 寄存器提供位访问能力7 C/ ^+ a5 Y4 q' q* W/ z6 K
GPIO端口锁定机制(GPIOx_LCKR) 配置
. a) P) W, q, n模拟功能( W) @- x2 O: d$ w. X8 q- X
可选的复用功能 i' l& O* X& T4 c( H
每两个时钟周期快速切换I/O值的能力
5 }5 d) J! g. d; u允许GPIO口和外设引脚的高灵活性复用3 P$ N; D& }0 N( V6 M
; e$ K6 { _8 m+ [) D/ r* j8 c3、GPIO 功能描述- i4 U% |1 p* s3 [; E
根据数据手册中列出的每个 I/O 端口的特定硬件特征, GPIO 端口的每个位可以由软件分别配
& ~ }$ M$ r. t6 _$ }置成多种模式:8 S/ {$ ]! S9 S- N4 L6 M
, e# M5 v0 S0 H H浮空输入, I& b. |- ?# a
上拉输入% _- K* F% R2 g. P" N f$ Q
下拉输入6 C& m9 E7 Y; o
模拟输入
8 ]9 z7 c5 E j- l9 C% x具有上拉或下拉能力的开漏输出
2 a j5 [/ j9 [$ ?8 N( i具有上拉或下拉能力的推挽输出
- K d! Z" y" s; o复用功能且具有上拉或下拉能力的推挽输出
- L0 r4 _" \: q1 d复用功能且具有上拉或下拉能力的开漏输出
3 o4 y* L( l& X& Q" v' k8 ]每个 I/O 端口位可以自由编程, 然而 I/0 端口寄存器可按 32 位字, 半字或字节访问。 GPIOx_, G: [ a- }8 O X% |3 J4 _
BSRR 寄存器允许对任何 GPIO 寄存器进行位读 / 改写访问。 这种情况下, 在读和更改访问之
% Y$ F4 p! V+ l间产生 IRQ 时也不会发生危险。9 X+ r5 B6 l) h- l0 n
: P2 a2 q4 Z* }+ M T
标准I/O端口位的基本结构
w3 G9 d4 Z6 v' i; E0 h/ X9 Y8 z- p: D* o
# o/ j- c9 j" `: P* F
6 C8 ?& K( r/ {# `# p g* J5V 容忍I/O端口位的基本结构# \+ f, C6 p1 B8 A: _+ s
% p7 l: c3 n* [4 t! r0 N) a
2 n" d! `; ], ^5 c+ X) u
- v" m' u9 n& \$ e7 K4 r4、GPIO端口配置说明8 j+ c* R9 u9 k4 S$ {6 k
① GPIO模式7 W) H4 E4 ~6 w0 V/ D/ d" C- n1 ~
GPIO_Mode_IN 输入模式 ( 复位状态 )6 _# k; H5 w. R$ Q" S
GPIO_Mode_OUT 通用输出模式
3 {& |* E/ Q8 }' CGPIO_Mode_AF 复用功能模式
, A" N& l2 r: G" BGPIO_Mode_AN 模拟模式+ T1 `! q( E% _. p& J! E" {6 D
2 ?6 s+ T2 S! \ ?3 w5 U, o
输出模式类型:% W5 R" C- b, g2 N4 z* |
GPIO_OType_PP 推免输出
/ A& u$ w. Q& N* N/ U0 QGPIO_OType_OD 开漏输出
+ q1 @6 \' w. s
! _8 J+ @3 D& H% Z/ U② 是否带上/下拉' l, I9 `6 V; r ]3 u8 c' o7 z
GPIO_NOPULL 不带上/下拉
$ C4 c8 ~5 G( A6 fGPIO_PULLUP 带上拉
; R$ x" X6 c9 D' J% Y( cGPIO_PULLDOWN 带下拉
& J4 g( G5 W, ?2 B/ W
: D" l8 X1 L3 R) n# U$ p9 x; @③ 输出速度
) }; Y9 Z- z& Y7 ?0 i/ t4 _7 j7 EGPIO_Speed_2MHz 2 MHz6 L$ M. d! j. v& d- { ]
GPIO_Speed_10MHz 10 MHz. m( n0 A3 s! f6 n3 T; I6 A% O
GPIO_Speed_50MHz 50 MHz
) o. p6 B7 s7 N2 H! W2 N% D
8 {* w; ?; u. X) M5、GPIO工作模式配置
7 E" I5 U; F! ]5.1【标准库】的配置方式
. m, ~- ` w+ [; U9 c' ]步骤:5 [" R8 T2 H3 M. {9 i/ P" ~ p+ s: B
1、配置对应端口的RCC时钟; d% Q a# O% W) C& g' ?! @$ h6 Z; G7 x
, i8 H' }% ~0 H0 j3 \" n& k/ ~
- /************************************************% F. u+ B4 o! m" c0 \. o
- 函数名称 : RCC_Configuration2 e$ W. Z# i; P8 D* @+ k
- 功 能 : 时钟配置6 |% ?% M2 |4 }. s0 s/ P. `# x$ X& d
- 参 数 : 无
! n' d. t9 m# O( E1 m) c# J8 a - 返 回 值 : 无; h. P ~6 S8 S1 V( w. \
- 作 者 : JayYang$ E7 u5 ]' b; K5 w2 I7 w2 Q6 k6 o3 Q4 ~
- *************************************************/
" @9 X( P5 Y: }0 c& G - void RCC_Configuration(void)+ B* B9 h4 R: K9 S0 R @
- {
8 B/ a, Y( l& {2 x( S3 K. { - /* 使能AHB时钟 */0 r* S$ ^) C8 t0 W5 P
- RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA | RCC_AHBPeriph_GPIOB |
" O4 {7 a( x, u& w# L, D! C/ ^! F, H - RCC_AHBPeriph_GPIOC | RCC_AHBPeriph_GPIOF, ENABLE);5 H, _9 D, R+ x- Z W& z
- }
复制代码
+ r: v9 k0 ^4 \, J5 {2、配置GPIO工作模式 s- }$ z: Q5 L+ p- b' O7 c
, z' X/ y5 y9 x$ y3 H% U: N7 y- /************************************************% ~. g1 m1 M1 {% }
- 函数名称 : GPIO_Configuration
4 C9 x6 J# [ K- @ - 功 能 : 基本输入输出引脚配置
# h% d( t/ A/ V; N - 参 数 : 无
0 k6 ]0 |' K( i5 y( Z - 返 回 值 : 无
: E, M, |0 |, W8 T6 j W) z - 作 者 : JayYang2 B# J$ J& d8 e7 k
- *************************************************/3 S4 v) B0 j: @, B" n! n, P
- void GPIO_Configuration(void)
" F% p3 y W( E/ Z - {. M; [$ q; W4 @8 y! T
- GPIO_InitTypeDef GPIO_InitStructure; // 定义GPIO初始化结构体
3 \9 J: |% N" _+ Z* _. ^! L
4 T" A. L. c7 n" ?: Y- //GPIO配置为 推免输出模式$ [6 a3 u$ Y- L9 q
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; // 配置使用的GPIO管脚号:0- c7 @! |) S% Y7 ?% I
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; // 设置GPIO的模式为输出模式2 w" B. e! C6 Y
- GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; // 设置端口输出类型为:推免输出+ ], b4 S0 ^8 L! z6 W
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; // 配置 I/O 口的速度为:50MHz,还可选:GPIO_Speed_2MHz,GPIO_Speed_10MHz
, x' \2 s, Z; B. O - GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; // 配置 I/O 口的上拉或下拉:无上下拉(浮空),还可选:GPIO_PuPd_UP,GPIO_PuPd_DOWN' d# E+ ?+ ^2 x- k
- GPIO_Init(GPIOA, &GPIO_InitStructure); // 初始化GPIOA的0脚为高速推免输出模式+ E+ w" [3 d/ Y2 t( F
2 t+ Q% s' E- C2 [- //GPIO配置为 开漏输出模式; e9 a8 |. ]' K: o5 m6 f
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1; // 配置使用的GPIO管脚号:1+ v$ J S4 s# z& P2 V3 F
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; // 设置GPIO的模式为输出模式/ {/ p4 f/ M: @5 ?7 z6 l Q
- GPIO_InitStructure.GPIO_OType = GPIO_OType_OD; // 设置端口输出类型为:开漏输出
2 ]) t8 f9 U0 Y7 ?0 \# o - GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; // 配置 I/O 口的速度为:50MHz,可选:GPIO_Speed_2MHz,GPIO_Speed_10MHz
4 s2 f1 \, C" N; X - GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; // 配置 I/O 口的上拉或下拉:无上下拉(浮空),还可选:GPIO_PuPd_UP,GPIO_PuPd_DOWN- ], }+ A3 l" C
- GPIO_Init(GPIOA, &GPIO_InitStructure); // 初始化GPIOA的1脚为开漏输出模式9 X7 \4 @& N9 I, S4 e* U
8 z4 ]3 O+ V0 T" \- u5 [- //GPIO配置为 上拉输入模式
9 h/ c, ]" G# V: B8 \% P2 v - GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12; // 配置使用的GPIO管脚号:12 ] @0 I& q! {2 K1 V
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN; // 设置GPIO的模式为输入模式
" v* |5 y; y' V; ] - GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; // 配置 I/O 口的上拉或下拉:上拉,还可选:GPIO_PuPd_NOPULL,GPIO_PuPd_DOWN
" l8 L3 r6 T9 Q' S0 d/ n - GPIO_Init(GPIOC, &GPIO_InitStructure); // 初始化GPIOC的12脚为上拉输入模式
* R$ F. J0 H7 F( \ - 2 w3 u d: c! n) p Y
- //GPIO配置为 下拉输入模式2 u# `; O- ~: I% O
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13; // 配置使用的GPIO管脚号:13
" k6 r! u9 I( B8 k2 G0 i- R - GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN; // 设置GPIO的模式为输入模式, l2 ?1 z- S6 I9 ^9 M+ [
- GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN; // 配置 I/O 口的上拉或下拉:下拉,还可选:GPIO_PuPd_NOPULL,GPIO_PuPd_UP. o9 j% e# g ?
- GPIO_Init(GPIOC, &GPIO_InitStructure); // 初始化GPIOC的13脚为下拉输入模式9 S9 E! l8 D) A! J
2 X1 c9 P7 A: {% {, b% A- //GPIO配置为 模拟输入输出模式2 e2 C ?$ \4 Z n
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; // 配置使用的GPIO管脚号:0; w( w/ ]+ a8 u( A. A/ n
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN; // 设置GPIO的模式为输入模式
8 ~$ Q0 e1 _4 s1 e% o* t& n - GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; // 配置 I/O 口的上拉或下拉:无上下拉(浮空),还可选:GPIO_PuPd_UP,GPIO_PuPd_DOWN9 k7 `3 h& t' S1 t' w! ^7 x
- GPIO_Init(GPIOC, &GPIO_InitStructure); // 初始化GPIOC的0脚为模拟输入模式
! ^! d% t5 y- q7 D7 f* S
1 o, \, C( X/ R- //GPIO配置为 复用输出模式
7 @0 F* {3 M3 B$ I - GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; // 配置使用的GPIO管脚号:9
7 z) m/ {3 {& U - GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; // 设置GPIO的模式为复用模式0 r4 ^8 Q p( V2 [8 q
- GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; // 设置端口输出类型为:推免输出1 L7 l+ G/ }" t& \" r
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; // 配置 I/O 口的速度为:50MHz,还可选:GPIO_Speed_2MHz,GPIO_Speed_10MHz
4 q0 C, E2 @& N - GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL ; // 配置 I/O 口的上拉或下拉:无上下拉(浮空),还可选:GPIO_PuPd_UP,GPIO_PuPd_DOWN ' @5 h, s3 z7 B/ L
- GPIO_Init(GPIOA, &GPIO_InitStructure); // 初始化GPIOA的9脚为复用推免输出模式
( `# L/ z! h5 B - GPIO_PinAFConfig(GPIOA, GPIO_PinSource9, GPIO_AF_2); // 配置GPIOA的9号引脚复用为 TIM1_CH2 定时器1的通道2输出引脚6 X% C0 U! T0 o. n
8 W, u0 x3 M8 q- j0 v, r% V. {- }
复制代码
9 B( l7 i; I. ^# E2 X* {+ x
) U. Y4 P2 Y5 O5.2【HAL库】的配置方式
7 W: k/ t2 ?5 ^步骤:0 B# A3 Q5 D( f+ Y) y' Y) d, J" [
1、通过STM32CubeMX软件配置RCC时钟+ r) X* l' K3 c
# R6 x# f) T9 W; C2 i- D
7 x8 ?$ m9 e9 J8 `; {1 B
- E7 s* g4 h8 M& @/ }& B
选择【Clock Configutration】选项卡进行时钟的设置,如图下图:
% I l7 q2 Z% F
2 ^: P }. Z* b! W% s
/ h" u- D6 C. B6 a4 K4 q, v2、选择需要配置的GPIO引脚的输入输出模式,这边的配置只是一个大方面的配置,比如是要配置为输入还是输出
' x6 W( ]$ W3 r$ Z! U) Q* }8 I' y, C' x# k- y8 s5 x
5 p* ^% Y1 r. C7 z6 U' }0 @- ]
6 G" q/ n2 |* V5 y3 t F7 N4 e6 l
下面进行每个管脚的具体参数配置
" |3 @4 {/ j$ {& d% ^2 H% X/ R- U# y8 k: b0 V# w
! R1 E7 S" Q/ |( x
4 K2 z6 h- s! ?. [" p: G! m$ q点击 上图中的 GPIO 后会在左侧显示所有使用到的GPIO管脚,进入如下界面,点击每一个管脚可以进行详细配置:' ?4 U' g0 q4 v* F% T. e
9 s! e& e& D1 o& `2 q9 H) h# {8 ~3 P9 }6 i
7 G2 n0 P: \ u4 y( c* Y* [* [
7 g9 y0 T) d$ N8 |6 a" t8 j. I ]3 I% D" S9 y" y% @# l
在【gpio.c】文件下,查看生成的GPIO工作模式配置代码,此处配置的是推免输出、开漏输出、上下拉输入和模拟输入的引脚) ^) ?/ X9 j8 O$ s; [
/ Y* B+ @2 i7 R! K
- void MX_GPIO_Init(void)
4 y7 w2 K& l/ a( t" R, B5 N+ s- c0 A - {
# x3 M( y H' w( n( v
) I. M5 _6 \% E& N$ [- GPIO_InitTypeDef GPIO_InitStruct = {0};
- y$ J7 O& h9 v7 Z% f
6 @0 l/ O: M) ^0 }% C- /* GPIO Ports Clock Enable */
x; e6 ~! D/ S, L4 u( k! K - __HAL_RCC_GPIOC_CLK_ENABLE();9 A, Z* V' L& ~8 R* y4 Q. t( l
- __HAL_RCC_GPIOF_CLK_ENABLE();
8 i S1 n, \& t6 C - __HAL_RCC_GPIOA_CLK_ENABLE();2 t" V6 E6 a( S0 R) P, I# W
/ P' s$ n1 f; z- /*Configure GPIO pin Output Level */" N6 H6 C" n0 H# M5 I
- HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0|GPIO_PIN_1, GPIO_PIN_SET);
1 a. G* F* ?# J% W, X( p
; E u- e8 [' g, z: h( a- /*Configure GPIO pin : PC13 */
" l9 O3 t% a9 G: F - GPIO_InitStruct.Pin = GPIO_PIN_13;* O6 o6 ~: g# t3 l3 J4 P' V
- GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
9 t3 V5 K& r1 @9 Z& \- Y: @- ? - GPIO_InitStruct.Pull = GPIO_PULLDOWN;
4 h6 {4 s- v4 e4 q - HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
# f! Y- U; i6 _( d. g
9 I8 V3 Q! C& s& e' Q- /*Configure GPIO pin : PC0 */& ?2 U; U& u1 C6 p& C) T# j4 N
- GPIO_InitStruct.Pin = GPIO_PIN_0;7 Y+ Z1 J5 W3 ~+ a2 _% ?3 ]3 r
- GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;% n: Q1 l( b- [# P
- GPIO_InitStruct.Pull = GPIO_NOPULL;1 L0 j* ?$ D9 `8 v y+ _" k
- HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
m& s5 i6 }# e( \ - ( y- _4 ?) J( v4 H9 L$ O
- /*Configure GPIO pin : PA0 */
1 O2 G6 W4 f' g. ? - GPIO_InitStruct.Pin = GPIO_PIN_0;
; f2 D g3 a5 c - GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;7 f. O! q9 u- v3 t5 n
- GPIO_InitStruct.Pull = GPIO_NOPULL;
$ m4 W' K. O" U( \( j4 a8 O - GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; R& p2 L' j8 @$ k! d* |
- HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
3 a5 C# h2 w) H# n5 `+ t - . U( f& i& X; ]5 T+ V% d3 m
- /*Configure GPIO pin : PA1 */, d! h" A2 S0 N0 w3 I
- GPIO_InitStruct.Pin = GPIO_PIN_1;
/ v a- n1 i0 {& k+ Y1 Y - GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_OD;
3 r, o; g. I2 ~3 {; E o+ b+ r - GPIO_InitStruct.Pull = GPIO_NOPULL;/ _& y0 i% \ @
- GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;) m" B N, u5 z7 b w/ g
- HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
1 D# H" M' a* U3 [0 C - ( M7 D0 s3 E8 | [2 [
- /*Configure GPIO pin : PC12 */: J# f( ?: j E7 J9 X# x( C( ?$ t1 t
- GPIO_InitStruct.Pin = GPIO_PIN_12;/ b9 m5 Y' Z3 ?: `" x
- GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
; z' H2 m. p! {! ]8 y1 B - GPIO_InitStruct.Pull = GPIO_PULLUP;
: E% `2 ` q, a+ U$ `5 P( z3 B - HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
1 [5 I B2 ^, m3 \ Z: z) p - . j0 s4 R1 P, ~' [& m
- }
复制代码 5 `: H- I- o9 z$ w+ s, m) m
至于复用功能的引脚,比如此例中将 PA9 复用为 TIM1_CH2 定时器1的通道2,则需要在tim.c文件中查看代码,一般都在相应外设的初始化源文件中
3 u- n( ^0 K' K! I1 \/ X4 _! i
/ ^% S$ D" ?) c9 ^- void HAL_TIM_MspPostInit(TIM_HandleTypeDef* timHandle)3 w5 @4 V) u- @" u) {7 S$ A
- {
* J- N. W/ N% L - 0 l6 T) g% W/ j4 T) N5 [
- GPIO_InitTypeDef GPIO_InitStruct = {0}; A# p0 x' B K
- if(timHandle->Instance==TIM1)
% \$ Z9 v, r. u - {
1 L, u5 q- ?3 z, n/ Y2 Z. l% F - /* USER CODE BEGIN TIM1_MspPostInit 0 */
, L0 U9 Y1 ], p, L# a/ \ - ) Y M1 z; O9 y! q" v1 X
- /* USER CODE END TIM1_MspPostInit 0 */
: s0 c G: G6 B! g0 B: r
) B7 V+ o1 a E: s- __HAL_RCC_GPIOA_CLK_ENABLE();
& m: [( X5 h1 J4 V" g6 X) ~ - /**TIM1 GPIO Configuration 1 R9 x6 K- E3 S8 X9 Q# q" r
- PA9 ------> TIM1_CH2 ) |% z( {" n" I( {' h/ E
- */
5 E% |' O' D2 j+ h7 V - GPIO_InitStruct.Pin = GPIO_PIN_9; //使用9号引脚$ |4 z7 r5 c1 E6 c
- GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; //配置为复用推免输出模式1 d+ C& n4 T, r& `+ e. c4 z
- GPIO_InitStruct.Pull = GPIO_NOPULL; //没有上下拉
" s7 n* s& s9 @/ m( ? - GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; //高速输出& F' {$ B+ D6 t& k/ `1 ^# m
- GPIO_InitStruct.Alternate = GPIO_AF2_TIM1; //复用为定时器1的通道28 @9 f- F2 O' A& s
- HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
% d( A8 ~+ {1 y - : r6 {0 m3 N* T% L7 M
- /* USER CODE BEGIN TIM1_MspPostInit 1 */
( X( `0 h) h, V; `2 f) F. @5 u
. m& ^+ [9 A* L- /* USER CODE END TIM1_MspPostInit 1 */
' I, _$ p$ n& i* m6 Z - }& y8 g- R4 L. Q5 U3 ~7 a+ L
9 d8 C1 m% ]+ U1 k- }
复制代码
5 S! Z2 U _* n" o6 u' B& [至此,关于STM32F0系列的GPIO的配置以学习记录完成,如有不对的地方,希望各位看官指出,谢谢大家!
% }9 s% r& \& l4 z L
+ k; U% a1 k2 c$ C" S# k& p% v5 r, S( m( i6 k9 T7 f, N! ]
- E& R2 i. e. ]
( g7 r, B& e6 I4 l/ ? |