GPIO口9 e& }# s. k8 S9 @) q+ E+ U
5 x- D; k& I" M7 j0 j7 a5 L5 U, M( [2 \1 H# T
* @& W3 k2 B; N' y' d/ w- ?$ q
$ H( p" n) [% b) ?! u, h介绍:
9 L+ O& V5 {) g% V; m5 e2 x) A# n$ y6 v4 D9 I) x
4 个 32 位 配 置 寄 存 器
$ h2 s& ^) V n K" j2 Y2 H j0 J" a/ w: I( u
GPIOx_MODER:模式配置寄存器/ C# O' }/ _, H% v5 e
1 v' k% L# [6 U; u3 Y4 J" E: k2 bGPIOx_OTYPER:输出模式配置寄存器
6 m8 h8 v: b, \% `6 C, ~6 N. W8 W- @, ^+ d: e7 ?# N
GPIOx_OSPEEDR:输出速度寄存器
4 g6 V0 Y' N" W' [% l; K9 g; ~. M' O! `! O4 ^% R6 i
GPIOx_PUPDR:上拉下拉选择' o9 B; k4 I9 b- Y8 Y
' F8 L& _9 _$ [
2 个 32 位数据寄存器
' S/ I/ P& E s0 ~# p* K5 P9 g* {
7 z0 j: a6 n" ]/ P# bGPIOx_IDR:输入寄存器' r) `5 B8 B& u8 u4 J
( Z: ~) |& t$ uGPIOx_ODR:输出寄存器
; v8 Z3 X. z% _& O( @* l0 x# B$ f+ I; q2 E
1 个32 位置位 / 复位寄存器1 g- C5 b. V* m5 v! n- z" `( q3 R
5 A. T, q: g; e/ `GPIOx_BSRR
; I3 N8 l0 E' a! [
9 v5 E8 z9 H: {3 I, R/ T1 a3 LA和B还含有1个32位锁定寄存器& B# w# P1 {% h! E
2 i" d& }( Q7 |' j; @
GPIOx_LCKR- j; y2 D+ q2 \5 _
9 {% d6 N! b- u# J$ G: d
A和B还含有2个32位替代功能寄存器: y4 Z: @: ]+ U" ^- Y1 N
6 E9 G4 n4 j, n7 w
GPIOx_AFRH :复用功能寄存器
' E3 S" M3 i3 J' Y- \! B7 i$ N1 V! S5 P* @7 `) |; x& F
GPIOx_AFRL :复用功能寄存器2 F3 m; {$ }! k1 H
& ?' J. y4 v6 G: g
GPIO口可以配置成如下模式:
# \2 M/ E+ {3 A2 b
( B( G4 _1 P* ^6 B0 U. ~● 浮空输入
7 w' v7 w* B. p' [% o0 w/ \
7 F0 m% w8 _ Z* M5 h/ A/ e● 上拉输入7 `3 _6 C$ T3 [+ Z. X' s& z) x+ x
4 r8 s* e3 p' h6 \, o
● 下拉输入
3 I8 p$ |. W0 X0 n5 ^# u! k8 J
8 r7 X) l5 B5 o" J; b: ]● 模拟输入
1 y% c2 k6 h/ l- t
- B, r. n2 c" }, m+ J5 T t% a7 C● 具有上拉或下拉能力的开漏输出# [4 ^, V0 s/ d7 E9 g/ X3 {
7 }' b! ]8 R( m- a
● 具有上拉或下拉能力的推挽输出
+ j$ h" s5 P7 S& x) \8 f% n0 S x: I6 z, M& a4 K
● 复用功能且具有上拉或下拉能力的推挽输出
$ Z8 N3 r8 V! F. V
5 F8 S4 x( k, C● 复用功能且具有上拉或下拉能力的开漏输出" w( y, ]* [: c5 B6 H {: @
% m, l2 u4 J" j N8 C注意事项:$ y9 |, t( c( l
X0 o: J+ z# C+ V; C1:所有端口都有外部中断能力。 为了用做外部中断口线, 端口线必须配置为输入模式
/ G1 v- i1 D9 ?% C1 l9 P, ]. e' Y8 ]$ O3 v* p c* G
2:对于 GPIOx_ODR 中的每位, 在GPIOx_BSRR 中有两位与之对应: BS(i) 和 BR(i)。 当对位1 n$ k: N# u4 @
* a/ K! J5 x. a! ?' b8 @, P N8 [# XBS(i) 写1时则设置相应的 ODR(i) 位。 当对 BR(i) 写1时, 则复位相应的 ODR(i) 位。
, F$ \# r" I$ ~8 X Z+ L e9 M
9 F' {$ P; w3 U/ v! M" s0 i1 w3:为了写 GPIOx_LCKR 寄存器, 须发出一个特定的写 / 读序列。 当正确的锁定序列作用于这个+ x' P/ j( j' D: e# U6 X4 i
. [1 F8 L! }1 P; e
寄存器的位 16 时, LCKR[15:0] 的值用来锁定 I/O 口的配置
* o& L. X& t8 S4 h* \
# Q, e2 G( t* a; K9 U3 V# p配置过程:, S5 [0 t3 a! Y# }5 @
9 W) A+ G9 q! J3 O% F' ^- void GPIOConfigure( void )
+ C7 D, u& m6 O2 F - 7 [' ^6 w4 ^" u
- {
1 O$ `3 H5 \6 ~$ K9 c - GPIO_InitTypeDef gpio_init_structure;( [6 _' f9 v& {0 q
- # d7 A0 C, g' L% D1 A
- gpio_init_structure.GPIO_Mode = GPIO_Mode_OUT; //输出模式& e. E1 Q8 e1 V3 a6 m. A9 b
- 2 J" V- H" Q) k3 D( I, y9 v/ w
- gpio_init_structure.GPIO_Speed = GPIO_Speed_50MHz; //输出速度# f I0 w- S" v! M$ j- y) B
/ u. u7 e5 |: o/ I& _% k- gpio_init_structure.GPIO_Pin = GPIO_Pin_0; //引脚" I) B( A3 x$ s! @7 G! a
- 5 j; S/ V4 A, f- [# _" ?
- gpio_init_structure.GPIO_PuPd = GPIO_PuPd_UP; //上拉模式输出
6 j7 g, F% o/ y0 A3 q: l - 2 V4 r7 C1 w0 |1 m2 c% z: }
- gpio_init_structure.GPIO_OType = GPIO_OType_PP; //推挽模式输出# ` S! E, q' ?! n" J
- 5 Q5 D/ p( N' o }# s# N) m' w
7 G$ O9 G9 `( ?- - r8 k" s/ u$ Y
- GPIO_Init(GPIOA,&gpio_init_structure);
. J3 m; P" S. J7 k5 j' Z
# e6 A. v: t+ n: U$ u$ ?; y8 [- }
复制代码- #define GPIOA_SET_BIT0 GPIO_SetBits(GPIOA,GPIO_Pin_0)//置位
) K) n& q; P5 ` - * m3 F% q% c8 d& h
- #define GPIOA_RSET_BIT0 GPIO_ResetBits(GPIOA ,GPIO_Pin_0)//复位+ r( z) X- t# \; ~2 K5 Z( d
* U5 N( p, D8 h7 u9 C- #define GPIOA_RDIN_ALL GPIO_ReadInputData(GPIOA)1 {. G( }0 _+ h7 B3 h
* }! F" j3 @+ | r2 J4 e3 _+ n- #define GPIOA_RDIN_BIT0 GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0)' q3 I" l. G2 h; X7 l
& Z4 h# P% b! y. f5 \6 |- #define GPIOA_RDOUT_ALL GPIO_ReadOutputData(GPIOA)/ v1 o6 G# y3 k/ J" m* v
- 3 S6 [& o; z9 e0 E
- #define GPIOA_RDOUT_BIT0 GPIO_ReadOutputDataBit(GPIOA,GPIO_Pin_0)
复制代码
0 s, L8 M9 }/ \' j3 r- w上面是相应的读取和写入函数,看函数名就可以理解此函数的功能3 i: ]' f$ Z! P) J+ _) M. Q9 }: y
1 a$ U- P. A& {- int main(void)
- l8 P3 K+ e, k; ^3 g/ f. J" ]3 @ - {
& @0 @1 p# t; v! {( t2 Z - //
7 N" w! i' d4 |/ j0 } - unsigned long i;
# d: ?8 _2 v! H$ Z- y) R - 0 l7 E) o2 p ~6 i9 y0 T
- ! c) V4 E3 m& Y5 E: L
- //
) R/ u- N: x$ a* L, u - RCC->AHBENR |= 1 << 17; // 开启GPIOA外设时钟
( J' C# ~/ i# W1 x - GPIOA->BSRR = 0xFFFF; // 清除全部端口# A1 o9 U! Z6 T1 j
- GPIOA->MODER |= 1 << 2; // 配置PA1 通用输出模式. C ?) S' G7 N( W. ]5 [
- GPIOA->OTYPER &= 0xFFFD; // 配置PA1 推挽输出
' h, U. y+ C. K' Z4 B \' r6 K7 i - GPIOA->PUPDR &= 0xFFFFFFF3; // 配置PA1 没有上下拉
- Y( k; ?: x3 N0 u( r2 `# I' Y& \$ {" s - GPIOA->OSPEEDR &= 0xFFFFFFFF; // 配置PA1 输出低速模式
2 o0 W! L" y0 W Q
% l, Y4 O4 ?: p+ r- i = 2000000;
6 x1 P8 T7 f6 V' a2 _# |% e& ^0 o# I - //3 s" I) x( ?2 I) L2 q1 H
- while(1)
( c# \/ F4 ^. e! ^5 V - {
' N8 ?7 Z) U6 }: }5 d8 c& x - //
8 z. I2 u' @8 J - if(i > 1000000)0 g. f4 W& l' N) e3 W4 G0 @
- GPIOA->BSRR = 1 << 1;' s/ `5 ~7 d- a
- else
/ u. l. p$ S& e/ J# h' K - GPIOA->BSRR = 1 << 17;3 m7 y% B' Q' G: A
- if(i == 0)
7 B: w; {) }& T$ W - i = 2000000;# ]/ n: r9 `* Z3 q
- else
; j/ q8 Y) \: U6 h2 @ - i--;
0 d# v; B x8 d. d ] - //
9 a/ H& m( D) i. E/ w3 `* I - //" f9 o. M, Q. S$ k1 p8 ^
- }# c3 Z# v8 e" z# b, {% N
- //) ?3 I2 ~% C7 i2 P2 W
- }
复制代码- void I2C_MyInit(void)
% g) D5 E \$ T* d - {
* V& e3 _6 U1 A/ e: H, O - GPIO_InitTypeDef GPIO_InitStructA;
6 Y3 @) F5 K; o* {( S# Q, N( m% k - # C1 i* f$ V8 t0 L. |7 ~4 P
-
1 D2 c. _+ b/ v1 | - RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA|RCC_AHBPeriph_GPIOB|RCC_AHBPeriph_GPIOF,ENABLE);
+ u3 N5 {+ g# O3 R t - 9 U& V: s3 _# I+ e, R) n$ g/ B
- //I2C模拟
* T. ~" R! j/ H - GPIO_InitStructA.GPIO_Pin =SCL_GPIO|SDA_GPIO;3 D: v6 s5 ?% m$ R3 Y2 e1 I7 I+ h
- GPIO_InitStructA.GPIO_Mode = GPIO_Mode_OUT; //GPIO_Mode_IN)输入 (GPIO_Mode_OUT) 输出 GPIO_Mode_AF第二功能 (GPIO_Mode_AN)模拟
% {/ ]( {) o5 _3 R8 O! h k - GPIO_InitStructA.GPIO_OType=GPIO_OType_PP; //GPIO_PuPd_NOPULL(不拉),GPIO_PuPd_UP(上拉),GPIO_PuPd_DOWN(下拉)
; {: Z3 f7 R$ L - GPIO_InitStructA.GPIO_Speed= GPIO_Speed_50MHz;
( u1 j. f& u( t% G( _! H - GPIO_Init(GPIOA, &GPIO_InitStructA);
: N( H( q' A% u/ z - GPIO_SetBits(GPIOA,SCL_GPIO|SDA_GPIO); //PA0,PA2输出高
, i5 l1 W" n1 {( k2 C: v7 T - }
/ h- s+ ~1 _$ Y# I5 U. A1 Q - void SDA_IN(void)
9 h9 m, [2 I+ T( X1 B - {2 c% f& O: }0 t- `' j
- GPIO_InitTypeDef GPIO_InitStructA;
! ]% S4 r7 r7 o2 K" i) J0 w) h
$ J# i' c; b* J2 j3 g% U O* ^- ( A' n! \0 s' m1 G
- RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA|RCC_AHBPeriph_GPIOB|RCC_AHBPeriph_GPIOF,ENABLE);
+ @: N& A5 S; }7 B+ ^ - 1 u2 S2 k& [2 J3 P( V- h! r4 |
- //I2C模拟& X) u$ B' z* M; m3 G N& N
- GPIO_InitStructA.GPIO_Pin =SDA_GPIO;' Y& z( R) ?! \. O" Y$ E# \( T
- GPIO_InitStructA.GPIO_Mode = GPIO_Mode_IN; //GPIO_Mode_IN)输入 (GPIO_Mode_OUT) 输出 GPIO_Mode_AF第二功能 (GPIO_Mode_AN)模拟
# F$ U) f% ] z, u - GPIO_InitStructA.GPIO_PuPd=GPIO_PuPd_NOPULL; //GPIO_PuPd_NOPULL(不拉),GPIO_PuPd_UP(上拉),GPIO_PuPd_DOWN(下拉)
, e: F% C6 n" j7 B8 a O1 d( U) h - GPIO_Init(GPIOA, &GPIO_InitStructA);- V! J4 l& u& H% A
- }
: N- u- O g7 j5 e2 M - 1 G% B( T8 ?. e+ B* f! s S
- void SDA_OUT(void)* E- p: r% ]% R
- {
7 }8 J3 G( U: P. G. N: C - GPIO_InitTypeDef GPIO_InitStructA;
# e$ {3 N! y' Y9 @; n - RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA|RCC_AHBPeriph_GPIOB|RCC_AHBPeriph_GPIOF,ENABLE);
- K W4 v- x% L$ f7 ?' x" ^ - " c7 u3 `/ g& } \
- //I2C模拟
3 j, \: y4 q6 h+ l# G# @% n - GPIO_InitStructA.GPIO_Pin =SDA_GPIO;2 v- L7 l/ n9 r
- GPIO_InitStructA.GPIO_Mode = GPIO_Mode_OUT; //GPIO_Mode_IN)输入 (GPIO_Mode_OUT) 输出 GPIO_Mode_AF第二功能 (GPIO_Mode_AN)模拟6 h5 T* p2 a. a; }6 d- ^- B, t
- GPIO_InitStructA.GPIO_OType=GPIO_OType_PP; //GPIO_PuPd_NOPULL(不拉),GPIO_PuPd_UP(上拉),GPIO_PuPd_DOWN(下拉)4 j4 c$ @2 s/ O& J3 T& M( ^
- GPIO_InitStructA.GPIO_Speed= GPIO_Speed_50MHz; 4 Z1 `4 B4 n! ~! j- W# \) X4 X
- GPIO_Init(GPIOA, &GPIO_InitStructA);9 K5 w. X& l' M- e4 W5 F$ p* _
2 f2 z& s% j% \0 v" P- M! G6 D- ~- }
复制代码
8 W+ R6 E3 Z& `+ ~! E% ?1 C& b0 r. y2 C0 a
! x5 A, ]: q+ ^) ~- N1 d6 @4 X
|