GPIO口7 s# q6 i; ]3 s2 z) {
/ F: j! U+ U; t x& N0 m
介绍:6 f' \, j# i G6 I5 _
6 x# S- }* w6 i# I4 个 32 位 配 置 寄 存 器. N1 E% R# \* N
3 W C6 Z- K; {- _$ d2 ?2 D7 M: H
GPIOx_MODER:模式配置寄存器
$ ?2 r& J5 {) z+ V5 ]4 B- ]! l+ k# m( B6 m* [: \* V- V8 {
GPIOx_OTYPER:输出模式配置寄存器: H9 a. `6 u, k0 A3 i) e( q/ M- U
9 N/ k4 \7 u) K$ D0 q6 yGPIOx_OSPEEDR:输出速度寄存器5 A+ W/ n+ j* i9 |* L
$ g' B. @7 ^. ^4 DGPIOx_PUPDR:上拉下拉选择8 ]8 q( U6 _8 q
' I s! A- ?$ E: v4 [# `2 个 32 位数据寄存器
- ~6 w" F' V/ s O: w
9 W4 C' Y: P( w% t7 d" xGPIOx_IDR:输入寄存器6 ^" v# v& G! I. P4 ?7 r
5 Y z9 ~- C# g5 g: v; } }GPIOx_ODR:输出寄存器
7 e6 P* O' f% G* r. w/ z5 v, P' S. B2 o3 X7 H4 y" {" F
1 个32 位置位 / 复位寄存器9 t2 y" ^% g% v! k& I' z; F
9 ~9 o' n/ G* T4 C% vGPIOx_BSRR
8 T; n. K$ }# n1 z
4 R" N. S5 G3 hA和B还含有1个32位锁定寄存器: f6 v/ r( \- D8 _0 Z9 ]
4 P4 T( D: o- Z' S& b; D5 }2 VGPIOx_LCKR
7 z9 ~: y+ b0 y2 C( {! b
4 {5 S! x! m: E- G) BA和B还含有2个32位替代功能寄存器& W, C8 k+ A+ ?+ r8 H; x/ S
! N) F& i4 \5 B1 J" ]7 [: a$ w5 l" gGPIOx_AFRH :复用功能寄存器: J( |. G8 q2 I( `1 V
# ~7 e- Q0 {$ s
GPIOx_AFRL :复用功能寄存器8 j! W0 G% r6 h: M" W" N
K1 N' C, M; S4 aGPIO口可以配置成如下模式:. e7 B$ G6 A( I+ D
8 E7 s: @3 {9 ^ V) V' B6 J# j* f● 浮空输入$ _& Z6 E3 Q5 K; G7 y4 o; G
( M0 j3 ~1 W; b! f) T● 上拉输入
' i4 d! A B# r# a
: B, U4 \% ^9 \' L% I● 下拉输入
9 d- }) o+ N( S! ]1 G% p# o9 J, N6 d% |; @
● 模拟输入4 N6 R' ^& }6 ~# y, F
5 G, ^, B( Z4 ], T9 F+ |) T, g
● 具有上拉或下拉能力的开漏输出" F0 h7 l H9 N7 Z- B& E6 M6 k a1 l
: z# ]( l% \$ d, j8 b9 t+ @● 具有上拉或下拉能力的推挽输出
; A7 O+ G' c9 @5 u% s- a; n0 \' ?) T( I7 R9 W
● 复用功能且具有上拉或下拉能力的推挽输出
: g2 A+ Q3 Y, I" E
1 o& t* `/ `( R( O' S● 复用功能且具有上拉或下拉能力的开漏输出8 x! o5 I( `/ k! q
; C& s; ?9 ~! L+ @ `0 O+ c7 l1 ^$ _注意事项:$ f" n& Z( d6 ^$ v. |) f9 ]
2 T' S3 ] q; h7 F) q! [
1:所有端口都有外部中断能力。 为了用做外部中断口线, 端口线必须配置为输入模式
: y7 j8 l/ `0 X( _+ N& Y
, w$ v, G& [9 i. H+ h# p% |/ _2:对于 GPIOx_ODR 中的每位, 在GPIOx_BSRR 中有两位与之对应: BS(i) 和 BR(i)。 当对位! B* q/ u; B, \& c, p9 `
+ L+ `$ J2 U' ABS(i) 写1时则设置相应的 ODR(i) 位。 当对 BR(i) 写1时, 则复位相应的 ODR(i) 位。2 V1 h4 g y) `/ X9 m& e; r& h2 N
5 g( R$ I+ E+ U6 M% y: `+ |3 U2 a3:为了写 GPIOx_LCKR 寄存器, 须发出一个特定的写 / 读序列。 当正确的锁定序列作用于这个' I' F7 R* k/ v; j( ?' E/ r. [
- d2 U* Q+ x; `6 h- @5 @7 X6 R; W! E" B
寄存器的位 16 时, LCKR[15:0] 的值用来锁定 I/O 口的配置
$ o7 X% N6 z- m" N7 Q* a4 |/ E% T( o& s/ x1 M" p- a
配置过程:
: u! e# R/ n% h! ]" s. I
2 o l4 G4 j$ W) M/ I8 ^' ?- i- void GPIOConfigure( void ); [+ F# k, t5 J3 c S8 h, E7 h7 H/ M
3 u4 v0 y5 j- T# u0 f- {) B; J6 B' n6 Z! L) {7 b
- GPIO_InitTypeDef gpio_init_structure;4 ^4 f" ?' s B5 T& V
4 I- O9 n( a+ E7 h+ Z' a& f2 w- gpio_init_structure.GPIO_Mode = GPIO_Mode_OUT; //输出模式
3 V3 g: Z1 p- U$ E
8 {+ ~" |- V' f2 c4 t) e- gpio_init_structure.GPIO_Speed = GPIO_Speed_50MHz; //输出速度
/ Y( ], Z( i' |6 |' Y7 Q9 K ]. [ - 8 x# ?9 _ _! [( I
- gpio_init_structure.GPIO_Pin = GPIO_Pin_0; //引脚0 [- s, q: J7 N: k7 F# _
5 W& S z, \ _- gpio_init_structure.GPIO_PuPd = GPIO_PuPd_UP; //上拉模式输出: l/ W8 ?; `: a* l4 \
, v. n, n! R1 d$ v- gpio_init_structure.GPIO_OType = GPIO_OType_PP; //推挽模式输出/ o* q! @1 F2 m, T" F
+ E1 U" Y2 A* J) i, M- - Q3 r. ^+ x" f# ~' M
% M5 K/ f+ B( n3 b+ A- |, s* H- GPIO_Init(GPIOA,&gpio_init_structure);: b" _7 P5 Y; w7 o* `0 |
/ ^$ j+ N* F9 P8 f/ |8 @$ x! F L- }
复制代码- #define GPIOA_SET_BIT0 GPIO_SetBits(GPIOA,GPIO_Pin_0)//置位5 g/ o1 L. t( G9 A; \% ~- G
- + ^2 \% s; d1 M$ q) J" Q
- #define GPIOA_RSET_BIT0 GPIO_ResetBits(GPIOA ,GPIO_Pin_0)//复位
6 Q& T( p* f' w% P6 e5 |& P
1 q. y) ^3 y& v9 u0 H- #define GPIOA_RDIN_ALL GPIO_ReadInputData(GPIOA)/ m" t$ `9 ~$ }) } U" ]
- ) k; A0 {7 j7 Q3 @' l$ I/ c
- #define GPIOA_RDIN_BIT0 GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0)
" W+ d5 m( _' t3 _ r
( `7 B6 m4 Y) K- #define GPIOA_RDOUT_ALL GPIO_ReadOutputData(GPIOA)0 R0 u! ^7 Y! G- y# v% y6 o+ R3 o
+ d! F8 z% w8 i- #define GPIOA_RDOUT_BIT0 GPIO_ReadOutputDataBit(GPIOA,GPIO_Pin_0)
& f+ Z, W: M% E6 W
复制代码 ! M" s( z8 b5 j e
上面是相应的读取和写入函数,看函数名就可以理解此函数的功能
n4 Y3 ]0 V! W* ?- |. X8 C4 Q$ R) f4 K! C+ i7 E( Z9 ~# j# t6 P0 v: f
' z: w+ a f* ?
( {2 c: e8 ]0 f- V6 j, ] w3 g4 s6 p+ W6 y, B: ?; ]. `
|