1、GPIO介绍7 {8 g4 t' k$ m2 c. |: L% q% {
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)
+ n4 N: F' M3 T0 L8 b) e0 {! `) @1 J+ ~$ g, M
2、GPIO主要特性 f' z! I4 T! E6 x' ?& [) {' F
输出状态: 带有上拉或下拉的推挽输出或开漏输出
6 Y* m) ?% f) Y7 _3 G" E从输出数据寄存器 (GPIOx_ODR) 或外设 ( 复用功能输出 ) 输出数据
# ?" M! `: R+ A8 B! l h; _4 Y可选的每个 I/O 口的速度2 u& p7 F4 ^3 e- m' W
输入状态: 浮空、 上拉 / 下拉、 模拟输入
4 e G0 }& `; X% l从输入数据寄存器 (GPIOx_IDR) 或外设输入数据 ( 复用功能输出 )
: F7 y+ Z$ Z4 ?5 ]8 U8 u& Z位置位 / 复位寄存器 (GPIOx_BSRR) 为对 GPIOx_ODR 寄存器提供位访问能力+ _0 _+ F% i: j- P3 M, ]5 C# s( }
GPIO端口锁定机制(GPIOx_LCKR) 配置
7 ^8 H1 e& \! n# i+ e5 H模拟功能+ F0 J: J5 z2 ]% @+ c7 M0 a) `
可选的复用功能0 D6 d! g4 `9 ]; U" I6 x6 P# e9 g
每两个时钟周期快速切换I/O值的能力9 P5 ~/ t9 X; r- w$ D+ K
允许GPIO口和外设引脚的高灵活性复用
' I9 D: G5 ?% G' C4 X) F2 |5 e5 [. ]( Y; V, x- y
3、GPIO 功能描述) J7 N" q4 [9 V3 B0 P2 r( U
根据数据手册中列出的每个 I/O 端口的特定硬件特征, GPIO 端口的每个位可以由软件分别配
" ]; ?7 U) S& ` O' {$ g4 a置成多种模式:
8 o8 b* w$ e! F( ], M9 \& N
+ X6 ^. D8 _7 q8 }浮空输入
% x8 D Q/ V( f上拉输入
& e: N$ b1 `7 M4 ~ Y下拉输入7 W& X6 A+ V/ O- Z
模拟输入
' D$ Z8 @8 F5 D9 j具有上拉或下拉能力的开漏输出" _* F/ _, O% D' c7 A, q) ]
具有上拉或下拉能力的推挽输出% L; J9 n6 U) _4 Q1 T# S& S# u/ L
复用功能且具有上拉或下拉能力的推挽输出: G; W( q' F# D3 F# Y6 ]! ?: |) _
复用功能且具有上拉或下拉能力的开漏输出
9 r3 T/ F% [, \/ u2 Y每个 I/O 端口位可以自由编程, 然而 I/0 端口寄存器可按 32 位字, 半字或字节访问。 GPIOx_' B, ?9 I# Z2 Q0 ^/ v/ r% `
BSRR 寄存器允许对任何 GPIO 寄存器进行位读 / 改写访问。 这种情况下, 在读和更改访问之; _5 j/ U6 G3 O3 k+ x
间产生 IRQ 时也不会发生危险。7 o6 s. \9 }( v; n9 N' e1 X5 {
, \2 m* M4 Y1 q' a/ M1 g标准I/O端口位的基本结构
* j9 X9 q- q% |+ l$ K# X+ k3 n/ [' k2 u9 e3 q$ ^# m
! v! c* Y# w" ^5 F( N5 c/ G6 v- e& E
# h' I% \4 J0 ?+ n: P5V 容忍I/O端口位的基本结构
7 H4 w" i% Z$ f( z
6 P: `- g; E/ J9 l3 q" P' U8 N; v4 z, k, ~( ?, N
5 B6 ?2 `/ `! d' B& L4、GPIO端口配置说明/ E6 w* V* U) p1 P7 k+ Y! Q
① GPIO模式
- y2 y6 n/ x0 O7 G9 C# hGPIO_Mode_IN 输入模式 ( 复位状态 )4 c% z E+ w9 t5 }* B
GPIO_Mode_OUT 通用输出模式) k/ y; H+ K4 C
GPIO_Mode_AF 复用功能模式
r4 }& w. O; l9 YGPIO_Mode_AN 模拟模式' S# ^0 V- b# l+ u. p7 B# T# u. t
2 P ]) v6 Y% ^" v; `6 y* c输出模式类型:
; j6 x- w$ Z" J/ o( B4 y" ~GPIO_OType_PP 推免输出
7 q. n4 g% J) _GPIO_OType_OD 开漏输出" L. t: e0 M( u, N( [" E
K9 o: P7 q1 Y! u
② 是否带上/下拉2 h4 x! }: [+ W0 v$ W
GPIO_NOPULL 不带上/下拉
3 e8 }( J1 G/ m/ _" o" fGPIO_PULLUP 带上拉: ]4 X) j4 ]: Y( t, n/ t; z2 A
GPIO_PULLDOWN 带下拉- c2 ~# V# {. n) |4 g n
" b: `# W# [( v# n9 ?( u, \1 |- t③ 输出速度
' C% M; z5 I7 S, [, A& t/ lGPIO_Speed_2MHz 2 MHz) p% z' q! p0 H% h* c' r
GPIO_Speed_10MHz 10 MHz
( K. W. M+ _* _8 nGPIO_Speed_50MHz 50 MHz
0 s) N [7 s z8 G" k
8 y/ M( }# Z9 _2 B; v5、GPIO工作模式配置
7 `3 @- ]: O% r5 {( B5.1【标准库】的配置方式, V$ x' i( f2 U5 E
步骤:5 M7 d9 g4 `' j* d/ Z( S! @; K
1、配置对应端口的RCC时钟
( y9 e1 w6 z4 K6 s
+ b1 h# {! p! x( f5 p8 U- y& ~: y- /************************************************
; _9 Z) `; \/ e5 v* F1 k - 函数名称 : RCC_Configuration
' @5 d0 B6 k+ \1 C- K6 j. L% x; F - 功 能 : 时钟配置
- L2 N- Q. R" H9 W9 L- v - 参 数 : 无! Z9 k* w' O& a0 h, I
- 返 回 值 : 无
+ \& x: k6 o* `, r7 t9 D - 作 者 : JayYang3 Q9 S2 t4 P+ ]: E# a) x+ c
- *************************************************/3 a# s, w5 u- ?! ?- b! r/ l
- void RCC_Configuration(void)# W2 L- k6 A- T: D
- {
. }9 ?+ c4 o0 q8 g: _# y. O8 d( x. c - /* 使能AHB时钟 */, }8 @# l5 J9 h: Q
- RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA | RCC_AHBPeriph_GPIOB | 2 P+ c( `, ~4 m9 w& A& h
- RCC_AHBPeriph_GPIOC | RCC_AHBPeriph_GPIOF, ENABLE);% _* P& T2 ~5 @' H6 x! G: |
- }
复制代码 * e5 W# E/ O9 {4 y# \' E
2、配置GPIO工作模式2 Q4 {! K2 y! ]0 W7 r r# w
# [: g/ H o# ^' U' y1 Q; K- /************************************************
2 s( u" q) ]- J; f2 h2 D, v - 函数名称 : GPIO_Configuration
0 v7 y4 F+ b3 j, _ - 功 能 : 基本输入输出引脚配置% d9 M& h$ x; M5 [2 k
- 参 数 : 无0 r& @0 b1 ?. ?, Y' g' i# C
- 返 回 值 : 无
! x8 a! ]& C* e( a - 作 者 : JayYang
# l1 B# N5 o$ @- K* e2 T1 F7 T5 H# W - *************************************************/& m/ u% y) W( s
- void GPIO_Configuration(void)
$ a3 ~- r0 z+ v8 b& |& r - {
" A# b8 H `# d$ I' T - GPIO_InitTypeDef GPIO_InitStructure; // 定义GPIO初始化结构体8 {, ^2 A# b: r2 w" Z5 l
0 A1 z9 i" y0 O- //GPIO配置为 推免输出模式
" h6 ~! v9 W* \: ]$ ] - GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; // 配置使用的GPIO管脚号:0
) V& c1 b- ~" C! M' w" X5 x6 G0 B - GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; // 设置GPIO的模式为输出模式
' L) b) g. c' D- O6 I1 [ - GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; // 设置端口输出类型为:推免输出; O K' S* K8 m6 b& o2 R% |6 q/ y5 h
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; // 配置 I/O 口的速度为:50MHz,还可选:GPIO_Speed_2MHz,GPIO_Speed_10MHz
7 I/ \5 b2 T( L - GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; // 配置 I/O 口的上拉或下拉:无上下拉(浮空),还可选:GPIO_PuPd_UP,GPIO_PuPd_DOWN
1 y9 ~2 V+ u- f - GPIO_Init(GPIOA, &GPIO_InitStructure); // 初始化GPIOA的0脚为高速推免输出模式
X6 R& ]6 C/ B+ W$ B
/ ]5 S) y2 |4 ?( i2 h- //GPIO配置为 开漏输出模式1 |2 y0 f* r& @0 X" }" W
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1; // 配置使用的GPIO管脚号:1
# M8 i& V4 f# F0 y, H9 g - GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; // 设置GPIO的模式为输出模式3 z. X }9 i: e/ h% x
- GPIO_InitStructure.GPIO_OType = GPIO_OType_OD; // 设置端口输出类型为:开漏输出 E% o. [* e- L Q7 L9 J$ q( _
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; // 配置 I/O 口的速度为:50MHz,可选:GPIO_Speed_2MHz,GPIO_Speed_10MHz: Q) W+ t# u* ^ I6 Z
- GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; // 配置 I/O 口的上拉或下拉:无上下拉(浮空),还可选:GPIO_PuPd_UP,GPIO_PuPd_DOWN) c6 p; X/ M; t7 m4 z$ L
- GPIO_Init(GPIOA, &GPIO_InitStructure); // 初始化GPIOA的1脚为开漏输出模式
: w, h# w% d; X* D% r- M0 y% B - * s% T3 |2 Y: y: A) @0 n
- //GPIO配置为 上拉输入模式
5 a- W2 \" Y8 [( D z( S# x7 }$ b - GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12; // 配置使用的GPIO管脚号:12
* P K( I) F+ W E$ W V8 k - GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN; // 设置GPIO的模式为输入模式4 ^( X: W, k7 x2 N
- GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; // 配置 I/O 口的上拉或下拉:上拉,还可选:GPIO_PuPd_NOPULL,GPIO_PuPd_DOWN
0 `% r5 O. h9 i+ \ G' r$ z1 h8 ] s - GPIO_Init(GPIOC, &GPIO_InitStructure); // 初始化GPIOC的12脚为上拉输入模式6 C, S5 ^2 N5 a6 i
6 O- P8 O' d* L- y: a7 o" _- Y4 `- //GPIO配置为 下拉输入模式9 k& N/ e$ q5 g# K1 l% z% R
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13; // 配置使用的GPIO管脚号:13) c' |3 S) d" f0 o! @$ r
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN; // 设置GPIO的模式为输入模式
, @$ L5 B; |! J t1 o3 P - GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN; // 配置 I/O 口的上拉或下拉:下拉,还可选:GPIO_PuPd_NOPULL,GPIO_PuPd_UP
% A2 ?) ~& y* t( C+ v. F - GPIO_Init(GPIOC, &GPIO_InitStructure); // 初始化GPIOC的13脚为下拉输入模式' Q8 Q. I7 i- q5 K7 s$ w
/ {4 o, _, L& Y8 y! s; R$ W1 T& ~- //GPIO配置为 模拟输入输出模式
/ a o4 w5 f: g" Z2 s - GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; // 配置使用的GPIO管脚号:0
1 P8 Z' O: z( t5 E; _6 k - GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN; // 设置GPIO的模式为输入模式
- a2 ~. m5 v8 Q4 c E, T r( P - GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; // 配置 I/O 口的上拉或下拉:无上下拉(浮空),还可选:GPIO_PuPd_UP,GPIO_PuPd_DOWN! S% t% C" w$ S: v. [+ u9 `2 N
- GPIO_Init(GPIOC, &GPIO_InitStructure); // 初始化GPIOC的0脚为模拟输入模式; X. d+ j9 F- @# p8 b7 u. J
F% Z4 S$ G. r' ]" I- //GPIO配置为 复用输出模式
: A; d$ u, ]9 W; Y* G' s: K. I" Q - GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; // 配置使用的GPIO管脚号:9
( V) V8 s3 V- r7 A+ D" T8 A - GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; // 设置GPIO的模式为复用模式! h- K R9 I) p8 Z
- GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; // 设置端口输出类型为:推免输出
3 N: K* k: \% l1 |! s8 v3 ?( E5 N0 ^$ I - GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; // 配置 I/O 口的速度为:50MHz,还可选:GPIO_Speed_2MHz,GPIO_Speed_10MHz
% v+ t1 p: V0 ~" ~) X - GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL ; // 配置 I/O 口的上拉或下拉:无上下拉(浮空),还可选:GPIO_PuPd_UP,GPIO_PuPd_DOWN 9 Z: W. n. E$ V! |0 ?
- GPIO_Init(GPIOA, &GPIO_InitStructure); // 初始化GPIOA的9脚为复用推免输出模式2 h6 S+ ?' t6 q" D& K/ s
- GPIO_PinAFConfig(GPIOA, GPIO_PinSource9, GPIO_AF_2); // 配置GPIOA的9号引脚复用为 TIM1_CH2 定时器1的通道2输出引脚
$ s. k# E+ H7 X - " q5 z! p# J$ J3 y0 y
- }
复制代码
' `* a0 y) m& J4 b
0 H& u' z5 @( p& M3 V* B5.2【HAL库】的配置方式
% Q7 _% O; s p6 r步骤:
: [0 \0 i0 z7 E s+ o- i# e# ^- H1、通过STM32CubeMX软件配置RCC时钟( D5 m% O* @% u! [
1 I& r0 G9 ^ W3 p) H- J1 k2 \% k" Y7 @' Y9 |$ D5 V5 \
1 G0 J7 d0 O% Y; G7 W选择【Clock Configutration】选项卡进行时钟的设置,如图下图:
: B1 ~8 S- }7 G% D0 q; H- ]* w3 p# v
' S. V R9 B9 ~2、选择需要配置的GPIO引脚的输入输出模式,这边的配置只是一个大方面的配置,比如是要配置为输入还是输出
6 r' Q3 A1 K2 P8 C# g; J
$ n+ o& u ]$ v6 Y" I) i0 i* a5 U) m: Z3 |
0 w, K7 e% j1 \下面进行每个管脚的具体参数配置; b% b5 O! o" O( h$ d' a
v& Z' ?! b, }) M3 g" n2 J! B0 v
2 s0 i! B0 j5 H. k8 ]- s* N
点击 上图中的 GPIO 后会在左侧显示所有使用到的GPIO管脚,进入如下界面,点击每一个管脚可以进行详细配置:
% @# p2 _$ Z j4 h4 L
* J+ e6 u% u; l% j
9 U3 j/ A* ]1 @- a! n! n1 q
& ]: E. k) S" z* k7 f0 A" _9 H: h+ c0 {
5 r5 m0 f, {$ b, ?5 G1 n, W$ A% z, F1 {# K9 k
在【gpio.c】文件下,查看生成的GPIO工作模式配置代码,此处配置的是推免输出、开漏输出、上下拉输入和模拟输入的引脚# O# t" f$ \% V+ K6 J
/ X* T- Y' m# z+ l/ ? H, w+ q/ Q
- void MX_GPIO_Init(void)& \2 X7 J! d! C8 v/ m3 ?% q
- {& X$ ]& t9 N* T- |9 [3 f
0 P b2 s' @% J$ ], R; T* e' v- GPIO_InitTypeDef GPIO_InitStruct = {0};0 l- @* E1 @: h
7 m+ e. l2 K7 f, q6 N) e& Y- /* GPIO Ports Clock Enable */
; f* ^* h& X! u6 C% Z - __HAL_RCC_GPIOC_CLK_ENABLE();( l" v3 ~# k, r: o4 s1 L4 r; X7 |
- __HAL_RCC_GPIOF_CLK_ENABLE();
6 ?& \4 U: e. r! w - __HAL_RCC_GPIOA_CLK_ENABLE();" j4 C" z! [* [0 m2 f8 c4 j
- 7 |. g6 o, L! `; Q! i
- /*Configure GPIO pin Output Level */
$ g9 ]. \4 t- C, W - HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0|GPIO_PIN_1, GPIO_PIN_SET);
+ D6 v, S7 b0 O! {4 u6 V: q% d
3 l2 f: w% R1 n. J& \4 F* L- /*Configure GPIO pin : PC13 */, D7 k' @; X( D; L+ ~0 n- E$ l
- GPIO_InitStruct.Pin = GPIO_PIN_13;! {. i7 A; A r1 C! H6 L9 R0 D
- GPIO_InitStruct.Mode = GPIO_MODE_INPUT;$ L. H9 Q# E$ R; d% ?& ?
- GPIO_InitStruct.Pull = GPIO_PULLDOWN;
6 x' F% l5 K, S" H - HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
/ u# o( o% _7 G0 }# O: i( L, w5 D
0 }6 F' H/ k- v$ J' E7 p1 E- /*Configure GPIO pin : PC0 */
6 i) k# @+ { V - GPIO_InitStruct.Pin = GPIO_PIN_0;% s+ Z) v# E7 t7 a2 ^
- GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
U! U7 s6 @0 _* } - GPIO_InitStruct.Pull = GPIO_NOPULL;
, Q# H6 v( i$ W2 |+ i - HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);% O, B5 j- C! l+ r" v6 {9 ~
- . `# P& j" Y+ [: t6 U) d
- /*Configure GPIO pin : PA0 */ m6 p9 b8 U9 [* n/ `5 C9 g9 i
- GPIO_InitStruct.Pin = GPIO_PIN_0;
# b0 y5 O: }, ^2 V! W4 L - GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;8 [4 {3 F. a/ C) U9 d
- GPIO_InitStruct.Pull = GPIO_NOPULL;' G7 e s0 u. a4 G
- GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
- [+ J1 x# [# v - HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
' I, Q E$ q2 u7 ?( x" H
2 L1 G! O$ b: E- X6 o- /*Configure GPIO pin : PA1 */, X) X. `* M. f
- GPIO_InitStruct.Pin = GPIO_PIN_1;
" Y' j% a, S4 S, o0 } - GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_OD;
& E$ |8 a+ u" F$ |: r - GPIO_InitStruct.Pull = GPIO_NOPULL;% B% p1 d3 R( R2 [" Q/ r3 O9 w
- GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;* f$ W# ^, B0 e
- HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
' ]. J( r$ s+ L, ^* _- y0 ~' c% V - , s* _6 O- B# L' R
- /*Configure GPIO pin : PC12 */- n& E. X. c" G! \
- GPIO_InitStruct.Pin = GPIO_PIN_12;( v; `7 X! |* O, F& D9 Y
- GPIO_InitStruct.Mode = GPIO_MODE_INPUT;2 U P7 y X6 a2 W, E. r/ a
- GPIO_InitStruct.Pull = GPIO_PULLUP;% m. U* y% c M
- HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);9 U! E3 d; J! q; I7 U* Z: \
0 o( T( R$ v" x* R! Y. i- W# c# I- }
复制代码
; t; |1 [$ R+ N, @8 Z至于复用功能的引脚,比如此例中将 PA9 复用为 TIM1_CH2 定时器1的通道2,则需要在tim.c文件中查看代码,一般都在相应外设的初始化源文件中
9 D0 q0 M) s! I L/ w; y4 P+ u& x: A( [- v1 G8 i: U
- void HAL_TIM_MspPostInit(TIM_HandleTypeDef* timHandle)
$ E2 V7 i) x% d2 u: Y: t - {/ E3 l" l! \1 Z! T# A+ K9 b
- ' ~( \$ S+ A; w" `
- GPIO_InitTypeDef GPIO_InitStruct = {0};
. T/ q' M' }5 [0 i9 }- S. G - if(timHandle->Instance==TIM1)
: ?8 a+ v: K' c6 h - {
7 R/ W/ X _( m9 `3 G - /* USER CODE BEGIN TIM1_MspPostInit 0 */$ E' ^& i8 ^9 D" w
- * _/ y( A0 E2 g W" O# ^% J
- /* USER CODE END TIM1_MspPostInit 0 */$ m% M$ L, P6 @
# y( K9 A' }0 Z; i) |6 s- __HAL_RCC_GPIOA_CLK_ENABLE();) S! T) V0 }2 F( P; L
- /**TIM1 GPIO Configuration % x9 u K7 s. U
- PA9 ------> TIM1_CH2
8 p c' O6 Q' _1 v4 q3 w+ L - */5 {0 Z& k9 _7 V, |+ j7 S% ~
- GPIO_InitStruct.Pin = GPIO_PIN_9; //使用9号引脚
- z# t b' B# g N! z - GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; //配置为复用推免输出模式$ K. q- A$ X; a# Y! ~3 W/ B% ^
- GPIO_InitStruct.Pull = GPIO_NOPULL; //没有上下拉
2 A9 b' f6 F/ j( B( F G* l( { - GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; //高速输出
( K" G% |# B6 `" w! P - GPIO_InitStruct.Alternate = GPIO_AF2_TIM1; //复用为定时器1的通道27 |. n6 o6 {0 v) J% h4 N6 K' j
- HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);4 W: b5 w/ ]' n/ H
- ! J7 j! d0 s( O- N
- /* USER CODE BEGIN TIM1_MspPostInit 1 */
4 v/ J* n) H* D$ U: ]
' y" G% ]! |6 ^5 V- /* USER CODE END TIM1_MspPostInit 1 */: _8 q6 v+ @- U
- }& _1 g5 v( ^( ]# x5 {
% l1 r( c) Y1 O" ~* e2 }: j ^4 H) L1 u- }
复制代码
% e |) b; e- J a: D" T2 y至此,关于STM32F0系列的GPIO的配置以学习记录完成,如有不对的地方,希望各位看官指出,谢谢大家!5 x6 m6 o% Z7 u$ S& I
) f7 r' N1 s3 e/ z0 W
) u5 f( `9 Y# c0 N1 W+ F- \
& {. J7 f+ j/ ?, k8 `) j
9 E* B8 ~7 W4 h6 |# C, C |