1、GPIO介绍! Q8 L0 Y0 e# Q) B, 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)/ m. u' t, [- F, }. C/ Q! |
; Q/ q' U2 M% L+ w" ~, z
2、GPIO主要特性
8 @& y3 J2 ?6 ]: R' R3 g输出状态: 带有上拉或下拉的推挽输出或开漏输出7 u% S- ^$ ]% x1 h4 L! x
从输出数据寄存器 (GPIOx_ODR) 或外设 ( 复用功能输出 ) 输出数据
0 e% I$ P1 E# o. \4 F可选的每个 I/O 口的速度
& [) Q% p+ p1 s输入状态: 浮空、 上拉 / 下拉、 模拟输入) g# ^! s% M: w/ R# x. U! N
从输入数据寄存器 (GPIOx_IDR) 或外设输入数据 ( 复用功能输出 )
. [+ W# u0 H( m0 |位置位 / 复位寄存器 (GPIOx_BSRR) 为对 GPIOx_ODR 寄存器提供位访问能力
0 o9 J3 _5 N; H4 W# G( RGPIO端口锁定机制(GPIOx_LCKR) 配置7 c6 W, P( r1 y5 A
模拟功能7 f2 `7 h$ q8 ?$ i9 @) b& U' B0 M
可选的复用功能
) K1 B3 y4 ]: |& x! @0 B5 W8 X# }每两个时钟周期快速切换I/O值的能力
; r; h( o" }5 E允许GPIO口和外设引脚的高灵活性复用( n; ~6 F% d5 b8 m$ G1 I8 f3 `
2 r6 Z) ]* L5 @) r7 k0 @3 d% O3、GPIO 功能描述
' E# j, P- h/ q2 T L+ n& c! ^根据数据手册中列出的每个 I/O 端口的特定硬件特征, GPIO 端口的每个位可以由软件分别配
! ~% m4 p7 `. f6 ^ p: V# y置成多种模式:
8 a5 L1 p! t0 a1 X4 u. o- ]
0 _' v% N3 y- `- }2 Z' ~浮空输入- b! c0 F. j, F. a, ~4 {
上拉输入
1 `" i, i$ e$ l" y: x5 P8 G下拉输入
$ W* S5 w2 E/ J模拟输入! D8 O( q0 A( L; m6 B0 a: w
具有上拉或下拉能力的开漏输出$ s) F- r; e; `- ^( |
具有上拉或下拉能力的推挽输出
2 v) U. W( J+ l复用功能且具有上拉或下拉能力的推挽输出& T8 H* l K$ s+ ~
复用功能且具有上拉或下拉能力的开漏输出
0 s o; y' f; r% G# b每个 I/O 端口位可以自由编程, 然而 I/0 端口寄存器可按 32 位字, 半字或字节访问。 GPIOx_
- O0 _4 S K9 E7 [" pBSRR 寄存器允许对任何 GPIO 寄存器进行位读 / 改写访问。 这种情况下, 在读和更改访问之
+ E; ~7 W% D W0 ~ ]5 j$ s间产生 IRQ 时也不会发生危险。7 b( \9 @9 T4 N4 m5 t- p
3 j1 b4 S. s# g+ ~: I! w标准I/O端口位的基本结构: ~& C, S( k% t% k' a5 @2 P
6 F3 s7 a! O% k% l# i7 t
% J/ L! A) w7 C1 ] g
" A$ e( f2 \0 V7 t' Z( T
5V 容忍I/O端口位的基本结构
7 D" w+ l5 y9 b S! \8 q* B9 q1 G$ E7 w6 f! y9 C; d$ O
, d0 c+ B- P- d9 h0 X4 ~/ L/ U9 ]: ^* x
4、GPIO端口配置说明
; b, P! ~2 o8 @# l* |5 N. c) u① GPIO模式5 R; ~2 Z8 N& F9 C' @
GPIO_Mode_IN 输入模式 ( 复位状态 )! y# \# v0 [! D# n \6 @
GPIO_Mode_OUT 通用输出模式
' Y; ]( `& H6 N8 y, bGPIO_Mode_AF 复用功能模式
! e8 Q6 l; O9 H7 ^GPIO_Mode_AN 模拟模式
/ g+ a- x' n! z
- P7 _- X6 M2 l7 K8 }+ a输出模式类型:
* K u2 t% S" K6 @7 L7 z+ E) }GPIO_OType_PP 推免输出, `0 |* ^! d& J2 F5 ~: K1 W. @
GPIO_OType_OD 开漏输出, o8 r+ x6 B& c0 F5 v, G$ h2 D6 u$ w
( O( u$ i' c' p ^9 K② 是否带上/下拉
! g4 |; J' V2 s. l! m, a8 F PGPIO_NOPULL 不带上/下拉! T' } d- L2 t7 r+ c6 m: F
GPIO_PULLUP 带上拉4 F$ S0 g# z+ |8 V
GPIO_PULLDOWN 带下拉7 a4 `3 [$ W) s2 u
, t: P9 P! [# T/ {③ 输出速度
& ] |1 q/ g7 G0 t" T/ aGPIO_Speed_2MHz 2 MHz
d$ E. o( F0 M" x4 `7 ?/ NGPIO_Speed_10MHz 10 MHz
) r/ P& x( |" a: @% uGPIO_Speed_50MHz 50 MHz e1 ?5 d! B5 n
9 Y5 I* x% n" C! ^6 n1 ?
5、GPIO工作模式配置
5 k& A% N* P; f! W5.1【标准库】的配置方式 A* I5 @% k/ r) x w" T4 t
步骤:8 V" h1 N0 |+ B9 @
1、配置对应端口的RCC时钟
: m" K1 L( q1 G9 O- W3 B3 p6 G
O# E. Y6 \7 i. j3 F$ Y7 K- /************************************************2 m( M' p" n4 ^
- 函数名称 : RCC_Configuration
2 F6 k0 e# J$ ]9 h - 功 能 : 时钟配置
7 F' ^/ l+ V! `8 y - 参 数 : 无- z' p$ Y7 _& v# X, |) ?4 b E, Q
- 返 回 值 : 无, l, g. M& ?: K' m. E- x" A8 n
- 作 者 : JayYang
# @. d# C5 \2 n$ ]( U, M8 g! K - *************************************************/
9 y2 U, G$ \% |: r% I$ o8 W - void RCC_Configuration(void)
2 q1 D; |- p2 j - {$ L7 b" Z, O( f1 t1 J
- /* 使能AHB时钟 */
/ A) E" i! P7 h3 _1 \5 @2 e - RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA | RCC_AHBPeriph_GPIOB |
b& d$ c, o, l! z2 _- @ - RCC_AHBPeriph_GPIOC | RCC_AHBPeriph_GPIOF, ENABLE);- o1 e6 K9 Z/ m& v) o. B3 @
- }
复制代码 & A2 v2 r9 H. J6 ]; ~
2、配置GPIO工作模式
# j# t% _: @. l J1 g
0 I& e' G j: y5 X8 m- /************************************************6 \; t ^, d& {0 K0 b- Y
- 函数名称 : GPIO_Configuration
" {2 d4 a( x2 b" W7 I P - 功 能 : 基本输入输出引脚配置
% M8 ~& d, ^* s3 v8 E& a1 U- L - 参 数 : 无! k, I1 b9 S$ {- W/ E
- 返 回 值 : 无
+ E5 [- W$ g7 Q, I - 作 者 : JayYang
& }2 H' N6 v" |. f. T - *************************************************/( t, A/ x+ `: E( {, Y f' i7 E
- void GPIO_Configuration(void)
% |! d7 S3 a+ H t% Q8 R$ s - {
# C# L" [$ N, ^% i( k - GPIO_InitTypeDef GPIO_InitStructure; // 定义GPIO初始化结构体2 S1 ?: y- W" I! [6 } x
- - M* Y! ^" l2 z4 c3 ]7 E: d! r
- //GPIO配置为 推免输出模式0 u/ Y4 p" t' ] u1 x' F$ Z0 \- W
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; // 配置使用的GPIO管脚号:0
% A: y% o R7 ]7 y# z9 r - GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; // 设置GPIO的模式为输出模式8 e; R E% l5 }) d, I
- GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; // 设置端口输出类型为:推免输出* U; O9 V- H6 F# m( r
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; // 配置 I/O 口的速度为:50MHz,还可选:GPIO_Speed_2MHz,GPIO_Speed_10MHz
$ K/ i) D, q; {$ c: w, ~ - GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; // 配置 I/O 口的上拉或下拉:无上下拉(浮空),还可选:GPIO_PuPd_UP,GPIO_PuPd_DOWN3 g8 V# H3 X5 G7 N% v
- GPIO_Init(GPIOA, &GPIO_InitStructure); // 初始化GPIOA的0脚为高速推免输出模式
! ?1 Z8 H0 j9 p9 U - - X- ]* T) K$ T/ C8 J" D2 r
- //GPIO配置为 开漏输出模式, E1 g9 L) i" i y) w. f
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1; // 配置使用的GPIO管脚号:1
" ]0 y. s+ g! n* g - GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; // 设置GPIO的模式为输出模式
8 z+ v4 G. T, p2 `5 A - GPIO_InitStructure.GPIO_OType = GPIO_OType_OD; // 设置端口输出类型为:开漏输出" W. u9 T. z, C2 M5 |* w2 N
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; // 配置 I/O 口的速度为:50MHz,可选:GPIO_Speed_2MHz,GPIO_Speed_10MHz
9 ? o% {3 Y/ v' J% @ - GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; // 配置 I/O 口的上拉或下拉:无上下拉(浮空),还可选:GPIO_PuPd_UP,GPIO_PuPd_DOWN
' G: n7 b/ L4 o: w) Q& L6 N - GPIO_Init(GPIOA, &GPIO_InitStructure); // 初始化GPIOA的1脚为开漏输出模式
p) s, b# J1 S! A/ H$ P0 C
. C; h3 g6 o$ U% l9 r" ^) {- //GPIO配置为 上拉输入模式
0 q/ Y9 |3 m& { - GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12; // 配置使用的GPIO管脚号:120 I+ I1 |+ E" ]1 |) H. @7 |4 K
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN; // 设置GPIO的模式为输入模式" d, b- b' W; p% F% C X! a
- GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; // 配置 I/O 口的上拉或下拉:上拉,还可选:GPIO_PuPd_NOPULL,GPIO_PuPd_DOWN x: x- n4 F6 y ~9 {
- GPIO_Init(GPIOC, &GPIO_InitStructure); // 初始化GPIOC的12脚为上拉输入模式
5 | i3 k2 w6 J4 ?* \) v4 b' y
" {5 D$ p8 w" a7 P9 n# c7 Z. ?+ {- //GPIO配置为 下拉输入模式3 S3 q( w a" W5 N7 [
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13; // 配置使用的GPIO管脚号:13
& h. a. Z) v" n9 m& |, ` - GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN; // 设置GPIO的模式为输入模式
% w7 Q, f2 A4 t# T, ]. A - GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN; // 配置 I/O 口的上拉或下拉:下拉,还可选:GPIO_PuPd_NOPULL,GPIO_PuPd_UP
6 \+ L8 i7 N y& K2 O - GPIO_Init(GPIOC, &GPIO_InitStructure); // 初始化GPIOC的13脚为下拉输入模式" _4 F, a5 ]6 \' x% n/ Y
9 M2 n) a; B$ Q7 j- //GPIO配置为 模拟输入输出模式
- {' ^9 c# u2 L/ a z - GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; // 配置使用的GPIO管脚号:0
" h9 G. \% h3 [; B+ j. J - GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN; // 设置GPIO的模式为输入模式, e5 Z' u6 C/ F
- GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; // 配置 I/O 口的上拉或下拉:无上下拉(浮空),还可选:GPIO_PuPd_UP,GPIO_PuPd_DOWN5 |. i. V% h3 k$ B- M. u% e
- GPIO_Init(GPIOC, &GPIO_InitStructure); // 初始化GPIOC的0脚为模拟输入模式3 L( j3 \# [. T! Q4 t" t) Z5 h
- 3 I# F- x$ ~( r: ]3 N& w# E
- //GPIO配置为 复用输出模式4 K N! l$ T0 n% C( g
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; // 配置使用的GPIO管脚号:99 d9 \: f2 Q9 [( }% l2 o) r- e7 ]
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; // 设置GPIO的模式为复用模式9 p2 r/ [: N2 |% L1 f
- GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; // 设置端口输出类型为:推免输出
`% N9 I4 C1 o! g - GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; // 配置 I/O 口的速度为:50MHz,还可选:GPIO_Speed_2MHz,GPIO_Speed_10MHz
5 E: k p) M! N( e1 b; n - GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL ; // 配置 I/O 口的上拉或下拉:无上下拉(浮空),还可选:GPIO_PuPd_UP,GPIO_PuPd_DOWN - A9 G+ f+ j+ H! [! H" |
- GPIO_Init(GPIOA, &GPIO_InitStructure); // 初始化GPIOA的9脚为复用推免输出模式
. A8 A8 U! [3 h g6 s/ _; m( b) h1 I - GPIO_PinAFConfig(GPIOA, GPIO_PinSource9, GPIO_AF_2); // 配置GPIOA的9号引脚复用为 TIM1_CH2 定时器1的通道2输出引脚+ S+ G6 O/ h7 h8 w4 E8 B
$ A, { Z. K& S- }
复制代码 5 Z3 T3 Y4 {0 ?
! }7 h8 x! p( G/ X5.2【HAL库】的配置方式0 n V1 ?7 v6 p- [4 v! M: U
步骤:
1 c: m8 r% w5 X3 @4 ^9 s) I6 n% A1、通过STM32CubeMX软件配置RCC时钟
4 d3 b/ f5 B% p+ n# E# D$ U
9 M5 N* V. h! h* m1 \
, e; [) J/ ~' h' C4 X% @+ B8 D. p$ C
选择【Clock Configutration】选项卡进行时钟的设置,如图下图:
* C9 a" O& L8 x& ^! p
; r1 ?/ S$ D/ n: h# Z
3 j, q; D; S( k, |9 l2、选择需要配置的GPIO引脚的输入输出模式,这边的配置只是一个大方面的配置,比如是要配置为输入还是输出
' Q4 B) T! I6 Z, `- W4 g' ?- E8 A& u/ b5 w
" k4 [. r1 O2 {/ Q' B. n& W& x, o5 r. S+ X
下面进行每个管脚的具体参数配置
4 p* T% h Q5 ?" P
$ t( u6 ~# |" I$ t" i) b, n) _; \0 F2 a6 x! F
0 X# O8 H7 M! z$ p% x! [点击 上图中的 GPIO 后会在左侧显示所有使用到的GPIO管脚,进入如下界面,点击每一个管脚可以进行详细配置:0 g4 Y' U. ~3 |0 B* M. a
. G) B$ a; f$ i B
2 D' y+ \% U$ t! B1 S- E
6 U9 [( D6 m. z8 N
2 [. J. n/ v+ Q3 n1 k. e) q) n6 f: j! s! U
在【gpio.c】文件下,查看生成的GPIO工作模式配置代码,此处配置的是推免输出、开漏输出、上下拉输入和模拟输入的引脚
% T0 F4 y) }2 o! U3 a+ r2 k! Q4 I7 @. _# w0 k8 e$ P
- void MX_GPIO_Init(void): C s4 R' {% s4 M5 @& J, n
- {# D w% f. a* y; t, L6 S
- + T* c- `; p5 C8 z3 V J7 T
- GPIO_InitTypeDef GPIO_InitStruct = {0};
0 k- G! @9 `- @0 ~+ A5 E2 n; h* r! u3 I - ( | v% b0 g P$ p, O
- /* GPIO Ports Clock Enable */
! U* Y$ j6 v2 N1 ]$ R& T$ I' X' ` - __HAL_RCC_GPIOC_CLK_ENABLE();
& w- E+ H) T, T; q2 Y/ P - __HAL_RCC_GPIOF_CLK_ENABLE();
5 t' a0 m( ]0 v - __HAL_RCC_GPIOA_CLK_ENABLE();
6 {# A9 i* S8 `& f
, ?( O2 y3 P; |, R6 q1 A- /*Configure GPIO pin Output Level */
4 ~9 I' s, I) Y5 B# t - HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0|GPIO_PIN_1, GPIO_PIN_SET);
6 v3 h M- e: m0 E4 c
# T5 ~5 E8 n' L& J) f6 A G) |5 ^- /*Configure GPIO pin : PC13 */9 j0 V, |; P* J: e, d% S
- GPIO_InitStruct.Pin = GPIO_PIN_13;8 a. k, J! e: U1 Q$ W$ W* ~
- GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
; _2 ]8 ?7 N9 c/ e4 n+ |. @) } - GPIO_InitStruct.Pull = GPIO_PULLDOWN;% E* ^ i! U8 N. ?
- HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
: L6 p G6 `7 {2 ~
: }4 X4 Z) H2 i: N* \7 F- /*Configure GPIO pin : PC0 */
1 Z ~! c5 {+ u - GPIO_InitStruct.Pin = GPIO_PIN_0;+ N# k, ?. Q ]/ G
- GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;: s3 L# m5 p, ]# Q- o: |3 v+ Q
- GPIO_InitStruct.Pull = GPIO_NOPULL;
- g: ~7 n/ q: v - HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);* r# |" R1 ]! G0 j# |5 Z& v
- ( S/ \* U E( O7 X
- /*Configure GPIO pin : PA0 */; l% {) Q, M7 d) a
- GPIO_InitStruct.Pin = GPIO_PIN_0;; `7 Z' s- X) L9 W: ~
- GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
# r$ e0 w; a$ i4 y ` - GPIO_InitStruct.Pull = GPIO_NOPULL;
* h6 s$ P. v# P5 X2 A# @+ i4 O1 O - GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;% q% D& g' g- u# I, Y
- HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);( ?# w4 P) n' e1 m' o8 f
- 9 `# Z. Z4 C- k: L+ q! p
- /*Configure GPIO pin : PA1 */" d$ A0 p5 f" K; V; T3 Z" i
- GPIO_InitStruct.Pin = GPIO_PIN_1;# U# @+ i' G6 ~3 n/ S" y4 e
- GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_OD;# k! P# Y. q1 x+ A
- GPIO_InitStruct.Pull = GPIO_NOPULL;
0 g) k6 _6 D) C/ J ^4 Y/ t$ d - GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;: H# u8 |# _$ `
- HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
. c7 ~$ p! w. h6 K: w% u& Y* ~, Y - 1 A) F# _- ]$ N: C9 I' Y2 Y
- /*Configure GPIO pin : PC12 */
: W/ W+ q c. s - GPIO_InitStruct.Pin = GPIO_PIN_12;
% P+ @4 i7 [4 Y" |! t( E - GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
+ A* v+ {3 g" X: }. ^ - GPIO_InitStruct.Pull = GPIO_PULLUP;
# J: \( n0 q" z" V - HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);+ p# M# l! |# o: C8 u; [. E
- $ x7 R# G9 _" c6 U8 N
- }
复制代码 & |' g' Z! B4 P7 ~. ?
至于复用功能的引脚,比如此例中将 PA9 复用为 TIM1_CH2 定时器1的通道2,则需要在tim.c文件中查看代码,一般都在相应外设的初始化源文件中' l/ T; w0 A: V# P* f# q7 A
" u; Y; i; G7 C' f4 P$ S- void HAL_TIM_MspPostInit(TIM_HandleTypeDef* timHandle)# H9 ?8 u" J) c& q7 R! }' j" f
- {
* ~9 \/ o* O% F) w; d& j
4 _& {$ f/ r' D1 ]. O7 X/ `- GPIO_InitTypeDef GPIO_InitStruct = {0};
. U4 j3 o! p2 F) T3 D - if(timHandle->Instance==TIM1)
3 ]% @1 Z: @: y - {& V$ |; I6 m8 _+ P8 D" a0 H- M' @
- /* USER CODE BEGIN TIM1_MspPostInit 0 *// [/ ]6 ?# R5 b2 j' N
; |( ]6 e& M5 s( C1 t+ s- /* USER CODE END TIM1_MspPostInit 0 */, W0 s! G p" B4 |" `
- , Y3 n0 S0 T/ b8 C
- __HAL_RCC_GPIOA_CLK_ENABLE();3 ]4 O4 n8 I9 c. Z" V2 S" F3 z2 t% ^$ t
- /**TIM1 GPIO Configuration 2 _) \! ~ L) G) S& t# `9 v9 {
- PA9 ------> TIM1_CH2 ) R$ F* i! n5 G( ]+ d+ ?7 Z
- */( v$ o; J/ D) T& r- o+ \
- GPIO_InitStruct.Pin = GPIO_PIN_9; //使用9号引脚1 S* E5 C* l3 N' x) P% x
- GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; //配置为复用推免输出模式. F T) d. r. u8 ^3 s' [5 k1 J
- GPIO_InitStruct.Pull = GPIO_NOPULL; //没有上下拉
3 Q# Y# U9 L1 T+ e5 v: d - GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; //高速输出. B9 G/ y# B$ {+ V4 r, z- u8 w
- GPIO_InitStruct.Alternate = GPIO_AF2_TIM1; //复用为定时器1的通道2
5 j2 ~, R- C T$ L! K s - HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);' |& g8 v8 D- a% d
- - O1 C! I; w: m# ]2 [
- /* USER CODE BEGIN TIM1_MspPostInit 1 */' F5 [9 p- a( }0 a* Z5 X9 F
( k5 {+ j) [# p- /* USER CODE END TIM1_MspPostInit 1 *// p: l3 q8 J7 q' E
- }
; ^" ? T0 W" P, R: X
# l) q2 Z8 f* f5 ]7 g2 S+ O- }
复制代码
. j; U/ N$ K: J& m* h至此,关于STM32F0系列的GPIO的配置以学习记录完成,如有不对的地方,希望各位看官指出,谢谢大家!2 e9 m8 x* f! \0 Y$ x* G0 g( d
2 t! Q' X9 e% b# A" H5 @! w
; R# c. Z/ O7 ^ c m: o
- F$ c9 u I% z8 d6 V3 j1 y( ?+ t
6 l$ k2 G1 P5 x9 L. N6 o |