GPIO口
- J( F y( n% Q& j C0 {$ Z
- n) B- o& C+ A7 o& d2 L
) \- e: i% O# f6 w' E* {* G% S; M/ k$ ~% y6 q: t7 O
. A( w8 {( a0 v+ n介绍:! b4 {- Z( p5 {
) y, s: t7 X3 r4 个 32 位 配 置 寄 存 器
) \0 v& p* Z! g, s0 g2 ^0 ^& K8 z1 ?4 ~+ D5 W* J* Q
GPIOx_MODER:模式配置寄存器
3 @# Y1 K8 F& F. E4 E) K
$ E* L+ z/ W1 m" E* h7 Y; Z) ^GPIOx_OTYPER:输出模式配置寄存器
- z% r+ @" ~9 V
) B. @, W& N" SGPIOx_OSPEEDR:输出速度寄存器5 x; I H& O7 Y& v- r! w, J
& z# B4 l, | p- h
GPIOx_PUPDR:上拉下拉选择, j: h( g- R0 A1 D/ k- _8 d
5 `# S; k: e' N7 i" M4 h: o
2 个 32 位数据寄存器) l. z6 Z: i* I7 Y
+ y( x$ ^/ D$ f
GPIOx_IDR:输入寄存器
9 [4 v% s; {- I% E: w$ ?6 h$ l0 d3 E6 Z! O& o
GPIOx_ODR:输出寄存器
) v" J( {: ]& C; V7 w% ?, A8 Q" w; h/ T: S2 j- i
1 个32 位置位 / 复位寄存器
3 W- |. C- D5 d; s
/ i3 ^9 e1 r% X4 PGPIOx_BSRR
( B3 k/ u" S- q! Q# B# C; D& j( D
# J1 d4 F6 u0 p& m6 sA和B还含有1个32位锁定寄存器, M/ Y# W7 W/ K+ p2 C! Q6 m
! ]! v1 x& `. A. q) E/ @ f; hGPIOx_LCKR& ]! G c& W6 q' T
1 Z' I( O! Y2 J1 O+ q+ sA和B还含有2个32位替代功能寄存器
5 S! x. c+ ]7 H5 B
. }9 A: Q3 ?4 O6 J: U# f* @; HGPIOx_AFRH :复用功能寄存器+ h" q8 I. L3 [2 c1 ^' C0 |
4 J& C. i9 Y- l/ h4 C. b
GPIOx_AFRL :复用功能寄存器7 H) Z; V; ~9 M) g+ w
5 V9 K! z- ]! h( o; I
GPIO口可以配置成如下模式:
: G( G0 Z% H, m- R6 H M
# |' m' ]6 ?% t1 I● 浮空输入
. ^( R# E: M9 x# E+ U+ b6 x( a
4 w6 p4 o q" J- ~● 上拉输入
_) l& ^. v! G3 T- @( P
( s# a; h" S# J1 o# v● 下拉输入
! v2 o9 z* K0 t. z3 U& }3 |% n6 `5 h; M) W% h: U
● 模拟输入
6 f8 y2 ^; }: n
+ t$ B" h0 I+ ^2 M( L4 i1 Q& T● 具有上拉或下拉能力的开漏输出3 T Q/ r5 c' h2 `. A
+ `& X- ^' x8 ^● 具有上拉或下拉能力的推挽输出" p, _) K; C) T' ?6 Z7 {
) @& G$ K# S. c/ d- f● 复用功能且具有上拉或下拉能力的推挽输出
0 j8 y8 t' g+ q- [/ ~5 g7 I) y
* I- A& v7 O- E* I' Z! _5 l8 E● 复用功能且具有上拉或下拉能力的开漏输出
/ |: \# t) v/ X- N5 i1 G* l% n. E) @; o5 F& T
注意事项:
( L2 R7 P1 B3 T' N$ B$ Y& @
0 I+ o# C. O1 X; i) F4 l3 O5 R1:所有端口都有外部中断能力。 为了用做外部中断口线, 端口线必须配置为输入模式, [, ~* W* x$ S. G8 P
2 l* @. k, a( D8 [. r7 c2:对于 GPIOx_ODR 中的每位, 在GPIOx_BSRR 中有两位与之对应: BS(i) 和 BR(i)。 当对位 d6 }9 E2 ?6 j/ ? d4 n4 p
4 t2 F3 A- \- l2 B) r
BS(i) 写1时则设置相应的 ODR(i) 位。 当对 BR(i) 写1时, 则复位相应的 ODR(i) 位。
( P; W7 {9 v; t7 P" A! z' I; o4 A& E# Y3 c5 X N+ h+ A
3:为了写 GPIOx_LCKR 寄存器, 须发出一个特定的写 / 读序列。 当正确的锁定序列作用于这个
! }# ^, P6 W/ i2 k
2 W6 m' ~8 t( [- g- W: R" K寄存器的位 16 时, LCKR[15:0] 的值用来锁定 I/O 口的配置
0 [! B0 d. d6 a$ f( Z5 h+ C: d5 ]! N8 f1 g8 e
配置过程:
, E! l' j8 X) m% `( ]7 Q
& H: ^& q% p8 n. { x& o- void GPIOConfigure( void )
! C) {+ T4 h: ~( w; L5 T - * I; f7 y0 J5 g$ o/ c) ~
- {+ G; Z/ P$ H/ a9 O5 `3 j
- GPIO_InitTypeDef gpio_init_structure;
5 P2 w J2 M' N4 _
; j2 [' t* S( e- gpio_init_structure.GPIO_Mode = GPIO_Mode_OUT; //输出模式
: o3 [. p+ C) _) K* o* V
! h+ f3 V0 k0 D: W% o6 E- gpio_init_structure.GPIO_Speed = GPIO_Speed_50MHz; //输出速度
) Y7 Q& @. P" R2 ?& K
2 o+ I, z8 Y5 i9 v; |- gpio_init_structure.GPIO_Pin = GPIO_Pin_0; //引脚
& p0 D8 N9 {. Q) u9 q ^5 ~3 N
) U* p5 [# a8 `4 N/ m- gpio_init_structure.GPIO_PuPd = GPIO_PuPd_UP; //上拉模式输出& r- l- Y0 h" i; Z3 T
{, S+ H6 x6 s( l4 @+ w2 s7 w6 D- gpio_init_structure.GPIO_OType = GPIO_OType_PP; //推挽模式输出! i, D& _$ p' R5 M2 O0 g. B2 f
- ( u4 g2 U; @$ C% Q9 u
- ! x- n0 e8 a3 m7 B% T( K( d M# E
( W8 U4 J4 f' Y( Y6 v- GPIO_Init(GPIOA,&gpio_init_structure);8 L. Y1 X" T: m4 e' C5 V
- 3 a* Q$ L9 H {- b& d
- }
复制代码- #define GPIOA_SET_BIT0 GPIO_SetBits(GPIOA,GPIO_Pin_0)//置位# f% @" D A1 n5 M& r! U$ S
- ; K ^- M+ R' x) o( G: n, A# t/ u# {
- #define GPIOA_RSET_BIT0 GPIO_ResetBits(GPIOA ,GPIO_Pin_0)//复位
8 Y4 s8 d& A5 V2 r- W m - ! C1 z3 {0 W( g
- #define GPIOA_RDIN_ALL GPIO_ReadInputData(GPIOA)- |- i6 M0 x+ {# r" F
4 a$ m V9 W) Y# g7 i; M- #define GPIOA_RDIN_BIT0 GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0)' @/ a: k* [1 M$ k# `# y
- 8 E4 m* Z! d3 [; `+ l4 d* p
- #define GPIOA_RDOUT_ALL GPIO_ReadOutputData(GPIOA)$ V4 R) ~6 V9 B* q
- 0 X. t5 f4 x$ j1 x. ]9 N
- #define GPIOA_RDOUT_BIT0 GPIO_ReadOutputDataBit(GPIOA,GPIO_Pin_0)
复制代码
9 o3 t0 o4 l% W$ A4 ]/ m' t上面是相应的读取和写入函数,看函数名就可以理解此函数的功能
6 O& l4 D8 I( _/ ?* i2 ~& `3 {' ^5 R5 x
- int main(void)
0 D' ~+ U. s; F7 { - {
* C" R. S* q3 c* |' Y( u; ~# Q - //2 \/ ?1 q: U7 t0 I
- unsigned long i;
+ G( a- U1 z: L" A3 @# ~; {
9 r# H( }/ _& x' I. r* S) K
( Z5 O5 Q) e3 L1 t' v h* a- //
" L" i" W3 Y6 v& l% Q- p - RCC->AHBENR |= 1 << 17; // 开启GPIOA外设时钟
4 D9 S' O* j$ Y9 [ - GPIOA->BSRR = 0xFFFF; // 清除全部端口
) m; u# E+ w3 e# U - GPIOA->MODER |= 1 << 2; // 配置PA1 通用输出模式+ e, D/ O- Q0 C, m
- GPIOA->OTYPER &= 0xFFFD; // 配置PA1 推挽输出" `, c& x2 [7 |5 O: _1 }# V1 P
- GPIOA->PUPDR &= 0xFFFFFFF3; // 配置PA1 没有上下拉
- y4 }0 X0 T- Z; A+ S: `8 N: \ - GPIOA->OSPEEDR &= 0xFFFFFFFF; // 配置PA1 输出低速模式0 m0 Z; M" U) m' z! L" H$ J& ^
- 6 k9 C- \; P8 R- W9 S3 z2 y
- i = 2000000;2 {* l! c+ P, t) Q
- //
+ A" J9 Z. w, ~. n9 R - while(1); E4 d4 f: ~" m8 c/ F& w3 u
- {7 P& D+ k- V% B! W: o7 |$ e
- //( _3 m& J+ w$ @0 s8 q3 s
- if(i > 1000000)
/ L& f4 ^, X) O% J% g - GPIOA->BSRR = 1 << 1;$ y( e8 `7 s, W' J. [8 R( K
- else5 L2 h' Y1 S& R ~5 ^6 R# c$ C
- GPIOA->BSRR = 1 << 17;2 L6 }' S: A3 f$ B7 a" A; S( E7 A
- if(i == 0)
) Q- N/ [4 m3 j/ {# @/ [, `7 K' J - i = 2000000;
\: G v% a* h - else; _. O. }( @( G
- i--;
9 d% [3 O* _ ~) d - //
$ k# Q! r! E& a% p) V7 k9 G - //8 _6 L5 Y( A" g
- }/ w1 d# a" v5 C8 c& Z- Z. E
- //) O/ z' d G! R9 G" h' g% F, S
- }
复制代码- void I2C_MyInit(void), { a. s9 `/ r, e' ~ s- [: l
- {* L( M+ o% ]3 v- N4 S
- GPIO_InitTypeDef GPIO_InitStructA;, V+ R5 A8 V$ j1 ?. X1 ]; K$ D
- j0 _: u& ]4 k7 O6 R-
- [' \1 a, |6 w - RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA|RCC_AHBPeriph_GPIOB|RCC_AHBPeriph_GPIOF,ENABLE); " N1 y) q- x0 }( |4 a
- ) d# C. Q/ O- k# ~+ e+ b/ y( X
- //I2C模拟
! g* `% i E7 ? - GPIO_InitStructA.GPIO_Pin =SCL_GPIO|SDA_GPIO;
4 J3 @/ u% y9 ?* B8 ? - GPIO_InitStructA.GPIO_Mode = GPIO_Mode_OUT; //GPIO_Mode_IN)输入 (GPIO_Mode_OUT) 输出 GPIO_Mode_AF第二功能 (GPIO_Mode_AN)模拟
" X& W2 L! f) a$ t3 i( @ - GPIO_InitStructA.GPIO_OType=GPIO_OType_PP; //GPIO_PuPd_NOPULL(不拉),GPIO_PuPd_UP(上拉),GPIO_PuPd_DOWN(下拉)! d, V! h. t/ h
- GPIO_InitStructA.GPIO_Speed= GPIO_Speed_50MHz;
8 J$ j4 H+ v/ `4 Y( ~: O/ F - GPIO_Init(GPIOA, &GPIO_InitStructA);
6 j" j- f8 ]2 c N1 i - GPIO_SetBits(GPIOA,SCL_GPIO|SDA_GPIO); //PA0,PA2输出高$ ^7 T& h/ V; ]/ u- e
- }
4 g9 c% h& A! j - void SDA_IN(void)8 L+ I# J# m9 l3 Q" ]) W0 j, I: a
- {
J1 y/ L: \) C0 s9 o* n5 h - GPIO_InitTypeDef GPIO_InitStructA;6 d& }. j; U0 S: s# N( \0 [3 y
- 8 d7 G7 z7 l! E+ G- I6 `' } V. V4 |/ T
-
6 k( Y" m- s1 I - RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA|RCC_AHBPeriph_GPIOB|RCC_AHBPeriph_GPIOF,ENABLE);
6 H2 T: B v" a) u: c
4 S q/ W! t- ^; ~' p- //I2C模拟
7 a- }# x% [5 G% D- i8 \2 V - GPIO_InitStructA.GPIO_Pin =SDA_GPIO;+ S. y5 p3 S. {8 X1 S
- GPIO_InitStructA.GPIO_Mode = GPIO_Mode_IN; //GPIO_Mode_IN)输入 (GPIO_Mode_OUT) 输出 GPIO_Mode_AF第二功能 (GPIO_Mode_AN)模拟5 k! ?. | _$ U# R
- GPIO_InitStructA.GPIO_PuPd=GPIO_PuPd_NOPULL; //GPIO_PuPd_NOPULL(不拉),GPIO_PuPd_UP(上拉),GPIO_PuPd_DOWN(下拉)
8 i2 i. \* Y' f' G* A - GPIO_Init(GPIOA, &GPIO_InitStructA);
% t1 y) X- {) T3 a, K. T7 U - }! I5 d/ L* k z+ G4 I1 d
0 I0 T) i& p6 E- void SDA_OUT(void)
: B0 l5 S: A; N* {9 c - {* E0 R, U( B$ _
- GPIO_InitTypeDef GPIO_InitStructA;
( ~2 @: H( A! {" [! x - RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA|RCC_AHBPeriph_GPIOB|RCC_AHBPeriph_GPIOF,ENABLE); 3 m4 S4 H* s/ Z
- " j' {8 n5 O1 q; Q
- //I2C模拟
+ Y0 A7 s; w% Y7 K1 ]. T - GPIO_InitStructA.GPIO_Pin =SDA_GPIO;* y O6 I/ p) z8 s: L
- GPIO_InitStructA.GPIO_Mode = GPIO_Mode_OUT; //GPIO_Mode_IN)输入 (GPIO_Mode_OUT) 输出 GPIO_Mode_AF第二功能 (GPIO_Mode_AN)模拟
- e# V% A+ w! g2 C6 S - GPIO_InitStructA.GPIO_OType=GPIO_OType_PP; //GPIO_PuPd_NOPULL(不拉),GPIO_PuPd_UP(上拉),GPIO_PuPd_DOWN(下拉): t" c+ X2 s/ A: D, `4 {+ Q
- GPIO_InitStructA.GPIO_Speed= GPIO_Speed_50MHz; ! ^, c' w, R; Z: ^" q
- GPIO_Init(GPIOA, &GPIO_InitStructA);
, t% j. o( |. Q% ]
5 Z; K/ g- C8 ?7 G+ q+ m- }
复制代码
3 d8 U. }" L# F' H) C3 s0 q4 v4 ^$ I! a; F# x- C
3 G5 D3 S6 p3 [3 T2 k* o) c
|