1、GPIO介绍
# }: F3 ~( ]! ~1 `; m1 z( M! Y% XSTM32F0x1/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): ~# h1 u* ?) } I1 ~
$ ?2 `, _! @: A2 j4 L, A* ^2、GPIO主要特性
O7 |5 D) ]) x$ _输出状态: 带有上拉或下拉的推挽输出或开漏输出
) Z$ J8 m8 ~5 C从输出数据寄存器 (GPIOx_ODR) 或外设 ( 复用功能输出 ) 输出数据; c$ ]0 J# N6 \) S8 x* |
可选的每个 I/O 口的速度5 o; m7 u3 E$ Q V. W+ a
输入状态: 浮空、 上拉 / 下拉、 模拟输入. N$ u# W+ j! }6 T& p9 n& g2 M/ ~
从输入数据寄存器 (GPIOx_IDR) 或外设输入数据 ( 复用功能输出 )
/ q$ n. R8 {& v9 o+ d, D- q* I; _位置位 / 复位寄存器 (GPIOx_BSRR) 为对 GPIOx_ODR 寄存器提供位访问能力 {% _! y @6 ]& P! G
GPIO端口锁定机制(GPIOx_LCKR) 配置
$ t2 s0 V8 ]5 l0 n n; G4 ^1 W7 v! d模拟功能. g' y" e |& L5 u
可选的复用功能
, P1 J4 T* u5 u( Z. I _: @8 D每两个时钟周期快速切换I/O值的能力
" T4 q* W) _$ q7 t" K允许GPIO口和外设引脚的高灵活性复用1 z1 L0 r7 f% v
4 K" V* M3 J4 ]" m3 U5 P3、GPIO 功能描述
' z; U) A. C; {/ ^根据数据手册中列出的每个 I/O 端口的特定硬件特征, GPIO 端口的每个位可以由软件分别配( B5 [9 C$ b8 X; d
置成多种模式:
8 [, E. t. L, ]# E" F; k
- S4 T% t$ g/ _4 ~# t8 A浮空输入& q3 G) K' T9 c
上拉输入
6 g# }: b( f$ { }2 K3 v4 E/ w下拉输入
" ~; c q1 E. _8 R模拟输入
9 [1 D* E2 k' ^8 |' x/ F具有上拉或下拉能力的开漏输出
$ K& C: f7 T! s9 w具有上拉或下拉能力的推挽输出
3 Q! L; a7 ?! V5 P m- s- u- w# @复用功能且具有上拉或下拉能力的推挽输出
$ w5 k; p4 j7 m2 k; I8 T! t) v1 w复用功能且具有上拉或下拉能力的开漏输出, n: T! l" v& x/ G$ @
每个 I/O 端口位可以自由编程, 然而 I/0 端口寄存器可按 32 位字, 半字或字节访问。 GPIOx_
( k( H) D3 ~. F. C A5 l$ d$ MBSRR 寄存器允许对任何 GPIO 寄存器进行位读 / 改写访问。 这种情况下, 在读和更改访问之% G" U4 k ?( o2 B2 t5 d
间产生 IRQ 时也不会发生危险。+ q0 s, t7 P* P; v9 D
: T4 T+ a) A- ^) x0 j' W; ]
标准I/O端口位的基本结构
/ n3 P) m$ _ c/ _4 q
8 K! b, T$ r4 o- W9 j5 m+ [5 b( q
; V' Q) P# W; J+ _' ^6 k6 A* ~3 f4 r
$ C7 d: A2 N* Z$ c2 ] p* \, H5V 容忍I/O端口位的基本结构+ P e. }9 z y1 R' B# n
1 F) k+ l5 f8 k. B; l0 c+ n: {2 p8 D+ M* t- x/ `
' x7 `/ R5 _4 ]" [
4、GPIO端口配置说明
! `9 L& f8 N' L# @: ?1 f0 A9 P① GPIO模式( y6 j6 Y' L: F' p
GPIO_Mode_IN 输入模式 ( 复位状态 ). I/ p# \' V9 i' R- r1 [: v; X
GPIO_Mode_OUT 通用输出模式# p' V$ {8 g4 U
GPIO_Mode_AF 复用功能模式" y& f; X! N) a @ B$ w' x5 N
GPIO_Mode_AN 模拟模式
$ S8 y# g) |( U9 M/ `$ Q* Q& M9 S! X5 B1 s: T% q
输出模式类型:+ E9 Y& n; q2 n) u
GPIO_OType_PP 推免输出 B' B7 R" O- q, i% L+ ?! M
GPIO_OType_OD 开漏输出
9 }! A/ _8 A# [2 p* `
6 d+ h" X. c+ y6 I! N② 是否带上/下拉9 R7 q" i' ~4 {* O( z8 S( [7 N
GPIO_NOPULL 不带上/下拉
_% n1 L' [: Z$ p# C4 dGPIO_PULLUP 带上拉! ^* Q" p m' ]% x9 _+ n z% C
GPIO_PULLDOWN 带下拉1 B8 C$ ?8 V% E' H$ p2 \/ m
4 h' y) ?' C2 E# g! Z③ 输出速度
5 \, [& D' S" N6 Y9 E3 s# ^GPIO_Speed_2MHz 2 MHz
+ L+ A! p3 l G6 \GPIO_Speed_10MHz 10 MHz, T* r- n5 e; R# X
GPIO_Speed_50MHz 50 MHz6 i! D! W" P: ~' |
3 C1 N, o+ o0 D5、GPIO工作模式配置& R* ]* G5 a$ y2 O: m, u
5.1【标准库】的配置方式
& d( z* e! n8 f; O/ m步骤:
2 y- ~: r3 H% @ o4 z1、配置对应端口的RCC时钟; o5 J1 F" P: o; h* c
2 M9 u4 J G) X& Q7 U+ m( s
- /************************************************
* D# p# ~9 P/ U. Z7 m - 函数名称 : RCC_Configuration$ Z9 @, G* F: ~4 s# x, A( o5 }
- 功 能 : 时钟配置' R! D! L7 S$ c; U. y- P
- 参 数 : 无
) F7 v" |! w Q1 Y: s% F5 d - 返 回 值 : 无: ~$ |# b x& j# @
- 作 者 : JayYang
/ P {+ z0 p; @0 [3 }1 x# ?4 K9 b - *************************************************/
( C" C$ l) w6 p3 I) ~ P3 { - void RCC_Configuration(void)3 l' s1 T/ y, }* o8 V6 L8 _
- {% X; m! u; _/ P, Q D& `' x+ ~, B
- /* 使能AHB时钟 */6 K4 H; m2 A, a( f6 j6 x: `) P: y
- RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA | RCC_AHBPeriph_GPIOB | - O' p+ ~" f- H( h( ^5 Q" T
- RCC_AHBPeriph_GPIOC | RCC_AHBPeriph_GPIOF, ENABLE);
3 J9 P) F- _) B. _; D! |+ D7 |5 z - }
复制代码
% W( L R* C5 \1 i- ^2、配置GPIO工作模式7 o4 [! q2 c0 o K
+ ~5 r' W( B/ w) u; ?4 M! \7 A
- /************************************************( K- h, Q3 ?% c' c# p6 U' E& _
- 函数名称 : GPIO_Configuration
8 x, m+ Y- y4 f. @6 t - 功 能 : 基本输入输出引脚配置$ V- \! M/ v& y0 u- b+ e& X3 F' [
- 参 数 : 无
+ i' | `1 k& G - 返 回 值 : 无- q/ H# S) o7 R V0 Q
- 作 者 : JayYang
3 f) E( |% z7 B8 ^ - *************************************************/9 K8 L6 v4 @) x0 @. \' g
- void GPIO_Configuration(void)
f( L6 f' j$ H - {
& \# B2 _. [" b+ s0 @+ Q2 U - GPIO_InitTypeDef GPIO_InitStructure; // 定义GPIO初始化结构体' E5 \3 P' y4 K9 Z; q4 T, e
- . z8 Z- R7 o4 l6 [) o9 A
- //GPIO配置为 推免输出模式, h* P/ f7 A+ |! U# A
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; // 配置使用的GPIO管脚号:0% Z) S3 l9 I4 H4 _& W
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; // 设置GPIO的模式为输出模式# s- G- q+ L5 K K
- GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; // 设置端口输出类型为:推免输出9 L s. ?! v( [! i3 r7 _7 p
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; // 配置 I/O 口的速度为:50MHz,还可选:GPIO_Speed_2MHz,GPIO_Speed_10MHz
9 @6 t! ?# e2 U - GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; // 配置 I/O 口的上拉或下拉:无上下拉(浮空),还可选:GPIO_PuPd_UP,GPIO_PuPd_DOWN
- s4 e) @+ l7 s( n - GPIO_Init(GPIOA, &GPIO_InitStructure); // 初始化GPIOA的0脚为高速推免输出模式" P; j, e# g. p0 T; W" v
- ' w% F1 s9 m* J) v- a
- //GPIO配置为 开漏输出模式! r# c$ k' [* q. w
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1; // 配置使用的GPIO管脚号:1
P! [; _& @+ V+ A) } - GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; // 设置GPIO的模式为输出模式! P& R, U3 l) J% u9 T6 C V
- GPIO_InitStructure.GPIO_OType = GPIO_OType_OD; // 设置端口输出类型为:开漏输出! L$ N* \ n) A, k; W; X) f; ^$ s
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; // 配置 I/O 口的速度为:50MHz,可选:GPIO_Speed_2MHz,GPIO_Speed_10MHz
6 O% Z+ ~( w& j, e9 ]. W A2 O2 w - GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; // 配置 I/O 口的上拉或下拉:无上下拉(浮空),还可选:GPIO_PuPd_UP,GPIO_PuPd_DOWN% ?! r. v5 i; p' d4 K. |
- GPIO_Init(GPIOA, &GPIO_InitStructure); // 初始化GPIOA的1脚为开漏输出模式2 v3 e( u/ j" w8 M
3 W/ |3 z0 E8 ?* A* b6 T* F2 W! H- //GPIO配置为 上拉输入模式; [# B! N, V9 R' ~3 y
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12; // 配置使用的GPIO管脚号:121 o" H% p7 `$ T& c6 d
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN; // 设置GPIO的模式为输入模式
( r9 \/ s) S8 U# B- U - GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; // 配置 I/O 口的上拉或下拉:上拉,还可选:GPIO_PuPd_NOPULL,GPIO_PuPd_DOWN* Z p6 n+ a# R. O5 M
- GPIO_Init(GPIOC, &GPIO_InitStructure); // 初始化GPIOC的12脚为上拉输入模式0 V8 O8 z# n' @( l! H$ D
- 4 l; O% p' a) t/ ^5 n: m8 }' l6 C/ ^
- //GPIO配置为 下拉输入模式+ A# y! T4 t9 o% } W7 @# z
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13; // 配置使用的GPIO管脚号:13. |: C! F3 g% q- t' k: Z1 A
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN; // 设置GPIO的模式为输入模式! c' h- y0 Z/ S6 l9 I1 L
- GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN; // 配置 I/O 口的上拉或下拉:下拉,还可选:GPIO_PuPd_NOPULL,GPIO_PuPd_UP2 a8 R$ z; c* w1 s
- GPIO_Init(GPIOC, &GPIO_InitStructure); // 初始化GPIOC的13脚为下拉输入模式$ M: E7 z j. _ ]' {& @
- 3 h+ k, ]" F& X8 a2 W5 t
- //GPIO配置为 模拟输入输出模式
( F2 ?# [8 @% R) I3 `; l; g& I - GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; // 配置使用的GPIO管脚号:0; C b5 {0 f( W% s7 F" p6 g
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN; // 设置GPIO的模式为输入模式
) A. p v7 c* J% }( _! h1 l - GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; // 配置 I/O 口的上拉或下拉:无上下拉(浮空),还可选:GPIO_PuPd_UP,GPIO_PuPd_DOWN2 N9 M2 ^. t3 `. r8 L7 \- h% i" D4 f
- GPIO_Init(GPIOC, &GPIO_InitStructure); // 初始化GPIOC的0脚为模拟输入模式+ A. m9 N l/ U0 I1 Y! {
- . w; V# d. ?9 ~7 r7 ^
- //GPIO配置为 复用输出模式
: |0 |: n/ k8 [; b% \/ J - GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; // 配置使用的GPIO管脚号:9
. _. Y+ n# H5 Q! G5 R# i - GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; // 设置GPIO的模式为复用模式% u5 z( s9 g& P: _5 o8 F8 a; `
- GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; // 设置端口输出类型为:推免输出" c* B+ @% i3 @# m; |& P9 H8 ~, Y
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; // 配置 I/O 口的速度为:50MHz,还可选:GPIO_Speed_2MHz,GPIO_Speed_10MHz
2 F) N' x. q ?+ T" [' a/ c- E+ `) C/ ~ - GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL ; // 配置 I/O 口的上拉或下拉:无上下拉(浮空),还可选:GPIO_PuPd_UP,GPIO_PuPd_DOWN
6 \* C+ {0 R; q; x" _+ [- X% Q: B3 v - GPIO_Init(GPIOA, &GPIO_InitStructure); // 初始化GPIOA的9脚为复用推免输出模式
8 a0 r( G5 X) r, t8 U0 V - GPIO_PinAFConfig(GPIOA, GPIO_PinSource9, GPIO_AF_2); // 配置GPIOA的9号引脚复用为 TIM1_CH2 定时器1的通道2输出引脚
9 d1 l! G F1 q' _5 E7 r2 P0 ] - % D6 W% @/ M- U
- }
复制代码 5 C7 l8 }) I( @8 N& _
/ K, F. `9 n, H6 U! y) B) w, C5.2【HAL库】的配置方式/ V# H- o) E1 n8 R" ^# ^% R
步骤:
+ F: I k, ]- z- m' z1、通过STM32CubeMX软件配置RCC时钟& b: u8 h* A$ A5 M# t; }
$ E- U0 Q9 k) f" z
- {- X4 ^% R* F3 B& c0 i: m; [& p9 |/ R" g- _$ b0 p# B
选择【Clock Configutration】选项卡进行时钟的设置,如图下图: E5 D7 @, s% R7 Q" O! D9 P; }
( ^/ a# p% v7 X/ c! ]% n1 e
% y# ^+ ?3 W! T/ K- v6 B, N6 t2、选择需要配置的GPIO引脚的输入输出模式,这边的配置只是一个大方面的配置,比如是要配置为输入还是输出9 p( ] k* `$ {1 u/ x- ^% z- c
# R$ C/ a* Y0 Z
8 x: V; h( I' E8 ?" \$ _# m2 \, p3 u1 e5 E) b+ }* O* I
下面进行每个管脚的具体参数配置
+ |4 V- e' ?0 P, p5 s% [% n. M
0 Y9 |% ^; F& N3 W" h) C) m4 c* { v6 M, ^9 L4 T- P3 C
" q7 h4 b/ s; ?
点击 上图中的 GPIO 后会在左侧显示所有使用到的GPIO管脚,进入如下界面,点击每一个管脚可以进行详细配置:
, N3 X1 S9 {0 d" @3 Q* t
* V# F% |/ E% w6 T4 H* X3 A
b: h; ^, e8 U" I9 N! Z7 v; K
. Z& H( `5 o: O/ g
7 z4 ?, p, o2 _$ w" f! ?$ A
在【gpio.c】文件下,查看生成的GPIO工作模式配置代码,此处配置的是推免输出、开漏输出、上下拉输入和模拟输入的引脚8 s6 F9 C7 o0 v
; D* ^$ ^ [! M7 G/ O6 v
- void MX_GPIO_Init(void)
% ]6 ?! C, b3 J q' Z, B8 w! p - {( q. P6 d* }" y3 I
6 P% ?$ @9 V. @: J' _- GPIO_InitTypeDef GPIO_InitStruct = {0};
7 ~% r% k; H) S$ W! ]$ Z. \% V" B - " i0 f4 K1 s+ k4 o" g! |
- /* GPIO Ports Clock Enable */
% T" `$ S( q6 ], x& J5 X - __HAL_RCC_GPIOC_CLK_ENABLE();
, X' [: C# I7 V: q) d. e7 m' n5 \ - __HAL_RCC_GPIOF_CLK_ENABLE();
+ b) I% F ]" d. { - __HAL_RCC_GPIOA_CLK_ENABLE();
. c5 T T. X+ z
$ K" B! p9 f; K1 _) S; E' N3 W- /*Configure GPIO pin Output Level */$ o5 V$ l! L4 @
- HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0|GPIO_PIN_1, GPIO_PIN_SET);5 ~1 p6 Y3 F$ t, k+ D6 J
2 d+ q. ~4 l0 ?( {- /*Configure GPIO pin : PC13 */
. j5 n# n- x9 @/ ^8 W# G% I - GPIO_InitStruct.Pin = GPIO_PIN_13;
1 {- N# ~1 x* c/ ^ - GPIO_InitStruct.Mode = GPIO_MODE_INPUT; V/ C3 W5 s {! F X/ ` A
- GPIO_InitStruct.Pull = GPIO_PULLDOWN;* ~. U o3 g: x% h: l' a6 j; e
- HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);. u6 H" ?$ d, ?- l' l
- $ H4 w( |+ ]0 o8 f3 D. h' \! p% d
- /*Configure GPIO pin : PC0 */4 j& |* ~/ F" V. e$ U
- GPIO_InitStruct.Pin = GPIO_PIN_0;
' Z6 p5 ~! L! K" h9 A1 g - GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;2 P" Z- M% u- R- K9 ]( ^5 g5 ?
- GPIO_InitStruct.Pull = GPIO_NOPULL;
6 }: Q8 w7 l; K; t' \: @ - HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
% _8 M4 B; {8 ^7 R( G7 C* x - 5 e1 [5 j* S; q- |
- /*Configure GPIO pin : PA0 */; L0 H6 A& U% l; Y% I' K
- GPIO_InitStruct.Pin = GPIO_PIN_0;
& b4 z9 P7 M; y5 H1 r - GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;4 l2 P+ @8 ~0 s
- GPIO_InitStruct.Pull = GPIO_NOPULL;
% a2 w2 k- J) M/ Q - GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
0 i2 C( o+ c [0 S5 g& ?8 h - HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);5 b1 K" v8 ]; |7 {- b
+ Q* K$ `# r z- y: w- /*Configure GPIO pin : PA1 */
Q0 Q% d" q/ f0 D1 H& G8 f' \ - GPIO_InitStruct.Pin = GPIO_PIN_1;
/ z$ J# M! P/ w! X - GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_OD;$ D S0 O, m5 o0 e
- GPIO_InitStruct.Pull = GPIO_NOPULL;3 a/ J7 i3 ^8 Z! e: n8 U: D! @
- GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;$ j: x" C, X0 V) Y- q
- HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);" S: W- p7 W3 D$ y
0 m k- s O% Q$ p7 V- /*Configure GPIO pin : PC12 */- T7 c) k# x1 h u/ W
- GPIO_InitStruct.Pin = GPIO_PIN_12;$ S/ g: K! H7 |* a" R1 c- ~
- GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
, @6 f2 g2 y% b9 n$ `8 k - GPIO_InitStruct.Pull = GPIO_PULLUP;. Q8 C+ w; L K" ~ _3 z
- HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
5 z' y& [- |4 U: Q - - v& o g) ^+ L0 `/ g
- }
复制代码
o6 z6 I. ~/ I( E至于复用功能的引脚,比如此例中将 PA9 复用为 TIM1_CH2 定时器1的通道2,则需要在tim.c文件中查看代码,一般都在相应外设的初始化源文件中: l. x% R" I0 i: f* t. X) [
0 y: s4 B! W4 ?" a! `# _6 X- void HAL_TIM_MspPostInit(TIM_HandleTypeDef* timHandle)
1 @: ?) i0 x( d9 H/ G - {9 L% }* Q% n3 h% d8 f. @( N
- ' f: W% x7 r3 |3 q
- GPIO_InitTypeDef GPIO_InitStruct = {0};2 G" d+ t2 ^2 j. \- G( o
- if(timHandle->Instance==TIM1)* e' M4 F% W8 N! j+ j' v& r0 b: M# D
- {
& b/ T- I' j5 M4 k! X: i1 X1 Y s2 A - /* USER CODE BEGIN TIM1_MspPostInit 0 */, n( c6 p% ]0 I; G& `: {" A7 y. q
2 [" E0 b7 s+ m& a5 @2 t# h6 q& Q4 R- /* USER CODE END TIM1_MspPostInit 0 */
& Y1 a, F" j) J
& r j5 q+ R6 @; A- __HAL_RCC_GPIOA_CLK_ENABLE();
& q: z& j1 A7 H' M- | - /**TIM1 GPIO Configuration
J4 K1 A, b+ p3 C" U. Y/ f - PA9 ------> TIM1_CH2 - r( l3 }3 i6 Z$ O2 m) X4 Z* h* ^
- */( c) @2 h: \; ~ |
- GPIO_InitStruct.Pin = GPIO_PIN_9; //使用9号引脚: d5 ~+ T6 X- Z6 F
- GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; //配置为复用推免输出模式) r7 _ N/ l% a6 ^4 Z- J" n
- GPIO_InitStruct.Pull = GPIO_NOPULL; //没有上下拉
9 C E% M* A$ d7 s8 t* D: A - GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; //高速输出
2 m' Z/ t t( m) ?' P - GPIO_InitStruct.Alternate = GPIO_AF2_TIM1; //复用为定时器1的通道2
# ^& [ a2 u2 r9 X9 l - HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);; S; L" @& j' e9 Y, ?
- # K1 U5 p! U6 {; w- }! ?% ]! b( D
- /* USER CODE BEGIN TIM1_MspPostInit 1 */) U+ \ }7 S! V/ f# [+ {
4 r# B# b0 }7 j# J- /* USER CODE END TIM1_MspPostInit 1 */! p) z0 j! e' Q
- }/ L6 F% V& o! n, @
- ; |% |5 g. ]: ^2 n8 V& b% g# C, g
- }
复制代码 $ M7 N, |- q. ] e: }9 ?
至此,关于STM32F0系列的GPIO的配置以学习记录完成,如有不对的地方,希望各位看官指出,谢谢大家!: W$ L* ?) _ ]' x) S- L
; @* P& I- Y' s% }, H: j
4 M' P4 R; N# U; a4 L8 H' c
9 |2 s3 N! z1 A% m' m. N Y
0 i' D. V; Z3 _1 j
|