GPIO口
2 K" V, u$ o6 p7 \
9 H' z. ?" Y( {
" W" o: T: x' p0 t' a& R: b8 |
4 q8 u4 t# Z6 w. w5 h- p9 I+ F2 k, Q" |6 W# x3 m- o
介绍:
9 k3 E$ r& l% J; d- M+ Y& f" U& j" C* K4 z; X1 G* a
4 个 32 位 配 置 寄 存 器
0 B6 E+ L% L: Z: {$ A H& E( ?% |' J- H3 h: a6 k F% _2 Z
GPIOx_MODER:模式配置寄存器
/ g c- R) \9 v" [5 O1 D7 }
# ~9 i) `/ J" t8 z' { w( i! v3 [) {- `GPIOx_OTYPER:输出模式配置寄存器
8 e$ Q- v0 Y3 L: \) j, b- q4 x$ M$ f* F
GPIOx_OSPEEDR:输出速度寄存器
9 c+ _0 B7 `7 ]/ g2 d; x$ S# h. ` G
GPIOx_PUPDR:上拉下拉选择
* V+ K- e) ^. R3 Z, l! T9 B1 Q }" n9 v% q+ t" c
2 个 32 位数据寄存器; B/ H9 v9 a" ?8 z
% d! f, p. X: ]6 g- I' y" wGPIOx_IDR:输入寄存器0 j# l7 W8 ~, y3 ^, S" g3 P
% L5 G! S2 ?5 Z3 v) J" vGPIOx_ODR:输出寄存器* Q/ j% Z' O3 ^4 Q5 V1 w7 a
* Y0 E; ~1 @ Z+ {7 V
1 个32 位置位 / 复位寄存器9 t2 c4 L" @& s8 B- [
+ i1 f2 h) l2 z7 W
GPIOx_BSRR* U. k8 Z, H% R5 j" _
% g9 \3 {+ I7 Y' L
A和B还含有1个32位锁定寄存器) N* U* P8 n, n! X' O
/ S' t( |1 ]0 i5 xGPIOx_LCKR
$ f& d% q4 `) f6 @9 t8 |
( \' w6 f! c# g1 v/ K) @A和B还含有2个32位替代功能寄存器
& M/ x0 c# m9 h% P6 R2 t- m' r+ e/ E3 {( d6 M% A+ z) B( ^8 `
GPIOx_AFRH :复用功能寄存器1 P5 x) ]; B, m I
6 b# _1 K' x0 aGPIOx_AFRL :复用功能寄存器
p' T# r; A8 S2 ~( K, D- |) M0 ^% m0 _; Q" ?, ^0 o0 F" A, O; k
GPIO口可以配置成如下模式:
9 E3 Q( Y* A, \" I2 g& B4 W4 f" a/ t3 K6 ^
● 浮空输入' n9 D; ]. x8 Q) X7 I. `+ R3 K% A( \
8 e X' o( K5 N" Z# ~
● 上拉输入
B9 Q* s2 ?1 X0 q3 w9 R/ S( j* a* f& a7 Z8 l
● 下拉输入
7 H+ I. v% W* A* Y% r9 T
: E! i' C$ G+ N+ P: G0 \2 o● 模拟输入
9 q" h; e4 o3 j. u4 P/ j" n3 ~2 B* S% Q2 o3 n: q( D3 m
● 具有上拉或下拉能力的开漏输出; m5 d! E. l$ k; i0 s
* r7 o2 ^: z: M( |● 具有上拉或下拉能力的推挽输出
3 X5 H+ h: E" |3 B- F3 f$ h! K0 M; o0 S# f7 l# O
● 复用功能且具有上拉或下拉能力的推挽输出) u( a7 [8 B W0 a
' C% W2 I' f- |2 [; h2 q! l; y" U# j
● 复用功能且具有上拉或下拉能力的开漏输出
6 ?7 p: B$ h1 Q+ U+ T8 J0 }7 `/ j# m7 Y
注意事项:
/ M5 h* q; T1 W6 {' d- q* n9 o; e; D. Z* w8 i0 t
1:所有端口都有外部中断能力。 为了用做外部中断口线, 端口线必须配置为输入模式
2 k; |: A9 J6 s% V
0 {$ I! T; w2 h2:对于 GPIOx_ODR 中的每位, 在GPIOx_BSRR 中有两位与之对应: BS(i) 和 BR(i)。 当对位
^- G; r. k' }) K
- X! G M+ t7 ~$ s9 q8 S- ~6 JBS(i) 写1时则设置相应的 ODR(i) 位。 当对 BR(i) 写1时, 则复位相应的 ODR(i) 位。& q) F/ Q. W, h$ ~- x* N' }
& G$ Y& }* n; M# a0 X3:为了写 GPIOx_LCKR 寄存器, 须发出一个特定的写 / 读序列。 当正确的锁定序列作用于这个
4 T% `2 Y( h. f/ P& E, D! O& }, j% s3 d/ ], y' Y% i8 ?$ p
寄存器的位 16 时, LCKR[15:0] 的值用来锁定 I/O 口的配置/ q) o' i+ U. |0 M+ g% k
6 B- M x9 K% ^
配置过程:
* H \1 Y: n0 Y% T1 y+ n4 H1 c4 | |
- void GPIOConfigure( void )
4 {# U }( g- d( {
, |8 F/ v! Z1 C0 c$ e! c, g- {
4 c0 B H2 e- P# q Q' P( \1 Z - GPIO_InitTypeDef gpio_init_structure;. ]1 Y$ l. I) ~ n
- ! ]5 R; N$ z- K8 |
- gpio_init_structure.GPIO_Mode = GPIO_Mode_OUT; //输出模式1 Y4 `0 {# d0 n* Y
- , d1 E% U3 S1 c# I& W, x4 I7 z7 R: D
- gpio_init_structure.GPIO_Speed = GPIO_Speed_50MHz; //输出速度
- Q5 u4 F M0 |- q* S5 {/ b( v/ ` - 8 a4 N' o+ u5 m: I4 Y" |
- gpio_init_structure.GPIO_Pin = GPIO_Pin_0; //引脚3 @* M- S* \' c+ H! j; L
^6 H/ B- d! h! D( |9 A2 T7 [- gpio_init_structure.GPIO_PuPd = GPIO_PuPd_UP; //上拉模式输出% ?) F! s0 f' b7 O
5 |: e7 d( u% ?' Y/ e# U- gpio_init_structure.GPIO_OType = GPIO_OType_PP; //推挽模式输出
0 |0 H) ^# K3 T [3 b - / ?* M6 b3 k: l* U8 @
- 6 R W0 O* E& [1 T0 Y$ S
: h2 x& V: ]/ m- GPIO_Init(GPIOA,&gpio_init_structure);
- p& O, B) [) g# A# s
O, j: n3 j1 Y0 M0 `) s- }
复制代码- #define GPIOA_SET_BIT0 GPIO_SetBits(GPIOA,GPIO_Pin_0)//置位' b' L2 A0 U+ W. d% h
5 ]* F9 g. W/ p+ w/ d" O5 m* X/ \- #define GPIOA_RSET_BIT0 GPIO_ResetBits(GPIOA ,GPIO_Pin_0)//复位
7 w* `/ _' y0 q0 T$ i. y0 z - + _8 N' ] b, G2 S4 }+ k- d0 o
- #define GPIOA_RDIN_ALL GPIO_ReadInputData(GPIOA)" p5 x$ U$ k' D# C9 y, O. i r
/ k/ }* D) q; t) g0 X8 `- #define GPIOA_RDIN_BIT0 GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0)9 s5 r3 E3 {4 f6 u+ g% p* C, |8 @
- c' W K& t. ]1 [7 u* x. V0 F/ h( v
- #define GPIOA_RDOUT_ALL GPIO_ReadOutputData(GPIOA)
K9 V$ m2 K1 W0 k( ~" G6 G2 {
6 i' L2 e$ x; o/ G2 c4 x" S" b- #define GPIOA_RDOUT_BIT0 GPIO_ReadOutputDataBit(GPIOA,GPIO_Pin_0)
复制代码
$ o/ Y8 s& I! c: Q. q0 U- V上面是相应的读取和写入函数,看函数名就可以理解此函数的功能
3 m8 ]3 F- W& [3 _; y1 S$ t" l. e! A7 I
- int main(void)1 n3 E; C% L0 i( p$ l5 Y
- {
! n9 p: m7 h. Y: f3 V' F' C - //; `* W- ^5 l5 s1 U( [
- unsigned long i;5 C U, w4 M: W0 v$ t
- u5 I& a* H5 M2 U/ u
+ B8 o# I2 m. a( w- W- //
. d+ u% p5 s; R - RCC->AHBENR |= 1 << 17; // 开启GPIOA外设时钟
_, U5 N5 E) X, Y+ G - GPIOA->BSRR = 0xFFFF; // 清除全部端口
+ `3 Y' f+ L# y+ M4 { - GPIOA->MODER |= 1 << 2; // 配置PA1 通用输出模式
+ B' g0 \! J) ^' i1 ? - GPIOA->OTYPER &= 0xFFFD; // 配置PA1 推挽输出/ e+ o+ ]' X& X% E; A
- GPIOA->PUPDR &= 0xFFFFFFF3; // 配置PA1 没有上下拉
0 j) A( L+ y5 t - GPIOA->OSPEEDR &= 0xFFFFFFFF; // 配置PA1 输出低速模式0 z; n& f7 h3 f: ^2 [
- N; K5 b( K. n1 ]% t
- i = 2000000;* |' U/ o$ W( v* B2 d1 @
- //3 T2 [6 q! L! Z" m
- while(1)
* v8 C1 O! T' T9 m$ i, `) }% h" `0 A - {
( ]5 v& k) ^8 ^# e# r6 \: w3 K ^- g - //- l* O$ j1 D0 s! u
- if(i > 1000000)4 i* `% M5 ^) l- f
- GPIOA->BSRR = 1 << 1;
" e6 ^( j0 ^# V( k% L8 Q - else
' ^- ^0 P' ~9 X - GPIOA->BSRR = 1 << 17;2 l* E( U' Z; W5 K
- if(i == 0)8 R; p% }: X: {& R8 _! f
- i = 2000000;4 t7 @/ ^; G% f/ w: m: c# t
- else! L: u" |4 r8 M" ~/ r6 N
- i--;/ R5 J3 |) |* g. o M7 B' L. [
- //
% Y, q1 e; R3 a4 r6 X& E - //) ?3 u& _6 G' u' t, \% c' l) S
- }
) @5 ~3 i3 d+ R3 f: n# a - //: ], B5 R7 e+ A' |+ O* {8 a8 E
- }
复制代码- void I2C_MyInit(void)
, U* t- @0 J \0 L1 _ - {
5 C7 E: W1 j) C8 d0 u( L+ Y - GPIO_InitTypeDef GPIO_InitStructA;
4 b. h0 G% C; P5 r( { - ' s# s6 H# q- Y# h1 r
- 7 f8 U. T- b8 c/ ^2 P( }5 K
- RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA|RCC_AHBPeriph_GPIOB|RCC_AHBPeriph_GPIOF,ENABLE); 8 j0 X6 b9 [$ R3 _, I0 t/ D" `. G- z
8 l$ r6 e1 N% c; [- x- i" ?- //I2C模拟3 X: C' _8 s9 l
- GPIO_InitStructA.GPIO_Pin =SCL_GPIO|SDA_GPIO;, w- b1 q. N! \9 [8 s8 t
- GPIO_InitStructA.GPIO_Mode = GPIO_Mode_OUT; //GPIO_Mode_IN)输入 (GPIO_Mode_OUT) 输出 GPIO_Mode_AF第二功能 (GPIO_Mode_AN)模拟
% p8 F2 k4 u7 O3 A5 F& { - GPIO_InitStructA.GPIO_OType=GPIO_OType_PP; //GPIO_PuPd_NOPULL(不拉),GPIO_PuPd_UP(上拉),GPIO_PuPd_DOWN(下拉)
6 z y' T# {( L" S - GPIO_InitStructA.GPIO_Speed= GPIO_Speed_50MHz;
4 ^) M$ r& Z3 V* n3 y2 i - GPIO_Init(GPIOA, &GPIO_InitStructA);
1 N% _* d2 y9 c1 X! ]1 ~ - GPIO_SetBits(GPIOA,SCL_GPIO|SDA_GPIO); //PA0,PA2输出高- q, s5 W8 c( ]$ f: r: F1 I& ~
- }
5 J3 Z4 A' f% p - void SDA_IN(void)
" K- R+ Z+ I0 C- V/ T - {( ^& W) n+ {- {5 R+ A4 W
- GPIO_InitTypeDef GPIO_InitStructA;) M: j- K9 r* T( ~9 U" \0 Y M
- 0 d5 I4 j( o. h: s+ U6 ]# y5 L
- 6 f4 U5 @3 z% G# R0 }' Y9 \
- RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA|RCC_AHBPeriph_GPIOB|RCC_AHBPeriph_GPIOF,ENABLE); 0 } F# @5 K7 [8 |3 C) T
- % [# U2 U Z( K3 t$ T
- //I2C模拟7 C8 H% x8 D+ o+ O5 }# }0 W$ W
- GPIO_InitStructA.GPIO_Pin =SDA_GPIO;+ x* q; m! N+ o; K
- GPIO_InitStructA.GPIO_Mode = GPIO_Mode_IN; //GPIO_Mode_IN)输入 (GPIO_Mode_OUT) 输出 GPIO_Mode_AF第二功能 (GPIO_Mode_AN)模拟
" K' B. `: l% x3 \' p - GPIO_InitStructA.GPIO_PuPd=GPIO_PuPd_NOPULL; //GPIO_PuPd_NOPULL(不拉),GPIO_PuPd_UP(上拉),GPIO_PuPd_DOWN(下拉)
, f! h& ] k' ?$ l# E - GPIO_Init(GPIOA, &GPIO_InitStructA);
9 C$ |/ J; p e( J {- c8 G - }
2 I8 v Z( ?7 w* X& O& D# ?
8 |& @/ d s- ~% X- I. h- void SDA_OUT(void)- a5 z1 M5 U. U' q
- {
7 w& h3 H! r- E6 T - GPIO_InitTypeDef GPIO_InitStructA;
, I3 I& L8 {3 B- A- h7 u2 D" `+ H - RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA|RCC_AHBPeriph_GPIOB|RCC_AHBPeriph_GPIOF,ENABLE);
; ~% @: J0 G, @ - * {9 W; W0 ]8 v
- //I2C模拟# `+ T/ v9 n( s5 ^6 g0 u; V
- GPIO_InitStructA.GPIO_Pin =SDA_GPIO;
/ A( [: y& P3 m7 x, J/ e3 B - GPIO_InitStructA.GPIO_Mode = GPIO_Mode_OUT; //GPIO_Mode_IN)输入 (GPIO_Mode_OUT) 输出 GPIO_Mode_AF第二功能 (GPIO_Mode_AN)模拟
: y& f$ K2 G6 T/ t( O% \, o - GPIO_InitStructA.GPIO_OType=GPIO_OType_PP; //GPIO_PuPd_NOPULL(不拉),GPIO_PuPd_UP(上拉),GPIO_PuPd_DOWN(下拉)) [8 i- u2 @4 {3 t" P) t+ C
- GPIO_InitStructA.GPIO_Speed= GPIO_Speed_50MHz; z& @6 L, L2 T+ ~
- GPIO_Init(GPIOA, &GPIO_InitStructA);
6 p1 Y6 ]5 j4 d, g# w5 m
0 a4 o H T% m$ k- }
复制代码 $ _ n8 C0 T3 D# E4 z u% R- ?
1 C0 ]/ R+ `9 k, k
5 N+ [+ O# j8 m: C7 l: G2 L3 e |