GPIO口3 @) P- ~# W0 ~
( G- C4 s/ |9 N& ^2 ?8 `2 Z! P
$ s! \3 |& i8 {3 T5 N
' o6 j6 [4 T: e: x, O
- K9 F) v# f, ?3 [$ ]" V2 V" q* p, u介绍:
! T9 x+ j q* C0 }: ?" U
- U5 ~0 B: C9 X" t4 个 32 位 配 置 寄 存 器( ? M' i& y% ~
6 N/ x! g W0 o; O, x7 ^4 dGPIOx_MODER:模式配置寄存器
1 B8 e6 M3 I$ t6 B( ^# J
+ e8 @' W% J/ i/ @7 aGPIOx_OTYPER:输出模式配置寄存器
6 ~& I& f. {# Z4 }, R- n" V: i' I: l( J: ~9 G5 I& b' P
GPIOx_OSPEEDR:输出速度寄存器/ ?5 y! V" t E5 p U
* T7 S) S0 d M) O$ CGPIOx_PUPDR:上拉下拉选择) W! ?3 d& l. @+ @6 [: N) s
8 R4 a# i, M9 q% W: Z0 q2 个 32 位数据寄存器
8 s9 L8 ~ }: C9 e* t0 U7 S# w* |0 z4 ]# G; g4 T/ w
GPIOx_IDR:输入寄存器 R2 F6 ^ V- _6 n! j" M
" m" `& C" l. B# I$ q& S/ u1 I
GPIOx_ODR:输出寄存器
3 w# }2 N) V4 K: i3 _7 l3 d! q
i: l$ ^2 H: m1 F% f1 个32 位置位 / 复位寄存器+ @2 h& @8 V: p$ Z7 O9 g5 F
L* b# p2 p: v# B( E* i/ `6 uGPIOx_BSRR
9 {; \" W! \) Q% i1 y9 O0 W. C' N- y7 d) a3 l
A和B还含有1个32位锁定寄存器
: h2 a4 I/ b3 e* `: X, k: e1 w9 ]9 v1 `! g% _
GPIOx_LCKR
`0 q$ F, b5 n: Z! S @8 P/ ]! v" b0 N7 y+ A6 }" y" V% y
A和B还含有2个32位替代功能寄存器3 I; z, Y* X/ G/ A
4 ~: E. y! X- tGPIOx_AFRH :复用功能寄存器/ `4 h/ p2 O% i9 l9 s8 Z
2 ^! O/ S" G$ ]: \9 e
GPIOx_AFRL :复用功能寄存器& B7 f8 e/ x2 Q p( H( D
' |( D) T o1 ]% Z! uGPIO口可以配置成如下模式:/ B. T7 F0 G1 _3 q! Y1 o1 \
* X* e4 g" O( j
● 浮空输入
- a; y, v# |6 V' W* C( @7 ^. U; I9 d' b6 n" ?5 _% S
● 上拉输入
- m9 E2 I; g: |+ z P( i9 a e+ C# u- {8 `# O9 _% ^9 W- l5 m) j
● 下拉输入9 {3 G- C8 e9 @9 s: n' c9 A& U
. L, i; D9 q( T2 l1 F; m4 ^4 M
● 模拟输入
- l' C' A: B& Z, c
9 R4 P* b6 J0 _# O; I& m- u● 具有上拉或下拉能力的开漏输出4 ~( p0 J- E* A0 o. m/ F
9 z# u, k* L1 L- J
● 具有上拉或下拉能力的推挽输出
$ W* v6 d! w0 M3 G l
2 J3 ?- B* Q5 t) g/ Y/ q● 复用功能且具有上拉或下拉能力的推挽输出
, I0 }6 T# j ^4 b3 M+ u
* K, z5 ]6 ?$ `8 K' o8 _● 复用功能且具有上拉或下拉能力的开漏输出6 W0 h7 D1 k# ~3 p7 }8 F
( s1 Y8 q( ^6 R7 j) |5 |
注意事项:5 z( T6 g1 F& G2 L, _
( r5 [, t. w9 D) A4 C1:所有端口都有外部中断能力。 为了用做外部中断口线, 端口线必须配置为输入模式
2 _4 I3 v# x+ P/ V; Q t: u! P7 V: {. R6 K# Y. S; r$ F# l
2:对于 GPIOx_ODR 中的每位, 在GPIOx_BSRR 中有两位与之对应: BS(i) 和 BR(i)。 当对位
% P; Z5 y, F. V) B5 W& z8 p2 ~0 q8 G9 s, N) a
BS(i) 写1时则设置相应的 ODR(i) 位。 当对 BR(i) 写1时, 则复位相应的 ODR(i) 位。* k! x7 @9 y6 R/ \4 p/ Z" P8 U4 y
: x- M8 q$ q- z, y6 z( O
3:为了写 GPIOx_LCKR 寄存器, 须发出一个特定的写 / 读序列。 当正确的锁定序列作用于这个) _( F) a/ V( g/ S/ h& ?/ q
9 P6 z, e* L' L7 q# T* L
寄存器的位 16 时, LCKR[15:0] 的值用来锁定 I/O 口的配置
/ [' ?& @ x- a4 P2 P/ |0 G; G! }! V) K2 p7 m R2 P" F( b ~
配置过程:
Y2 K( k1 Q) d/ Y' T1 ~- B8 ?6 d6 i5 Z7 O, l' M
- void GPIOConfigure( void )
/ ~8 H# E; u h, p$ O - " p) j* r! U7 D: G
- {
7 d3 b: T2 d2 K. Y9 Z6 i - GPIO_InitTypeDef gpio_init_structure;
8 ^* U$ L) S/ Q2 {$ W# h u! O - ' Y3 P, Z5 E& W9 f$ J) S: `
- gpio_init_structure.GPIO_Mode = GPIO_Mode_OUT; //输出模式
7 u% ~* u$ k1 g: Y. i+ B+ \$ f - ; P1 v) a7 S" V9 v+ L: `6 b
- gpio_init_structure.GPIO_Speed = GPIO_Speed_50MHz; //输出速度
4 U, g6 Z1 m& T# s, W - - D9 y9 T6 _: i w5 u b: @
- gpio_init_structure.GPIO_Pin = GPIO_Pin_0; //引脚- g9 C- P; i1 p# ^$ ]6 Q
- 9 c1 h" J- l/ D$ v$ i
- gpio_init_structure.GPIO_PuPd = GPIO_PuPd_UP; //上拉模式输出
$ i8 T0 A$ g* W( U1 \' S6 |9 k
r" Q* g# u1 v) U: ^8 C- gpio_init_structure.GPIO_OType = GPIO_OType_PP; //推挽模式输出
, ]+ p$ U8 R) E. G. Y( \ - - ~( Y) G, o' [8 G h& p8 T u5 K
- 1 u& [5 {0 u8 V. g! }, M1 t- g
$ |- J% R; r: G* L- GPIO_Init(GPIOA,&gpio_init_structure);- ?( {3 v9 E" Z4 R+ y! Z
- . F& k# h2 Q3 i' `# b
- }
复制代码- #define GPIOA_SET_BIT0 GPIO_SetBits(GPIOA,GPIO_Pin_0)//置位. ~' n- }: V7 i! w
" R$ _1 T/ ~/ i0 R3 o! s- #define GPIOA_RSET_BIT0 GPIO_ResetBits(GPIOA ,GPIO_Pin_0)//复位( i8 U; k/ a" k4 @ i. \
' C$ H7 h9 A9 M3 C) m. x- #define GPIOA_RDIN_ALL GPIO_ReadInputData(GPIOA)
7 E m& G- H% F8 p6 q6 k! g
1 e9 b& y9 }; W- L. C G- #define GPIOA_RDIN_BIT0 GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0)
( }' K: q7 H& M$ b2 e3 |; r - 4 X* |6 }% q( A. A3 z
- #define GPIOA_RDOUT_ALL GPIO_ReadOutputData(GPIOA)7 q& @0 u# T1 L& h$ I' i) K
, q. E! [' X" [4 F- #define GPIOA_RDOUT_BIT0 GPIO_ReadOutputDataBit(GPIOA,GPIO_Pin_0)
复制代码 / d% R5 n. L6 O1 w4 |' t' _
上面是相应的读取和写入函数,看函数名就可以理解此函数的功能( j w- D. S; [# j% W# E
: W2 O4 f7 x/ k5 r8 m- int main(void)
- b+ L+ \. h- M$ ` - {# B. A& \( r5 h: [/ L
- //
- u$ g9 j9 F3 w - unsigned long i;
3 z6 Q1 M. t: Y, P' z5 O) X
- F# M! E5 I! D) G. m* D) n
/ g. e, |$ J0 e. r9 C) l7 V& m8 X- //
4 m: t6 |& c9 I7 \, o0 e - RCC->AHBENR |= 1 << 17; // 开启GPIOA外设时钟
7 A+ \; K* G1 C' h - GPIOA->BSRR = 0xFFFF; // 清除全部端口. H: C# L, J$ C& K o
- GPIOA->MODER |= 1 << 2; // 配置PA1 通用输出模式
7 B" \" q, I( o5 G9 w: a - GPIOA->OTYPER &= 0xFFFD; // 配置PA1 推挽输出
4 Q! u+ v* e$ {3 K1 A2 F/ r - GPIOA->PUPDR &= 0xFFFFFFF3; // 配置PA1 没有上下拉$ W6 x! p. F+ c1 t! ^! Q
- GPIOA->OSPEEDR &= 0xFFFFFFFF; // 配置PA1 输出低速模式
8 P2 C* K1 x0 u! B5 m+ }9 }+ B
0 v: l) X! M! Z- i = 2000000;7 L6 J8 J# ^% B& a
- //& {, T7 D; q9 a
- while(1)
# L% F8 a- X( }" t - {
0 n! h+ ?% c5 W& Y - //
& M8 s, ~7 p2 r, N - if(i > 1000000)
6 F" h, }8 g5 n - GPIOA->BSRR = 1 << 1;
2 {7 r' m8 H" X0 h6 _- F$ N/ D1 N - else* r7 l. L* h0 X4 H
- GPIOA->BSRR = 1 << 17;, q- j( W+ \( V$ U; f8 Z
- if(i == 0)" M, G$ [$ r6 [; W& u7 Z& `" j4 c/ B
- i = 2000000;2 o5 ^0 x' D( j- B% x9 d
- else
7 ?* [: \) e: }3 b0 K# F" l- B( z& K! ^ - i--;
, i2 P8 _% u4 n/ o8 p - //
7 a* }2 s& W/ \) I, I - //- L4 p3 j3 B' X' A1 s' f4 l
- }
0 n$ Q# o2 m( ?6 b; Q8 X' W6 c - //
/ ~ m) E3 q. d$ l5 q3 l - }
复制代码- void I2C_MyInit(void)
7 _1 z: w4 N, P# m - {
; o# ~4 S2 { p( m - GPIO_InitTypeDef GPIO_InitStructA;
$ R; H! R7 ~) C
5 t) B( _) b2 s- 8 Z* v9 W$ O% O+ w0 A4 b" h
- RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA|RCC_AHBPeriph_GPIOB|RCC_AHBPeriph_GPIOF,ENABLE);
* G3 D( n0 N5 g1 _8 x: |
5 L; S& k! q/ Y- ]- //I2C模拟! z8 t0 e6 q+ k$ B! P1 g" q
- GPIO_InitStructA.GPIO_Pin =SCL_GPIO|SDA_GPIO;
3 }9 ?, e& n2 L' |! n2 t+ c - GPIO_InitStructA.GPIO_Mode = GPIO_Mode_OUT; //GPIO_Mode_IN)输入 (GPIO_Mode_OUT) 输出 GPIO_Mode_AF第二功能 (GPIO_Mode_AN)模拟
1 N4 \& ]( Z1 V+ m - GPIO_InitStructA.GPIO_OType=GPIO_OType_PP; //GPIO_PuPd_NOPULL(不拉),GPIO_PuPd_UP(上拉),GPIO_PuPd_DOWN(下拉)
9 y& g/ t5 m4 e1 B - GPIO_InitStructA.GPIO_Speed= GPIO_Speed_50MHz;
; a/ d% f* F0 O: A" B5 ~ - GPIO_Init(GPIOA, &GPIO_InitStructA);1 W8 q5 w' a* o/ j
- GPIO_SetBits(GPIOA,SCL_GPIO|SDA_GPIO); //PA0,PA2输出高9 ^ O3 H+ d4 y Y8 |9 N; |
- }; j5 W" |8 r. }& \8 t( }) l
- void SDA_IN(void)
1 @3 m( P) f. O4 [! A - {- s" y* u x' @
- GPIO_InitTypeDef GPIO_InitStructA;, {/ @1 ?' M9 x8 C# ?! G# c& S
- ' _1 b V+ t6 h6 b6 g: |% e% C0 B
-
7 K5 Z; ~$ c& @8 j& C# @+ L+ d - RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA|RCC_AHBPeriph_GPIOB|RCC_AHBPeriph_GPIOF,ENABLE);
, w3 k8 `/ ?) i0 v/ e$ J+ ~5 W - , g: A2 B! ?% @$ ^" e/ R
- //I2C模拟6 x6 \% Z5 \1 z
- GPIO_InitStructA.GPIO_Pin =SDA_GPIO;) t8 d5 M* j" m1 {' i8 l
- GPIO_InitStructA.GPIO_Mode = GPIO_Mode_IN; //GPIO_Mode_IN)输入 (GPIO_Mode_OUT) 输出 GPIO_Mode_AF第二功能 (GPIO_Mode_AN)模拟
0 c& W9 W5 Y% p; N - GPIO_InitStructA.GPIO_PuPd=GPIO_PuPd_NOPULL; //GPIO_PuPd_NOPULL(不拉),GPIO_PuPd_UP(上拉),GPIO_PuPd_DOWN(下拉)7 J/ ]9 j* U- ^# c) e2 Q
- GPIO_Init(GPIOA, &GPIO_InitStructA);
$ f: U+ P; D1 j/ g. j: \# H - }
& R; }! J# b% I* ~6 U9 V+ U
& y7 e9 t5 ~: P! t' g- void SDA_OUT(void)
+ J9 y D" C8 u5 X" n - {
: B- h: W! w% w4 q9 C% g - GPIO_InitTypeDef GPIO_InitStructA;
R: b! i) E; j" G - RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA|RCC_AHBPeriph_GPIOB|RCC_AHBPeriph_GPIOF,ENABLE);
+ e" p' w3 N) m8 j# w8 t. C) `4 ? - + e0 U% `5 v: z# P2 n9 \; B
- //I2C模拟9 P- m! l0 p4 ^; Q( ], w9 N u
- GPIO_InitStructA.GPIO_Pin =SDA_GPIO;
. I! e5 I8 \' i5 p) q8 Y' J - GPIO_InitStructA.GPIO_Mode = GPIO_Mode_OUT; //GPIO_Mode_IN)输入 (GPIO_Mode_OUT) 输出 GPIO_Mode_AF第二功能 (GPIO_Mode_AN)模拟! ~* S, B* N- S! X! q
- GPIO_InitStructA.GPIO_OType=GPIO_OType_PP; //GPIO_PuPd_NOPULL(不拉),GPIO_PuPd_UP(上拉),GPIO_PuPd_DOWN(下拉)1 r$ p8 T4 M9 `, z' e* n& R
- GPIO_InitStructA.GPIO_Speed= GPIO_Speed_50MHz;
; T- a: |0 l \9 X: w - GPIO_Init(GPIOA, &GPIO_InitStructA);
* g$ @1 I- N! i9 [8 } - 5 `; j8 a: x- v. b, w B4 Y$ `' ?
- }
复制代码 $ L$ v6 V3 D5 w( [
+ k, w* H6 [3 I2 R5 H
# S0 Y0 g% V; I9 W c" w: j
|