GPIO口
0 P% j) t. T L& x! ?' f
5 u) v" i7 p6 ?! `# X8 B介绍:
% T" |: [/ E: k! A& i+ M F; Y& j2 ]0 n Q: c: B
4 个 32 位 配 置 寄 存 器+ y M4 c8 C0 Y- y
A5 Q2 b& c3 ?" P
GPIOx_MODER:模式配置寄存器
6 C5 n3 a( f9 }7 l5 X B3 {: Z8 ^ l' B. A3 h3 r; t4 p
GPIOx_OTYPER:输出模式配置寄存器
; O9 ]/ R% J9 B g5 V3 H: @" @; q* M# O7 H4 K
GPIOx_OSPEEDR:输出速度寄存器! ^1 d1 a9 a/ e4 N3 [5 W9 O
. y& Z* k1 ]* [GPIOx_PUPDR:上拉下拉选择
' u# T7 t& r9 ?2 G/ m n0 S
+ x2 N( P* U3 r) C8 J" A, q8 K2 个 32 位数据寄存器+ v* X9 l' J! E+ C
! Z& u! Q7 I) q6 v. i" [) X0 ^GPIOx_IDR:输入寄存器
4 t# N8 B( R; i" s, z i
7 [, h; L( p* i; |. QGPIOx_ODR:输出寄存器% T: r+ u# p, m2 y- `6 V
B* w) o* W( l8 x& c. t% n1 个32 位置位 / 复位寄存器' [3 f* B G. F- s( t/ t5 F
" S+ \4 O1 ^' ~. C6 J8 k, B0 w
GPIOx_BSRR0 }- o' e) {8 }% N2 K& y
0 ?& x: S0 Z7 y7 s- o. MA和B还含有1个32位锁定寄存器
. L6 f7 U" e3 S9 ~8 T/ h# W1 ?- Y3 ^( u1 N
GPIOx_LCKR
* ~$ W. d% D* Y, V5 I
# x$ Z4 V" U. [: c4 D, zA和B还含有2个32位替代功能寄存器
7 E9 L- \4 B0 Z( Z3 m: ]
( q1 |+ @, X4 R/ P; j5 h# G0 LGPIOx_AFRH :复用功能寄存器, i! c/ ?3 I8 U" h5 Y# p6 o0 q
5 {. Z5 x" c' `
GPIOx_AFRL :复用功能寄存器+ a. P6 a% }5 R8 x$ x
. S. o! l8 B5 J/ u$ r8 P8 r' I2 u
GPIO口可以配置成如下模式:8 r! Z( P. S- c. G
& f( ]: u* E2 h● 浮空输入
( T# T' F$ D5 m5 M$ M( S7 Z; I$ ~2 L4 S q/ W
● 上拉输入1 x9 s+ A5 W: p! j6 f5 j3 c
3 K& ]1 I9 M+ s' D
● 下拉输入- R0 S9 z i& q
( [. ?7 f& I3 E$ [4 `/ b● 模拟输入9 W9 F4 M% k+ d0 _0 c
2 d C6 Y: o5 ^
● 具有上拉或下拉能力的开漏输出
R; n' i5 m) h8 `- q( G# ^9 D& b8 L3 E( J% U( Y
● 具有上拉或下拉能力的推挽输出
0 `( J- \- i" S& I' g, L C1 V+ |; _- m1 B3 Z0 k) H8 n
● 复用功能且具有上拉或下拉能力的推挽输出 J6 V. M) Q1 O4 J% s7 U6 q
/ j8 p* b( b4 s/ k/ ~
● 复用功能且具有上拉或下拉能力的开漏输出
) w. C9 e8 G2 ^- m7 t' r @
0 E; d4 ? j J注意事项:
D i* V6 p7 u- a: u* R* }
5 F, Z- S: J% H! h3 s4 j* N1:所有端口都有外部中断能力。 为了用做外部中断口线, 端口线必须配置为输入模式
# S0 Z. _" n1 M0 ~: N% c
7 P2 g- f$ r8 h; d) z2:对于 GPIOx_ODR 中的每位, 在GPIOx_BSRR 中有两位与之对应: BS(i) 和 BR(i)。 当对位) G v2 `( x- Z5 x9 S
( T4 Q! A, f# K9 l
BS(i) 写1时则设置相应的 ODR(i) 位。 当对 BR(i) 写1时, 则复位相应的 ODR(i) 位。8 r. S6 m" k4 {4 Q3 s
2 m# X4 j* N8 c: J; q$ D/ ?: Y3:为了写 GPIOx_LCKR 寄存器, 须发出一个特定的写 / 读序列。 当正确的锁定序列作用于这个* [9 ~1 y) j7 Z2 Y
! u+ u' B; x5 N; M1 k! d+ H& }寄存器的位 16 时, LCKR[15:0] 的值用来锁定 I/O 口的配置6 [5 ]1 t4 ^7 B) t# v
" z$ w. ?* ]' [2 l
配置过程:7 o7 o* b. S1 S; u5 Q
' G) ?9 y" |0 E& d- void GPIOConfigure( void )
- u% o% e( ?& w
+ K: J6 j$ Z8 V, t, z- {1 d, k8 W! x- [+ U/ R! m
- GPIO_InitTypeDef gpio_init_structure;9 A: R- S; V( D, a; \& u" E& H
% [3 z& ~% G8 J; y- S9 J- gpio_init_structure.GPIO_Mode = GPIO_Mode_OUT; //输出模式4 z5 ]# g ^; P7 W7 J& ]
- 8 h/ u$ X) `! @/ b8 j$ P
- gpio_init_structure.GPIO_Speed = GPIO_Speed_50MHz; //输出速度
! B J' X" v/ E4 i. [- m. G
3 I6 ]9 g. W' ~6 S3 F# K% p- gpio_init_structure.GPIO_Pin = GPIO_Pin_0; //引脚
# u$ B/ s4 T$ h6 ?# x
3 C3 Q, a/ f) v& M- C, f- gpio_init_structure.GPIO_PuPd = GPIO_PuPd_UP; //上拉模式输出
) m7 X! c1 y1 R1 A* _2 D) S; X0 b1 Y& V
9 e: u0 A0 z/ z: p- gpio_init_structure.GPIO_OType = GPIO_OType_PP; //推挽模式输出* Q* P7 L8 @1 G8 e
2 `' Q; i! P; v& E6 }& c( b- h1 _- - ]/ B% p- a! Y0 r( t/ \" \
2 Z: g; p0 K) I. m W* {8 P- GPIO_Init(GPIOA,&gpio_init_structure);
! `. z" v0 d2 z
5 f: [) V6 A2 x N( V; ~) j4 m- }
复制代码- #define GPIOA_SET_BIT0 GPIO_SetBits(GPIOA,GPIO_Pin_0)//置位
* N! f/ J4 r8 e. V. @+ ~ - 3 o7 M; w0 e5 e3 D
- #define GPIOA_RSET_BIT0 GPIO_ResetBits(GPIOA ,GPIO_Pin_0)//复位
$ S1 |+ f n2 R. ^, N
2 I1 |9 K* x2 S6 \) a" j- #define GPIOA_RDIN_ALL GPIO_ReadInputData(GPIOA)
5 Q. |" G# s d2 W- f6 { ~ - % b* F5 f, V" ]4 q7 W+ |6 r
- #define GPIOA_RDIN_BIT0 GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0)
6 C; B# G* W' B( O
* c& H& \) \" Q; s: g$ T- #define GPIOA_RDOUT_ALL GPIO_ReadOutputData(GPIOA)2 `; b* {8 a( f+ h! j# O3 I
- 5 n8 X. d8 r6 s
- #define GPIOA_RDOUT_BIT0 GPIO_ReadOutputDataBit(GPIOA,GPIO_Pin_0)' Q. a$ M+ C4 r/ A0 m4 [( x8 K
复制代码
# _8 C& ?2 u! _7 _3 O2 J: y上面是相应的读取和写入函数,看函数名就可以理解此函数的功能
3 i: a4 ]9 h! Z5 x$ i
( ]) Z2 I3 F: G7 y ^- j. Q* _, T
' [3 M' {0 D( }# F# b/ N' o7 a. C$ a3 N2 A3 R, G( H
- j3 H3 z5 {$ M3 Q. M" L9 A' V |