1、GPIO介绍
. M) c* ?/ ~1 |) a# @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)+ X; Q% @9 O% g9 X; Z/ h
% p) h3 H( S; w& Y6 Y: x( _7 g1 m2 U2、GPIO主要特性
3 _3 W l. d# [( a, Q) g# @输出状态: 带有上拉或下拉的推挽输出或开漏输出
( D; \9 e+ T/ B! r g/ V# m从输出数据寄存器 (GPIOx_ODR) 或外设 ( 复用功能输出 ) 输出数据
& z/ K6 A' a* d$ S6 t" k1 K. `可选的每个 I/O 口的速度
7 e" P7 M( |/ B; ]1 \/ o输入状态: 浮空、 上拉 / 下拉、 模拟输入
# s7 H5 q, a- O从输入数据寄存器 (GPIOx_IDR) 或外设输入数据 ( 复用功能输出 )
1 F$ U4 T! `3 p0 Y位置位 / 复位寄存器 (GPIOx_BSRR) 为对 GPIOx_ODR 寄存器提供位访问能力
5 [5 t$ L5 [# D' k- O }4 w9 @- Q% QGPIO端口锁定机制(GPIOx_LCKR) 配置( }- I% u: e- u1 U
模拟功能
9 f* y% r% v) {5 A% ^; F, o: r可选的复用功能
9 U9 S/ Z o" m; J每两个时钟周期快速切换I/O值的能力7 d3 U* L/ A/ Q) f
允许GPIO口和外设引脚的高灵活性复用
7 _/ r3 J2 O0 Q4 [5 V( B! G% [. a0 M$ W7 {
3、GPIO 功能描述
! w4 ^4 B, M! l* J根据数据手册中列出的每个 I/O 端口的特定硬件特征, GPIO 端口的每个位可以由软件分别配
3 u* C3 W( u" e/ W( j- b置成多种模式:/ {) u! y) L/ P1 i! F
. |; X- r! u2 Q, Z5 `( M3 h浮空输入* B2 r5 ]8 ?$ H" d; C, G
上拉输入% E, V1 \! y" D2 C: v+ B
下拉输入8 B# b4 `# K) y$ S/ {. o+ v, q* l
模拟输入
# x% ^3 H0 \9 |& E具有上拉或下拉能力的开漏输出/ h# K. V" M9 g" F7 k' D$ }
具有上拉或下拉能力的推挽输出/ W5 Z [1 J2 c
复用功能且具有上拉或下拉能力的推挽输出5 _6 d# q1 n: G9 c) P
复用功能且具有上拉或下拉能力的开漏输出' O8 `. K; {. b" J/ B
每个 I/O 端口位可以自由编程, 然而 I/0 端口寄存器可按 32 位字, 半字或字节访问。 GPIOx_
3 f6 V: I& r5 |* r% r1 K) F; ]BSRR 寄存器允许对任何 GPIO 寄存器进行位读 / 改写访问。 这种情况下, 在读和更改访问之6 b; V' h5 o5 S) c9 m0 H% ]. M# a) ~
间产生 IRQ 时也不会发生危险。
9 q( \: U Y' ~* p! B* q
0 ?* c5 Q6 x# g h+ c6 q* Z标准I/O端口位的基本结构
: F- t- o& D6 ?4 ]/ T% C
" F5 @% D0 w6 E o& E, l' n! w+ Y% ?, K' s# n- U
$ E: ^# z4 `8 Q% |- t& y3 N
5V 容忍I/O端口位的基本结构2 h ~% Z$ w4 X( P1 b+ X# [1 S/ q, p
. u2 i; D, p: J
: B2 V. S& u- \0 S- m" k1 c* v5 Z! I3 y' v$ ?7 D" k
4、GPIO端口配置说明
! D8 }- U g. {. W7 `. b. W① GPIO模式4 C& I0 D9 T/ n5 |
GPIO_Mode_IN 输入模式 ( 复位状态 )1 d1 b* C3 J4 J
GPIO_Mode_OUT 通用输出模式
4 I: e8 H T0 W! ZGPIO_Mode_AF 复用功能模式- M/ B7 [, i8 W% M6 p% }! f6 g
GPIO_Mode_AN 模拟模式
3 f5 D4 p3 H$ C& w. Q6 m3 c% ^* {! j2 Q' ]/ O5 t4 _5 Y' t& Z
输出模式类型:, |- _! P4 {* V" x
GPIO_OType_PP 推免输出: }! h$ F1 |3 M' o
GPIO_OType_OD 开漏输出, f6 v& I: b# t( S5 [- b* ^3 \
1 r! O% a) R0 T- r8 G* [
② 是否带上/下拉
8 A- H# |+ C9 t% w" Z0 [6 p0 RGPIO_NOPULL 不带上/下拉* _' b8 D$ Y! E6 k' J, K
GPIO_PULLUP 带上拉# f( P7 m1 X$ s% T
GPIO_PULLDOWN 带下拉: e; |- F q1 e, h, F5 w3 L
, \: T# l) R9 D( o
③ 输出速度3 t. k# E& j# ~0 `
GPIO_Speed_2MHz 2 MHz
) h3 _3 z r' ^. q- YGPIO_Speed_10MHz 10 MHz2 ~- H: y- h' B, b& z! r
GPIO_Speed_50MHz 50 MHz
. h C- P" U3 b2 r9 s$ b
" K+ z5 V6 i3 _) m: ?( ~* ~ D5、GPIO工作模式配置$ |+ z( u5 I3 w. ?' ?7 m4 d
5.1【标准库】的配置方式" q# p: v9 _" ]0 d9 E
步骤:
$ C4 t) z# K# ?: F5 E+ b* K1、配置对应端口的RCC时钟1 ^- J+ ~5 X6 O4 I, v
/ ^$ z# r4 k" W: V8 \; |- v% g
- /************************************************
& M6 y7 |" L; D. ^5 x5 @& _# E - 函数名称 : RCC_Configuration% u& I2 V- n. }2 `' K& J. b2 V
- 功 能 : 时钟配置
/ Q' ]4 S8 F: ^. S4 f# @ - 参 数 : 无
- g0 K( b n( k9 J/ l. Y - 返 回 值 : 无/ w$ k4 L9 }6 `% G& E( N
- 作 者 : JayYang$ J5 y8 H4 v0 |
- *************************************************/
0 w: K1 j; n# P- z- U - void RCC_Configuration(void)- ~, V" f9 i( C! k
- {5 Z) V3 ^: d9 `' y
- /* 使能AHB时钟 */; S# `1 P# D) y4 E" S* J
- RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA | RCC_AHBPeriph_GPIOB |
6 s* S$ e$ t$ A' s! H2 [ - RCC_AHBPeriph_GPIOC | RCC_AHBPeriph_GPIOF, ENABLE);
+ n( W* G: d9 u - }
复制代码 ! v) L5 K3 s& u, `% {% C" q/ n. M
2、配置GPIO工作模式
: M8 O4 q0 d4 l) j9 ^' V+ j0 S4 d {5 @2 d5 T+ h( i! j" ~
- /************************************************
, u+ v. R* M$ W( o - 函数名称 : GPIO_Configuration, a H' Q+ F5 G- o
- 功 能 : 基本输入输出引脚配置 ~9 Z1 m7 R# m# c6 v% ^" |( P
- 参 数 : 无
5 u- k& q. z6 f m' ^" W - 返 回 值 : 无9 X1 a* e" [/ U% Q1 x( ^, X5 c! l; o$ I
- 作 者 : JayYang
& y: m- ^3 ? C) m - *************************************************/
) i' b9 z6 C, r - void GPIO_Configuration(void)
: v' G* U% V7 u) O - {
* f" P7 B2 i* ]6 K8 t, } - GPIO_InitTypeDef GPIO_InitStructure; // 定义GPIO初始化结构体# I: {6 n6 g$ ]: m7 b8 v/ b* p) }
' ~: R' x% n5 z1 ~6 e( S: ?- //GPIO配置为 推免输出模式% Y; H3 t. _/ ]# [' [. U9 e* O
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; // 配置使用的GPIO管脚号:0
3 _7 }4 _: q+ Y) N% h7 `5 E& F - GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; // 设置GPIO的模式为输出模式
$ u; F6 I$ C! Q4 t7 H - GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; // 设置端口输出类型为:推免输出1 l# @# `6 V6 j0 s: t
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; // 配置 I/O 口的速度为:50MHz,还可选:GPIO_Speed_2MHz,GPIO_Speed_10MHz
9 o2 P& ~) d8 A* N2 K - GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; // 配置 I/O 口的上拉或下拉:无上下拉(浮空),还可选:GPIO_PuPd_UP,GPIO_PuPd_DOWN5 y5 z1 _9 D4 @$ A( Y8 Q! P9 c
- GPIO_Init(GPIOA, &GPIO_InitStructure); // 初始化GPIOA的0脚为高速推免输出模式7 F* G+ W7 _% w6 ^8 |/ V' {
- ( G) v5 E7 Y2 g
- //GPIO配置为 开漏输出模式
- j9 K4 l1 |# Z4 u& A - GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1; // 配置使用的GPIO管脚号:1
+ j% S4 z% g6 l5 U' Q. j - GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; // 设置GPIO的模式为输出模式
, r8 E A9 z& r - GPIO_InitStructure.GPIO_OType = GPIO_OType_OD; // 设置端口输出类型为:开漏输出9 R( @% s5 P9 D: D. {, [ z
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; // 配置 I/O 口的速度为:50MHz,可选:GPIO_Speed_2MHz,GPIO_Speed_10MHz& V: b4 L1 u* V7 K
- GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; // 配置 I/O 口的上拉或下拉:无上下拉(浮空),还可选:GPIO_PuPd_UP,GPIO_PuPd_DOWN
, b3 ^- q8 }. b3 p+ H - GPIO_Init(GPIOA, &GPIO_InitStructure); // 初始化GPIOA的1脚为开漏输出模式5 I4 T* ?0 I1 Y7 z s' s* Q0 x
- : C6 R7 s+ D% z' }' U* b
- //GPIO配置为 上拉输入模式
) X3 n. U) v2 `5 [5 q8 L) G - GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12; // 配置使用的GPIO管脚号:12
7 w( {; t1 }0 A5 ~# D: V X# G - GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN; // 设置GPIO的模式为输入模式
6 f' z1 `2 p& I" ~, i$ u - GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; // 配置 I/O 口的上拉或下拉:上拉,还可选:GPIO_PuPd_NOPULL,GPIO_PuPd_DOWN
! g4 A* d0 @7 K& z2 V) u2 h - GPIO_Init(GPIOC, &GPIO_InitStructure); // 初始化GPIOC的12脚为上拉输入模式7 p6 Q/ [7 E. w! }$ {: P
- 4 S- N: @+ K, x1 \/ X8 V
- //GPIO配置为 下拉输入模式
6 D) z) h5 g3 R! z% u9 y. i - GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13; // 配置使用的GPIO管脚号:13: q9 z! O: ?7 H, j7 R
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN; // 设置GPIO的模式为输入模式, M, A4 S# W9 b) L7 h6 Y: _* s
- GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN; // 配置 I/O 口的上拉或下拉:下拉,还可选:GPIO_PuPd_NOPULL,GPIO_PuPd_UP
0 L7 l, y4 {1 X! {' D - GPIO_Init(GPIOC, &GPIO_InitStructure); // 初始化GPIOC的13脚为下拉输入模式
8 z, ~8 ] d3 u8 p
: e3 y5 g( W% H4 `$ r$ [- //GPIO配置为 模拟输入输出模式
' ^/ K9 ]% r( Q - GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; // 配置使用的GPIO管脚号:0; [' Q. F1 d& @# K7 ]; B
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN; // 设置GPIO的模式为输入模式
: G+ E2 i3 A/ y. \ L% ` - GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; // 配置 I/O 口的上拉或下拉:无上下拉(浮空),还可选:GPIO_PuPd_UP,GPIO_PuPd_DOWN
% ^# Q. u7 s' ?- u4 t$ k/ S B, i - GPIO_Init(GPIOC, &GPIO_InitStructure); // 初始化GPIOC的0脚为模拟输入模式
6 K0 {" K4 y I( a; ?
5 ~" S. v) Q7 o& {. E: b- //GPIO配置为 复用输出模式. U: t% ^; ~. y; k% G2 A# a' y7 A
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; // 配置使用的GPIO管脚号:9, `+ ~3 ^( ~( J. A4 f; E
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; // 设置GPIO的模式为复用模式0 \ ~/ `+ b+ }& l3 D
- GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; // 设置端口输出类型为:推免输出
: ?4 [; U1 o8 b - GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; // 配置 I/O 口的速度为:50MHz,还可选:GPIO_Speed_2MHz,GPIO_Speed_10MHz4 P9 e- w) i" l
- GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL ; // 配置 I/O 口的上拉或下拉:无上下拉(浮空),还可选:GPIO_PuPd_UP,GPIO_PuPd_DOWN
7 W5 G) G2 L0 e1 o9 l - GPIO_Init(GPIOA, &GPIO_InitStructure); // 初始化GPIOA的9脚为复用推免输出模式
5 i2 W+ V9 W1 D$ E( z7 F+ F5 l - GPIO_PinAFConfig(GPIOA, GPIO_PinSource9, GPIO_AF_2); // 配置GPIOA的9号引脚复用为 TIM1_CH2 定时器1的通道2输出引脚, Y6 t6 j* ?$ e, T2 T7 n& Z
- + {" S" X! x" p. t2 P$ ^6 L
- }
复制代码
* H9 {5 |2 d& e9 q: `% _/ e" f) v0 Q) z: E
5.2【HAL库】的配置方式
5 [2 a: |- {; u* ~$ n1 [, K# q步骤:7 f& E' {+ c k T; e4 Z# g0 h
1、通过STM32CubeMX软件配置RCC时钟! _! {" J, B% m( T9 o- m
1 t2 i# R! P9 ]) \7 k, [& W
* B7 ?8 Z0 S; b2 P2 m- }
+ M( e0 W1 F; Z/ ?
选择【Clock Configutration】选项卡进行时钟的设置,如图下图:" m8 f. e( l1 x* }! V* c
& Z% \7 E* ^4 M6 h" u
2 ?/ }$ z& Z! O/ t3 q2、选择需要配置的GPIO引脚的输入输出模式,这边的配置只是一个大方面的配置,比如是要配置为输入还是输出
) b+ b3 L7 g+ |9 \, V. v3 g Z1 L$ R- d* P. `* K+ ^" U$ Q
- a/ h" F& |: a0 l+ j1 {6 n7 N) K% j+ |; l# p
下面进行每个管脚的具体参数配置4 ~1 R: O' i( Q: F
& V3 ~! T0 a) n6 f
: i# ~ ?# x/ B& o6 R6 c
; ] V- o' L- Z) P( c* c5 G, @点击 上图中的 GPIO 后会在左侧显示所有使用到的GPIO管脚,进入如下界面,点击每一个管脚可以进行详细配置:
) U, t j2 {1 A9 K. `( n+ D7 }# d2 _6 ~, x
$ H5 C9 |( \! X1 z
M! p. s5 U8 ]3 R& x! S* n
, J' P! f/ _3 D9 e6 \) r* I, s! o8 o# r, w `3 I {: \
在【gpio.c】文件下,查看生成的GPIO工作模式配置代码,此处配置的是推免输出、开漏输出、上下拉输入和模拟输入的引脚
" c7 \3 P. F, E) _' Q/ d1 j# `, y6 K% h* E& Z e- z8 ^7 F
- void MX_GPIO_Init(void)0 ?- E o( K% i0 Z; S! [" m0 a
- {
& l. M9 {4 A9 ^* J* c7 Y& i
' p( _/ V6 l/ r/ k- GPIO_InitTypeDef GPIO_InitStruct = {0};
+ J: x$ a8 Z8 n1 c' K( E - : f$ v& ~0 E) ^- e- V1 n
- /* GPIO Ports Clock Enable */
0 S0 ?# {& z9 r - __HAL_RCC_GPIOC_CLK_ENABLE();
/ K. m" r" D* E g5 Z3 a9 { - __HAL_RCC_GPIOF_CLK_ENABLE();
+ P" ]" i- e- r/ M3 U - __HAL_RCC_GPIOA_CLK_ENABLE();
. [7 T! _0 m. `6 X5 J- s. B1 I' _ - g, T4 e. V, i3 k/ G; M$ R
- /*Configure GPIO pin Output Level */
# f6 \$ }8 L* R' L$ C9 ?+ E5 c; g - HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0|GPIO_PIN_1, GPIO_PIN_SET);( | d/ j2 r4 Y% B
% B/ z9 N! }5 e5 W5 ~- {- /*Configure GPIO pin : PC13 */. n, Z9 y1 N+ y. F/ M
- GPIO_InitStruct.Pin = GPIO_PIN_13;
5 V7 M% A& ~1 z: Z" W5 C - GPIO_InitStruct.Mode = GPIO_MODE_INPUT;1 A( y, g( X8 |4 g1 z- D
- GPIO_InitStruct.Pull = GPIO_PULLDOWN;
; o: [# O$ X$ Q- v - HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);4 W c& k9 v7 j# @# k6 G
- ! z8 z, l+ Y0 X. x, @% y9 Q) d
- /*Configure GPIO pin : PC0 */( H1 H9 N- I& e: k$ P+ D
- GPIO_InitStruct.Pin = GPIO_PIN_0;
$ f! ~. B P+ e0 v, w& l - GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
" X% `4 T# U/ t' ?, U# E2 N - GPIO_InitStruct.Pull = GPIO_NOPULL;
2 m1 G s0 y6 T- d - HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
2 {9 P7 G7 H$ r+ m) U' r4 t
# \! ^4 n( W$ W+ F- /*Configure GPIO pin : PA0 */
0 @, N% j, D9 Q8 d2 F1 | - GPIO_InitStruct.Pin = GPIO_PIN_0;7 m: ]) i6 T# P$ p
- GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
% ^1 w& u7 b0 Z4 V% r - GPIO_InitStruct.Pull = GPIO_NOPULL;
. M( o! o W8 j( W$ U - GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
4 |0 e4 C% y% e7 J3 ^9 l8 [ - HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
' n- F) Q0 o. s/ t+ O0 q - $ b, Z5 n' m3 B, y6 @
- /*Configure GPIO pin : PA1 */
/ b0 X, v9 D5 H9 J4 a( w8 V# s - GPIO_InitStruct.Pin = GPIO_PIN_1;0 P2 L5 }8 k& W3 E
- GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_OD;1 g% ]: F$ z% E
- GPIO_InitStruct.Pull = GPIO_NOPULL;" w0 J% \( V- v) k) K, ]7 H8 V
- GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
6 N) x, O! | @1 v - HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
+ ]9 A/ Z/ g% p - * U/ d1 @0 h' T3 r, Z
- /*Configure GPIO pin : PC12 */0 b2 _; P9 t2 E' ^% i* T; y* c$ }
- GPIO_InitStruct.Pin = GPIO_PIN_12;
1 [2 V' Y' k1 e5 v1 S, E2 \ - GPIO_InitStruct.Mode = GPIO_MODE_INPUT;9 I d( `8 H6 D! b) ^/ G1 Z0 p
- GPIO_InitStruct.Pull = GPIO_PULLUP;1 Y$ w9 e7 K7 ]
- HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);$ c) U- f3 y9 R0 ^
4 K/ G0 L0 W$ B9 M0 I- }
复制代码 " [3 g, q* y/ G/ b
至于复用功能的引脚,比如此例中将 PA9 复用为 TIM1_CH2 定时器1的通道2,则需要在tim.c文件中查看代码,一般都在相应外设的初始化源文件中
$ \5 ?. `& l( M- f- I
- t2 y1 g: ]( f8 Q- void HAL_TIM_MspPostInit(TIM_HandleTypeDef* timHandle)
" t, M5 w" b/ a% G j$ a- F A - {7 K# s6 a" i' h: L. l( M
- / X. M Y3 y2 T9 U# R M/ T( Q( t/ u
- GPIO_InitTypeDef GPIO_InitStruct = {0};
- [0 Z+ |! \, p$ r! D& c - if(timHandle->Instance==TIM1)
0 d# D! b1 B- q3 p5 j7 c - {' b$ l s7 T- Y' f7 w& {
- /* USER CODE BEGIN TIM1_MspPostInit 0 */
" K7 r; Y& x3 C; W0 B7 ]5 ^
4 ?, q& l# M& X8 ^- /* USER CODE END TIM1_MspPostInit 0 */
& O) Z6 u, F* W' e1 `8 s& d
% i0 V- k& Z# Q1 V4 A- __HAL_RCC_GPIOA_CLK_ENABLE();
4 A5 z7 k6 T" V6 d s- } - /**TIM1 GPIO Configuration
; B2 {( s) l9 W& ?( [7 K d7 y3 q - PA9 ------> TIM1_CH2 E: m+ N3 ~/ d* ]* y
- */
+ q0 b' B& P$ E& `) O: ^* L - GPIO_InitStruct.Pin = GPIO_PIN_9; //使用9号引脚
' ]5 d8 X. K [2 ^+ x, a& ] - GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; //配置为复用推免输出模式$ K5 r/ d6 a5 Y" `
- GPIO_InitStruct.Pull = GPIO_NOPULL; //没有上下拉
7 X, Z* n9 E% s: c- p! y - GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; //高速输出
6 Q. M+ n) m. ~ - GPIO_InitStruct.Alternate = GPIO_AF2_TIM1; //复用为定时器1的通道2
1 ]4 G+ |( H, _) K" V# ` - HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
. E& Q2 m3 B4 o* q v+ d
7 [, d% U3 H9 N; U8 t- /* USER CODE BEGIN TIM1_MspPostInit 1 */1 n4 X- W% A) k8 P" }9 @5 a4 x
- $ [' p( r# C4 P6 ]& s
- /* USER CODE END TIM1_MspPostInit 1 */: {, M7 S9 m0 I) q
- }
& E# c8 S" X9 _; Y( b - 8 m$ Z" M' P4 b& S* [6 P
- }
复制代码 0 E0 Z' g' V$ i0 K$ x3 y
至此,关于STM32F0系列的GPIO的配置以学习记录完成,如有不对的地方,希望各位看官指出,谢谢大家!
0 E7 |$ N/ J* P9 j% d- | x4 B$ Y+ k$ ]5 j* ~+ C6 O$ _7 ?. R [9 c) m
- z8 g; a2 [5 u8 I
7 l! w" k( F# t% K7 R4 p* @( a+ s* q1 D# ], }) p& o8 r' {
|