GPIO口
7 j- o' D# g E% {5 C* a' M6 d3 t( k) T8 r% S4 T+ ?: h
# ?8 v$ d/ t% ^7 u" @2 F' J
% p/ o @9 q! h" n. F. E4 m9 j* Q" G f; h+ Z3 }
介绍:
& |: P; s0 n# C4 m2 {" k. q6 Z& r/ w% b; d) A) L% @9 A
4 个 32 位 配 置 寄 存 器
0 \, d1 d! i0 {, U
* Q+ {: ]5 F* O l- Q4 vGPIOx_MODER:模式配置寄存器! l3 d) B4 M0 k& W
0 _$ u9 h1 _1 cGPIOx_OTYPER:输出模式配置寄存器, b- H$ Z% o! T, h6 Z3 b- t
- }9 q9 c' W3 b: P' ZGPIOx_OSPEEDR:输出速度寄存器
, C" ]1 Y' ~& o* f6 ~7 t2 d6 g4 c/ R' d# \# U. H
GPIOx_PUPDR:上拉下拉选择
! v3 T, I+ O: P( a# r( p2 L1 _- U( w# B
2 个 32 位数据寄存器" j" t. F/ V) P% ~1 F
6 c+ u1 i) A9 n+ L3 [# P- {
GPIOx_IDR:输入寄存器
3 D% {$ `' |8 \5 q5 i1 Q, W' y1 t8 f& T
) _1 z5 g7 G- a: Q5 h- M/ A0 SGPIOx_ODR:输出寄存器5 [: X# E& p1 [- @; Y9 _
$ }; v7 ]! A+ ^; d# i# }7 D1 个32 位置位 / 复位寄存器8 l% K4 l/ h; N# e# U$ ~
* F# F$ t' v# W$ NGPIOx_BSRR8 e2 P& W$ A$ ~( S' H& ^
% s8 e8 G, y }A和B还含有1个32位锁定寄存器
0 I/ d2 N" \0 Y% o) Q/ ]4 c6 M0 M$ V2 ^* @' r& Y& _
GPIOx_LCKR
/ @% w7 T+ I* J. t) D% j; P2 }7 u1 {4 n
A和B还含有2个32位替代功能寄存器9 h/ U2 s, M4 `* p- k6 C! W P
# }* K, c: j; S8 T% t8 i5 mGPIOx_AFRH :复用功能寄存器+ F! k: A' p1 i" g, E
& V" Q; {0 @" y& K' i3 B" BGPIOx_AFRL :复用功能寄存器# z8 f3 p% A. F R- U+ i
7 c. |2 g) i( U/ p5 U4 F- P/ kGPIO口可以配置成如下模式:
4 D u6 d3 v' d# ]% ?
" ~) a$ J! c! N0 l# u) f● 浮空输入. {6 R! o: M0 J+ b8 ~" x5 E& K
8 K9 f8 q) @* U& B! \2 y1 l$ v● 上拉输入. Q& N& G: F J& `
( p* F7 r9 ]2 @● 下拉输入* h( C( P5 K3 U3 w$ C
; }( ?8 ?) x8 ]9 f# c" c
● 模拟输入
( J b8 ^" H% c! h0 i5 C
4 l8 P5 \0 { s( V% L* Y2 O● 具有上拉或下拉能力的开漏输出, @0 y$ c; ~0 @
1 s! H# J8 b' @7 g* }" I% B● 具有上拉或下拉能力的推挽输出
1 c4 X- s! n* w( K5 U1 M- Y
3 l0 i/ {' c8 ^$ k, b w6 Z' K● 复用功能且具有上拉或下拉能力的推挽输出
' F4 g, Z! m: m& s( D$ ]# z8 L! y# C/ x" D
● 复用功能且具有上拉或下拉能力的开漏输出
; o- @/ h* F5 H: h
/ q! ?' W9 e% z: T. u9 r4 R* V/ q9 Z注意事项:5 M. t9 u! d. t& B" S' V
- }3 J4 a5 t* {# L
1:所有端口都有外部中断能力。 为了用做外部中断口线, 端口线必须配置为输入模式/ S! ^; v: @% Y8 Y
2 }/ V+ z2 _2 K2 c* }2:对于 GPIOx_ODR 中的每位, 在GPIOx_BSRR 中有两位与之对应: BS(i) 和 BR(i)。 当对位5 Y, ^" p1 K; W8 Q/ ]+ h2 L- B9 ^
: N6 C8 a; l* g8 s. vBS(i) 写1时则设置相应的 ODR(i) 位。 当对 BR(i) 写1时, 则复位相应的 ODR(i) 位。$ N V2 x5 S; B$ @
, l2 `& q, T" f4 b* h/ _+ w
3:为了写 GPIOx_LCKR 寄存器, 须发出一个特定的写 / 读序列。 当正确的锁定序列作用于这个
7 l7 Y. w6 p; n" ]1 ^! m* a! B6 c- G$ F) J, K) Y% v. f7 T
寄存器的位 16 时, LCKR[15:0] 的值用来锁定 I/O 口的配置
5 ]% l$ z% t5 C2 X' Z$ u5 H' P$ i4 M; K) [
配置过程:# {, i7 N" y7 [2 R [6 S) a
' r% b4 u7 D! w7 O
- void GPIOConfigure( void ): L. f3 a5 E/ c; Z, F
- 6 y: R' o" M. G& l4 c
- {3 r$ @: \6 O- |; J u
- GPIO_InitTypeDef gpio_init_structure;
$ o/ X- }& `0 S* s/ `
1 M' N) |. F3 v1 w& _* `* J- gpio_init_structure.GPIO_Mode = GPIO_Mode_OUT; //输出模式
' @+ [ n, ?2 O$ K
& G9 M. {/ M' G0 K3 t% H2 n, {+ ^- gpio_init_structure.GPIO_Speed = GPIO_Speed_50MHz; //输出速度/ u7 W T; G3 E- M+ y% D2 e; G$ p
8 i; z+ Y# X+ V* @5 r% T$ N1 v- gpio_init_structure.GPIO_Pin = GPIO_Pin_0; //引脚
* r# A$ e! t/ G8 w6 a% v
2 e+ \5 w3 b" L5 c. a E* M- gpio_init_structure.GPIO_PuPd = GPIO_PuPd_UP; //上拉模式输出" g5 E3 {# f# F: K7 ]2 A2 Y
- 0 m: r7 T( p- M5 n) U
- gpio_init_structure.GPIO_OType = GPIO_OType_PP; //推挽模式输出; ~$ \, S; `8 _$ Z0 x6 C7 Z
- * s. \, Z5 |/ X
$ d! J) ~ ?6 P+ y; k0 _- ! u; g$ p- P0 c9 W6 B
- GPIO_Init(GPIOA,&gpio_init_structure);' K: ^7 Q$ l% z D& V
- % y$ V) s" r9 w" \) C9 g
- }
复制代码- #define GPIOA_SET_BIT0 GPIO_SetBits(GPIOA,GPIO_Pin_0)//置位' j) M7 A9 X2 D. ?/ R+ e) O
( d. ^+ F2 W2 B2 P! r5 l- g3 p# i4 }2 C- #define GPIOA_RSET_BIT0 GPIO_ResetBits(GPIOA ,GPIO_Pin_0)//复位* q3 V, z$ \* G D, o
- + x) h1 K2 u, ~. {+ u, v, k
- #define GPIOA_RDIN_ALL GPIO_ReadInputData(GPIOA)
/ v' z) ^9 a: l' v. W" C# C6 z& x0 L - 4 Q3 F3 D5 K' b* j/ e
- #define GPIOA_RDIN_BIT0 GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0)
- [% A7 A. B- ?
7 [9 x) C- u8 ~% F `& a- #define GPIOA_RDOUT_ALL GPIO_ReadOutputData(GPIOA)
& A3 _6 k& V# ]% x, @
) P8 h/ `7 i4 `- #define GPIOA_RDOUT_BIT0 GPIO_ReadOutputDataBit(GPIOA,GPIO_Pin_0)
复制代码
. d" u: X/ x7 |8 N3 @1 p+ A上面是相应的读取和写入函数,看函数名就可以理解此函数的功能: C: V0 Q! ]2 Q
9 ]6 Q' Q, Z4 k- int main(void)1 J1 a8 \: L) d% C0 ?
- {. A. v3 f- P+ [! J
- //9 _! @! M# P* A8 c
- unsigned long i;
% d) P c/ n4 H% N
- X0 z. H# ]5 D8 e. s5 Z
) R! N `' T& j x! h- //
) S& `$ m7 n: |' r - RCC->AHBENR |= 1 << 17; // 开启GPIOA外设时钟
. s, R$ u" N) ~4 b j - GPIOA->BSRR = 0xFFFF; // 清除全部端口0 L& _3 b: Z r0 l& W. F& N3 F4 |
- GPIOA->MODER |= 1 << 2; // 配置PA1 通用输出模式
+ ~% Z# g$ ~8 x. Q5 y! i" W - GPIOA->OTYPER &= 0xFFFD; // 配置PA1 推挽输出
! i; m" x* x h& [ - GPIOA->PUPDR &= 0xFFFFFFF3; // 配置PA1 没有上下拉
3 A6 M. T8 T( q9 g) n- J - GPIOA->OSPEEDR &= 0xFFFFFFFF; // 配置PA1 输出低速模式
8 n; [$ V4 N, |) i0 l# ^1 ^) b - 2 F+ k* G) ]% T8 ^! l) l
- i = 2000000;9 f% Y: h- H9 G# U6 {* p+ v/ M
- //3 ^1 Z5 b2 T7 {
- while(1)! q- u( G \. }9 h0 L/ I- Q
- {& H4 }3 `/ P3 G: I4 I$ e) F/ V
- //" D. M1 Z$ i' ]" j
- if(i > 1000000)( L" u: B7 O/ X& q1 p2 [
- GPIOA->BSRR = 1 << 1;
+ v, \6 Y. T% y5 G3 H0 h2 t - else
4 s6 U# }6 E( M, T3 _' m - GPIOA->BSRR = 1 << 17;
# J8 K, h1 t3 I6 o3 j4 Y - if(i == 0)4 l! S' I3 q7 u1 m
- i = 2000000;5 {/ H/ }1 z* ^2 W; q4 I
- else" }) V# W3 ~7 d" f
- i--;6 e4 T0 {$ \# S5 h* ~4 L, P
- // 5 ]; @" D; Y: J+ J
- //3 ?; H: d( I6 K. W' z' B9 d+ k) p
- }
0 K+ Q/ }7 j" s+ M' v - //
* N/ r5 }; w/ s [& E! f& l - }
复制代码- void I2C_MyInit(void)
1 E( s5 \& ~' d! J. D - {
% S+ A0 n [# i - GPIO_InitTypeDef GPIO_InitStructA;- I! t$ S& C- P' M/ z) |
- 9 V! e9 g0 {) L1 c! M8 r3 A
- / s9 y/ C0 _/ r
- RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA|RCC_AHBPeriph_GPIOB|RCC_AHBPeriph_GPIOF,ENABLE); 5 \) Q3 T4 u8 R4 C2 u
- 7 y( R* M, l" d1 m! Z. C# e3 \
- //I2C模拟
. a3 p- N# `/ z: D" r" K - GPIO_InitStructA.GPIO_Pin =SCL_GPIO|SDA_GPIO; I3 v) N# l/ J8 v$ r; b+ r
- GPIO_InitStructA.GPIO_Mode = GPIO_Mode_OUT; //GPIO_Mode_IN)输入 (GPIO_Mode_OUT) 输出 GPIO_Mode_AF第二功能 (GPIO_Mode_AN)模拟
7 M# q- o- f; G: s& ? - GPIO_InitStructA.GPIO_OType=GPIO_OType_PP; //GPIO_PuPd_NOPULL(不拉),GPIO_PuPd_UP(上拉),GPIO_PuPd_DOWN(下拉)1 ?7 L$ ^7 H3 n0 E4 R: [3 W3 L8 e
- GPIO_InitStructA.GPIO_Speed= GPIO_Speed_50MHz; - @) b) _0 p- z$ Q) r0 P! y, D Q
- GPIO_Init(GPIOA, &GPIO_InitStructA);
' v7 S, e4 j+ }& u9 \* l - GPIO_SetBits(GPIOA,SCL_GPIO|SDA_GPIO); //PA0,PA2输出高% M" F- {* u3 O$ m2 W# P8 U) r
- }: n* Q' f' t$ z' x, _
- void SDA_IN(void)
* R& i9 X8 _) A$ h7 d# `; g& @ - {
5 R; l3 n( }& j0 k5 Y - GPIO_InitTypeDef GPIO_InitStructA;" M* A& T$ r% N. n! U5 I
0 L& k; e6 r7 ?" k- v- 3 ^, B! H" Y1 z9 f4 c+ f; t
- RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA|RCC_AHBPeriph_GPIOB|RCC_AHBPeriph_GPIOF,ENABLE); ! Y' M# `% l/ e, X& H4 m
- 5 {7 C2 i" J Z
- //I2C模拟
! W7 ?8 U! z5 T* l+ S - GPIO_InitStructA.GPIO_Pin =SDA_GPIO;: ?7 S, j# |% D ]# ]. i& x) w5 `( G
- GPIO_InitStructA.GPIO_Mode = GPIO_Mode_IN; //GPIO_Mode_IN)输入 (GPIO_Mode_OUT) 输出 GPIO_Mode_AF第二功能 (GPIO_Mode_AN)模拟
+ ^, P6 H- |+ G4 ]* b" m - GPIO_InitStructA.GPIO_PuPd=GPIO_PuPd_NOPULL; //GPIO_PuPd_NOPULL(不拉),GPIO_PuPd_UP(上拉),GPIO_PuPd_DOWN(下拉)' ?$ P! j! ^4 p: }3 h( P
- GPIO_Init(GPIOA, &GPIO_InitStructA);
7 Q$ L5 g X4 z - }; G) [, _) @, |+ m) ]
+ X! v; k4 }+ T: [% D' k, Q- void SDA_OUT(void)! q/ Q* R, N: g8 q8 U# n: S
- {
' v c6 b2 d+ X9 K' T) o - GPIO_InitTypeDef GPIO_InitStructA;
5 z! B! c+ B) a0 @2 f/ [+ Z - RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA|RCC_AHBPeriph_GPIOB|RCC_AHBPeriph_GPIOF,ENABLE); 9 {( V6 A- d1 v4 K1 g# u, Q
- $ }" o8 k# u5 m7 N- @
- //I2C模拟$ U' Z+ |! G) P% K: l( s) f
- GPIO_InitStructA.GPIO_Pin =SDA_GPIO;
9 j% z- {/ v8 f7 T8 V) T. d( W P6 Y - GPIO_InitStructA.GPIO_Mode = GPIO_Mode_OUT; //GPIO_Mode_IN)输入 (GPIO_Mode_OUT) 输出 GPIO_Mode_AF第二功能 (GPIO_Mode_AN)模拟% L, V: p$ z' u+ U
- GPIO_InitStructA.GPIO_OType=GPIO_OType_PP; //GPIO_PuPd_NOPULL(不拉),GPIO_PuPd_UP(上拉),GPIO_PuPd_DOWN(下拉)
* _: }- R$ q; l% R7 D - GPIO_InitStructA.GPIO_Speed= GPIO_Speed_50MHz;
3 ]* o2 @# ~4 C, ^ - GPIO_Init(GPIOA, &GPIO_InitStructA);3 I- F+ O* x) L; z
* Y, n2 T. L* d3 }2 z6 b/ m! y- }
复制代码 - j' T% j. W. H& `! b+ X
( q$ U A% K4 w/ ?( E
1 n/ O7 f% T9 U* c- {! y* n; U5 T |