GPIO口
3 E" _. R) j9 i( A0 ^3 ]$ _ I) U' _$ `# t/ K, t- R9 @
' w( H% p, Q& \: x6 e+ g7 \3 E3 R; Y- s' b# Z8 L
; L/ i' V" K0 x% C# t1 Z( J介绍:
' ]: q5 L: U9 T9 H( Y: \, V. r6 L5 r) l/ q( L/ I
4 个 32 位 配 置 寄 存 器
* j! A4 J8 Q- q
9 H$ d: Z1 f2 H# p# k& tGPIOx_MODER:模式配置寄存器8 H+ w# a; [: S5 i: M8 K! V7 }
+ Z0 F& G5 D' u7 o6 D/ qGPIOx_OTYPER:输出模式配置寄存器# x* b% O7 M1 M" i I
) Q) l( ^; N0 z8 c8 qGPIOx_OSPEEDR:输出速度寄存器1 S+ C9 X. U7 F) v, Y
/ z9 a/ H+ ]5 }+ P) p6 Q( t, KGPIOx_PUPDR:上拉下拉选择# R! l; ?% s! O1 \
- k4 ]7 L5 p/ c$ r2 个 32 位数据寄存器1 o3 u# d2 L. Q$ i" n2 L( u, _' d
& V8 c$ \7 D! R2 ^- I6 t' UGPIOx_IDR:输入寄存器
, w4 U% U L3 b6 L7 ?* h, K, t$ C$ e
GPIOx_ODR:输出寄存器
2 H9 y+ @' K9 o* g- \+ F+ Z$ D+ P2 e$ u
1 个32 位置位 / 复位寄存器
' b. [( c3 M, O1 w2 z2 ~6 L: V9 n# J) E# i% [% m
GPIOx_BSRR
/ L$ f9 |+ Z0 b9 N5 n: s7 r# N8 u$ V* J5 J; Z7 X
A和B还含有1个32位锁定寄存器
# D" r# o5 _$ n9 [) e# c- D0 i: O: x3 ]9 l6 r
GPIOx_LCKR! H: N5 D7 E L- s
# h: i' x. l1 l9 T# P
A和B还含有2个32位替代功能寄存器; C/ b5 J. f, `( P% i# p+ G' e1 R
6 d z5 r% D5 T( N: I
GPIOx_AFRH :复用功能寄存器
& P3 ~! h }$ b. V. r z( o; g, d. z* n- G0 X1 ~. |
GPIOx_AFRL :复用功能寄存器8 F! X9 k2 E3 @8 a2 A9 d% W
. v" L4 m9 q( X
GPIO口可以配置成如下模式:0 E, F }9 M: L
/ z6 v, ?& a! E6 _& L% I● 浮空输入
. t3 k+ ~& Y. z( o% v4 q$ Z9 D+ v1 A' D
● 上拉输入1 |) O( K9 }5 [: H8 ?
$ F. D+ o+ X, t; |0 h3 P* p9 t● 下拉输入$ D- Y4 i" i1 L! |& g- ^% x% e+ b m
9 g/ C% e7 d$ p. `● 模拟输入
" m- h5 `: d+ [+ T! ^1 x$ R
/ j, @& G {, w, K● 具有上拉或下拉能力的开漏输出6 V( }1 \; Z- @/ D5 V6 \ w
' ^7 z$ L. u' x2 Q● 具有上拉或下拉能力的推挽输出
# u5 E9 `* `/ y
2 Z& {# q# C1 g! u6 v* N● 复用功能且具有上拉或下拉能力的推挽输出
% u7 j' K# ]4 F4 T% X U1 ~) ^4 K
* y A2 v% H+ M6 ~) \6 w8 r● 复用功能且具有上拉或下拉能力的开漏输出
4 M# `$ }! w0 y4 _% g3 b9 m; L( F. K. I9 M
注意事项:
- d0 x1 j2 c: p9 `6 M( A' l% v/ i; ]7 I5 ?0 L
1:所有端口都有外部中断能力。 为了用做外部中断口线, 端口线必须配置为输入模式
2 F9 H" o( L4 ?$ Q
& m+ ~+ Q9 |7 _6 g2:对于 GPIOx_ODR 中的每位, 在GPIOx_BSRR 中有两位与之对应: BS(i) 和 BR(i)。 当对位
( o/ T" u! `& }2 F6 n }- O' K: S4 f! B/ @
& v7 f5 [. K& v! B8 I! l; W2 mBS(i) 写1时则设置相应的 ODR(i) 位。 当对 BR(i) 写1时, 则复位相应的 ODR(i) 位。; Y+ A: A" _! I
! {! Q. q) L2 Z5 O1 n7 J# ?; q3:为了写 GPIOx_LCKR 寄存器, 须发出一个特定的写 / 读序列。 当正确的锁定序列作用于这个
' B5 q1 G8 s, k# K2 L: v0 x0 U" q+ w
寄存器的位 16 时, LCKR[15:0] 的值用来锁定 I/O 口的配置: L: w$ M$ A2 H6 e
7 P7 y# S+ g: X( b+ g' k配置过程:( ^& |" m% @' B# R; J# ?
" |+ b6 J! W6 E* l
- void GPIOConfigure( void )2 g7 O+ F( k, u' ^/ Z2 Q
' L2 S4 G* f4 \# Q9 p+ x2 _- {
2 Y/ e) f: F- r: h9 O$ T - GPIO_InitTypeDef gpio_init_structure;
+ |+ g2 w' _, I
% k# w) o0 U4 I% ~- gpio_init_structure.GPIO_Mode = GPIO_Mode_OUT; //输出模式/ z0 ~5 t3 Z ]9 e0 t- R. z
6 [+ p) ?; x L6 a: ~& Y/ ]- gpio_init_structure.GPIO_Speed = GPIO_Speed_50MHz; //输出速度
4 n3 w4 w, [$ n( k
8 i. t1 Y" |# B* u* V: J! Z# G7 m9 E- gpio_init_structure.GPIO_Pin = GPIO_Pin_0; //引脚
& ~3 l# Z! k Y& w3 {5 ]5 a# Z9 L4 S - $ E d6 H* Q8 }: m0 Z. z% ^
- gpio_init_structure.GPIO_PuPd = GPIO_PuPd_UP; //上拉模式输出
6 y0 p6 D R; h' j - ' L6 `) g& k8 m5 O( U% U \0 `" m
- gpio_init_structure.GPIO_OType = GPIO_OType_PP; //推挽模式输出
6 {3 x4 Y2 z1 X% c& G& i! ^
" `$ {. J1 ]+ w- v- ) _. ]# {; [7 T
2 z; D7 v0 W1 ]5 B* U1 X( ?- GPIO_Init(GPIOA,&gpio_init_structure);8 s6 l' i3 K/ t- G( i1 M
6 F; O- t, \/ V7 T# H k- }
复制代码- #define GPIOA_SET_BIT0 GPIO_SetBits(GPIOA,GPIO_Pin_0)//置位
8 Z5 `6 q" X8 S4 } z - 0 I4 U7 s- E" I9 c+ H
- #define GPIOA_RSET_BIT0 GPIO_ResetBits(GPIOA ,GPIO_Pin_0)//复位
1 b; p4 ^7 c" `4 ~- u
- F( u6 ?0 w; t8 p; @2 D* [) b7 N- #define GPIOA_RDIN_ALL GPIO_ReadInputData(GPIOA)
) {# M! L, i/ Q; _" h# H0 G* M; D: l7 G - % c* N/ f9 H* N# ?4 H9 M$ s* p, x
- #define GPIOA_RDIN_BIT0 GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0)
' O! ?) s* v2 N6 k3 H( n% @
7 U' c2 _8 Z& @$ Y# K- #define GPIOA_RDOUT_ALL GPIO_ReadOutputData(GPIOA)1 h0 g9 v( j# r7 p) Y$ c" t; y4 a
f% W% D# ^/ Y" d- #define GPIOA_RDOUT_BIT0 GPIO_ReadOutputDataBit(GPIOA,GPIO_Pin_0)
复制代码
- h& x6 v" \4 s" Z9 `8 I$ m: t上面是相应的读取和写入函数,看函数名就可以理解此函数的功能+ s( ^" M$ A) U, P
' D+ p# G p, P& j% N5 ?
- int main(void)
0 k' m- E; m% F& y' V - {
0 {. y. z% m+ q2 i - //0 \' ~' {/ U5 v1 X e
- unsigned long i;
+ `7 z$ y. v- L4 m1 c" C - z* E# ?/ Y4 N2 Y1 R& Y) H
/ L) g4 c- z# G* C4 |! }% T- //% M1 K" S2 f( X& }
- RCC->AHBENR |= 1 << 17; // 开启GPIOA外设时钟( j w6 t+ t' q7 w- V; y
- GPIOA->BSRR = 0xFFFF; // 清除全部端口
' \# h7 S, j: T - GPIOA->MODER |= 1 << 2; // 配置PA1 通用输出模式
" w1 D$ e2 @9 K5 \( x9 P" ]) X - GPIOA->OTYPER &= 0xFFFD; // 配置PA1 推挽输出
. h" C% D" Q) Z \- R# X - GPIOA->PUPDR &= 0xFFFFFFF3; // 配置PA1 没有上下拉
! A1 g6 A* c1 X' e2 i0 x$ Q% u - GPIOA->OSPEEDR &= 0xFFFFFFFF; // 配置PA1 输出低速模式
; f5 c+ O* n" `( n6 N) ^ - ! i- J5 A5 N) u1 N9 `+ E0 B
- i = 2000000;
/ J) ]* p' n0 Z - //
( b8 C4 k# f% G3 M6 k% b - while(1)
7 n4 q% b5 O2 m @5 ~2 ~4 Y+ k - {) G2 D: R. J- ~/ _" p( t
- //
; B8 t* \: e( k2 M0 n - if(i > 1000000)
7 q& n* ^8 J/ d8 W - GPIOA->BSRR = 1 << 1;" ?0 `+ k* k, Z" ~8 T4 k
- else
8 N2 P* ?9 Z8 f - GPIOA->BSRR = 1 << 17;
$ B- e3 D! D' d, h* Z7 d - if(i == 0)
/ D8 o$ V0 F S: ~2 P1 O3 O - i = 2000000;
3 h4 c, W* i* q, x- w$ P6 I - else
1 c- n B- f; n! B8 J - i--;
; G. }! |$ F/ x - //
3 b: X6 Y9 t0 _! z0 }# p3 z+ |3 u; v - //4 J- y* k. a& z
- }
3 j+ U$ D+ H2 [% b. g4 o' s5 ? - //* g3 d5 h+ u# V3 _5 A( q
- }
复制代码- void I2C_MyInit(void)
0 |. o7 n6 U2 G6 P% | - {2 R' j8 B1 i5 \/ D% q$ r
- GPIO_InitTypeDef GPIO_InitStructA;: n" V) l9 i6 T- v: [- v
- & B. p" h( @' @
- # l# a4 @" ^5 i) J% O( A
- RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA|RCC_AHBPeriph_GPIOB|RCC_AHBPeriph_GPIOF,ENABLE);
1 B4 {! R; ^3 |0 }1 L - - n: i8 X" _1 X* D
- //I2C模拟
8 a. y: s3 |4 ~, Q4 N/ T3 D1 w/ ] - GPIO_InitStructA.GPIO_Pin =SCL_GPIO|SDA_GPIO;4 W% G& g- R" i/ G+ _7 y! h& p
- GPIO_InitStructA.GPIO_Mode = GPIO_Mode_OUT; //GPIO_Mode_IN)输入 (GPIO_Mode_OUT) 输出 GPIO_Mode_AF第二功能 (GPIO_Mode_AN)模拟
+ M& e- Q& S$ q ~/ B5 ?2 L - GPIO_InitStructA.GPIO_OType=GPIO_OType_PP; //GPIO_PuPd_NOPULL(不拉),GPIO_PuPd_UP(上拉),GPIO_PuPd_DOWN(下拉)4 \! W# L; `) {7 \
- GPIO_InitStructA.GPIO_Speed= GPIO_Speed_50MHz; 4 @# C% F, k b2 J' p
- GPIO_Init(GPIOA, &GPIO_InitStructA);
- W7 [; F1 \- |, k- ~ - GPIO_SetBits(GPIOA,SCL_GPIO|SDA_GPIO); //PA0,PA2输出高1 {- w+ I, U4 ]- X" T
- }- m0 R0 H) m7 K M
- void SDA_IN(void): _$ ^. t4 Q( |! |4 `
- {
% n$ O4 @( z+ k0 j& N/ R9 I% p8 Y - GPIO_InitTypeDef GPIO_InitStructA;
# f5 w" [4 J' X$ K) t" s
2 ~7 z& d0 R) e- 0 Y: D: W+ ^: h) |
- RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA|RCC_AHBPeriph_GPIOB|RCC_AHBPeriph_GPIOF,ENABLE);
! L j. { ] e5 r! h
2 D& T3 t5 p0 ^1 t2 P! H9 e8 Z- //I2C模拟
, U u7 R; v E0 E - GPIO_InitStructA.GPIO_Pin =SDA_GPIO;
9 D% F Z+ _- X: ?% @9 _4 o5 ] - GPIO_InitStructA.GPIO_Mode = GPIO_Mode_IN; //GPIO_Mode_IN)输入 (GPIO_Mode_OUT) 输出 GPIO_Mode_AF第二功能 (GPIO_Mode_AN)模拟
! r& M1 L. h. ~" K- t - GPIO_InitStructA.GPIO_PuPd=GPIO_PuPd_NOPULL; //GPIO_PuPd_NOPULL(不拉),GPIO_PuPd_UP(上拉),GPIO_PuPd_DOWN(下拉)
' Q6 h& z) Q2 T& F( i$ E3 K. o' ] - GPIO_Init(GPIOA, &GPIO_InitStructA);; e: Y a7 T& H8 ~+ |. _
- }! n8 C# }& a0 b% K2 }- w& t! b
- ! z- I, c. O& y. I- f; N+ t
- void SDA_OUT(void)/ F$ J& _$ K/ w" l! o
- {
* J* ]3 f" F5 _0 x/ O - GPIO_InitTypeDef GPIO_InitStructA;
& ^# U7 V3 J9 K$ c - RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA|RCC_AHBPeriph_GPIOB|RCC_AHBPeriph_GPIOF,ENABLE);
- u* N; ~+ E( F; W8 g: a& b' J - * j& S. X* C3 f; G8 b
- //I2C模拟
0 Y; W: W# l% ]& q. [, J - GPIO_InitStructA.GPIO_Pin =SDA_GPIO;6 L1 G9 K! u9 A+ C
- GPIO_InitStructA.GPIO_Mode = GPIO_Mode_OUT; //GPIO_Mode_IN)输入 (GPIO_Mode_OUT) 输出 GPIO_Mode_AF第二功能 (GPIO_Mode_AN)模拟( R; c- w) U2 g4 ~7 w, ^
- GPIO_InitStructA.GPIO_OType=GPIO_OType_PP; //GPIO_PuPd_NOPULL(不拉),GPIO_PuPd_UP(上拉),GPIO_PuPd_DOWN(下拉)' a, A; f5 ?' q$ ~- N" j; Z0 k. | g
- GPIO_InitStructA.GPIO_Speed= GPIO_Speed_50MHz;
; j+ c) U' @/ X8 ? - GPIO_Init(GPIOA, &GPIO_InitStructA);
) ? I0 V0 B# |9 @$ q1 h - : t6 h! g/ `1 t8 {9 J
- }
复制代码
) ^% a$ z9 S( I- }8 L( i% T% U. [- |( v: c1 F8 S
8 ?& ^% S( z9 v0 }2 K8 y! H* q8 F
|