01. GPIO复用概述
: C2 _, A) l) v9 J% D6 VSTM32F4 有很多的内置外设,这些外设的外部引脚都是与 GPIO 复用的。也就是说,一个 GPIO如果可以复用为内置外设的功能引脚,那么当这个 GPIO 作为内置外设使用的时候,就叫做复用。
5 D2 e% q1 ]8 {0 t7 W' i( t4 ^/ J8 l# V; @
STM32F4 系列微控制器 IO 引脚通过一个复用器连接到内置外设或模块。该复用器一次只允许一个外设的复用功能(AF)连接到对应的 IO 口。这样可以确保共用同一个 IO 引脚的外设之间不会发生冲突。
, ~' S( Z8 r) P1 Z+ h
' v9 h# g3 K7 d) v6 `每个 IO 引脚都有一个复用器,该复用器采用 16 路复用功能输入(AF0 到 AF15),可通过GPIOx_AFRL(针对引脚 0-7)和 GPIOx_AFRH(针对引脚 8-15)寄存器对这些输入进行配置,每四位控制一路复用
8 m% w) F. }! d4 m: X! v
8 U3 t8 A0 \! k0 L8 Z4 `1)完成复位后,所有 IO 都会连接到系统的复用功能 0(AF0)。$ h) U, x( @1 v/ z8 t. h4 V
2)外设的复用功能映射到 AF1 到 AF13。6 @5 m1 s& w7 O
3)Cortex-M4 EVENTOUT 映射到 AF15。0 s m# W* |3 o. ?( O
' X) g& Z: J& M8 N# z
. s9 x- B! x- [# Q3 [$ z- ?9 s4 c" r( y. c; w$ w4 m! ?5 L
02. 寄存器描述
7 f. {6 L5 k: ~) i5 ?探索者 STM32F407 开发板的原理图上 PC11 的原理图如图 所示:. e9 L9 Z; w7 J
5 X( s/ Z; }2 p: S5 R; k
4 |- D- `" p K/ b' l$ Y" l8 d5 @9 v* E. @
PC11 可以作为 SPI3_MISO/U3_RX/U4_RX/SDIO_D3/DCMI_D4/I2S3ext_SD等复用功能输出,这么多复用功能,如果这些外设都开启了,那么对 STM32F1 来说,那就可能乱套了,外设之间可互相干扰,但是 STM32F4,由于有复用功能选择功能,可以让 PC11 仅连接到某个特定的外设,因此不存在互相干扰的情况。; p5 b, A6 {5 ^% l" [
7 B r" T% q$ z5 _; \$ JGPIO 复用功能低位寄存器 (GPIOx_AFRL) (x = A…I)
# Z5 ~+ W6 y+ H0 W0 v& mGPIO alternate function low register
1 A- E$ u" i/ }; n; U( h: Y偏移地址:0x200 u" n; U/ ]$ S$ }1 j" ?: h w
复位值:0x0000 00005 z' w3 @) S& e* M/ a* S
. J5 l2 c; j& P g& n
/ d! g4 I1 a* X* v' Z. e4 \
" g' q% s# N- T! S4 I0 v0 @
GPIO 复用功能高位寄存器 (GPIOx_AFRH) (x = A…I)4 d, \1 k- b7 R5 w
GPIO alternate function high register
2 q* o2 E/ E2 B0 _偏移地址:0x24' g- ?( p; e6 p# K
复位值:0x0000 0000( X- y" b. v$ y) R" i+ J
5 G* ?2 v# i. @ ~6 o0 c
' j8 [* x; H1 I v; P9 b
: e; O8 D. x# d8 L/ ~+ U9 M
在微控制器完成复位后,所有 IO 口都会连接到系统复用功能 0(AF0)。这里大家需要注意,对于系统复用功能 AF0,我们将 IO 口连接到 AF0 之后,还要根据所用功能进行配置:9 a- Q, J. \' {2 ]+ k( D1 Q
4 v. F3 M, W" I# Y' n/ X1.JTAG/SWD:在器件复位之后,会将这些功能引脚指定为专用引脚。也就是说,这些引脚在复位后默认就是 JTAG/SWD 功能。如果我们要作为 GPIO 来使用,就需要对对应的 IO口复用器进行配置。, @1 L& W1 c, H% ~1 e
: o- b+ y9 k5 I. {6 U7 Z- P/ \
2.RTC_REFIN:此引脚在系统复位之后要使用的话要配置为浮空输入模式。
; S' {' G. L* h4 Q* |% y5 T3 o, [
$ v) f3 K0 m5 V/ i, ~! O3.MCO1 和 MCO2:这些引脚在系统复位之后要使用的话要配置为复用功能模式。
. c* L! U4 c% ]! d. A) M$ b! R; w* _" O1 Q& \3 C
03. 类型8 P, o* Z6 _! U# {
复用功能相关宏2 y; [1 ?3 V q+ g6 c1 O
1 ?9 d1 \! L) M8 b6 D! u- /**
: `1 W+ K( R. v8 J - * @brief AF 0 selection
2 y6 `2 n* q) ]0 Y! q - */
4 k7 X& g, j: h - #define GPIO_AF_RTC_50Hz ((uint8_t)0x00) /* RTC_50Hz Alternate Function mapping */
! |" C7 C% M+ {, t - #define GPIO_AF_MCO ((uint8_t)0x00) /* MCO (MCO1 and MCO2) Alternate Function mapping */
2 v/ f) A. s& E" i( o _1 C# V - #define GPIO_AF_TAMPER ((uint8_t)0x00) /* TAMPER (TAMPER_1 and TAMPER_2) Alternate Function mapping */* L* W" V+ Z' g! R) N
- #define GPIO_AF_SWJ ((uint8_t)0x00) /* SWJ (SWD and JTAG) Alternate Function mapping */7 t% t/ k* o2 ?! \
- #define GPIO_AF_TRACE ((uint8_t)0x00) /* TRACE Alternate Function mapping */
- A" R2 ~1 ?) u* b- O0 ^4 L1 C! O8 ` - #if defined(STM32F446xx)$ G2 r y1 ^! l6 V" ?; ]: t3 l
- #define GPIO_AF0_TIM2 ((uint8_t)0x00) /* TIM2 Alternate Function mapping */
/ }' k, _* H! ]8 b - #endif /* STM32F446xx */
2 V$ j' n# f- R; _' [+ k
* ]4 V7 g* f" \$ {! ?- /** & X5 B& X" `- D& @- Q0 c! h3 S
- * @brief AF 1 selection
: L8 q) q" Q u6 J - */
9 S& y) k4 a, |" v' O1 ] - #define GPIO_AF_TIM1 ((uint8_t)0x01) /* TIM1 Alternate Function mapping */
- Z% x4 }, `$ |" q8 J0 q - #define GPIO_AF_TIM2 ((uint8_t)0x01) /* TIM2 Alternate Function mapping */* p0 v% g: q. f; @( W8 r4 m' a0 Q( D
- #if defined(STM32F410xx) || defined(STM32F413_423xx)) M9 X% m' { o) z7 W
- #define GPIO_AF_LPTIM ((uint8_t)0x01) /* LPTIM Alternate Function mapping */9 B M" |" M' ~/ l- j- m
- #endif /* STM32F410xx || STM32F413_423xx */
1 O1 s) f: ~& T0 c( l' A - /** $ C! | |4 r& s. V; F$ V! D
- * @brief AF 2 selection
) ?: G6 g" p! R9 T - */ ! U( @2 J1 D" x0 D
- #define GPIO_AF_TIM3 ((uint8_t)0x02) /* TIM3 Alternate Function mapping */
9 K1 w5 Z6 i$ W% j1 u, p1 u - #define GPIO_AF_TIM4 ((uint8_t)0x02) /* TIM4 Alternate Function mapping */# f O0 y, O3 k8 ~) D" E) r4 N, b
- #define GPIO_AF_TIM5 ((uint8_t)0x02) /* TIM5 Alternate Function mapping */3 g: t) E) |7 p) `7 u1 e+ C
- ! E7 M( O; @5 y% p/ {7 ~
- /**
- ?, v' w1 @' | - * @brief AF 3 selection
. n1 Z2 l* e3 [$ r; S% { - */
. F0 S1 i6 S& e$ _# T3 N- v# D - #define GPIO_AF_TIM8 ((uint8_t)0x03) /* TIM8 Alternate Function mapping */* M& U: g: S% j
- #define GPIO_AF_TIM9 ((uint8_t)0x03) /* TIM9 Alternate Function mapping */
! L& `- Y' w# y, z. u: u - #define GPIO_AF_TIM10 ((uint8_t)0x03) /* TIM10 Alternate Function mapping */+ _1 W L) d2 ?# O; q
- #define GPIO_AF_TIM11 ((uint8_t)0x03) /* TIM11 Alternate Function mapping */- F4 B7 E) B! x
- #if defined(STM32F446xx)
+ p" Z! G9 w! E! [1 J - #define GPIO_AF3_CEC ((uint8_t)0x03) /* CEC Alternate Function mapping */
1 l+ ^/ h) b; z( _ - #endif /* STM32F446xx */
& V Z6 [( q7 N4 l- ~0 K* I' { - #if defined(STM32F413_423xx)
5 f% B0 S, l* k" w - #define GPIO_AF3_DFSDM2 ((uint8_t)0x03) /* DFSDM2 Alternate Function mapping */3 F: s, j0 r. u$ I+ l
- #endif /* STM32F413_423xx */
; a* N4 @$ y9 s - /**
. ]2 U& ]% v- T1 z - * @brief AF 4 selection 7 l) a0 J3 v6 T8 A( N/ H; S8 y8 o
- */
2 i* P8 A: T' C - #define GPIO_AF_I2C1 ((uint8_t)0x04) /* I2C1 Alternate Function mapping */
; k' P/ g2 ^* B% S0 V; ` - #define GPIO_AF_I2C2 ((uint8_t)0x04) /* I2C2 Alternate Function mapping */! _) C' N4 a2 H5 v7 U5 U
- #define GPIO_AF_I2C3 ((uint8_t)0x04) /* I2C3 Alternate Function mapping */1 D$ q2 C; W- R
- #if defined(STM32F446xx)
* H3 q% f3 D/ t) o; G. V4 T - #define GPIO_AF4_CEC ((uint8_t)0x04) /* CEC Alternate Function mapping */- e$ }( K# c* n. u; f; o
- #endif /* STM32F446xx */
' v" Z5 o) n+ y - #if defined(STM32F410xx) || defined(STM32F412xG) || defined(STM32F413_423xx) || defined(STM32F446xx)
$ S0 j6 V. y' i# s5 C0 B - #define GPIO_AF_FMPI2C ((uint8_t)0x04) /* FMPI2C Alternate Function mapping */
, k. w% G! G; r+ w. j" C O% W, ~ - #endif /* STM32F410xx || STM32F446xx */
( Y# ?/ I* I1 _+ r R( t
. O2 _& {- Y6 m( Q1 y- /** ! q( f, O+ t \- c, Q: F* t, E
- * @brief AF 5 selection 4 x0 d9 {) W- J- r2 h
- */ 1 C/ d5 W" F: A2 g: R6 A6 x
- #define GPIO_AF_SPI1 ((uint8_t)0x05) /* SPI1/I2S1 Alternate Function mapping */
% V: }4 u6 z( F& O - #define GPIO_AF_SPI2 ((uint8_t)0x05) /* SPI2/I2S2 Alternate Function mapping */+ I+ Q6 f, g0 Q- r
- #define GPIO_AF5_SPI3 ((uint8_t)0x05) /* SPI3/I2S3 Alternate Function mapping (Only for STM32F411xE and STM32F413_423xx Devices) */
) {% Y( T+ C) q2 Z2 C: I - #define GPIO_AF_SPI4 ((uint8_t)0x05) /* SPI4/I2S4 Alternate Function mapping */% L5 \4 w& M3 T
- #define GPIO_AF_SPI5 ((uint8_t)0x05) /* SPI5 Alternate Function mapping */
3 V/ I* f$ K1 m. b2 V- @$ r - #define GPIO_AF_SPI6 ((uint8_t)0x05) /* SPI6 Alternate Function mapping */
5 o/ h. _/ p% } - , ?& o' ^; ^: W5 u# k
- /**
: P- k% E/ D% j" Y) G. `1 O( \ - * @brief AF 6 selection
2 H1 b) d! f9 B' g: N% i; T% O+ Q( q - */
/ Q% F' |- Z6 b$ { - #define GPIO_AF_SPI3 ((uint8_t)0x06) /* SPI3/I2S3 Alternate Function mapping */3 |, G+ T6 H, v
- #define GPIO_AF6_SPI1 ((uint8_t)0x06) /* SPI1 Alternate Function mapping (Only for STM32F410xx Devices) */
2 P$ t/ I. t4 y, M - #define GPIO_AF6_SPI2 ((uint8_t)0x06) /* SPI2 Alternate Function mapping (Only for STM32F410xx/STM32F411xE Devices) */
; u1 I: C1 Q; y7 V X% L - #define GPIO_AF6_SPI4 ((uint8_t)0x06) /* SPI4 Alternate Function mapping (Only for STM32F411xE Devices) */9 S8 `8 u- \- ^& @. G/ j; [ C
- #define GPIO_AF6_SPI5 ((uint8_t)0x06) /* SPI5 Alternate Function mapping (Only for STM32F410xx/STM32F411xE Devices) */% o2 C! O2 h4 K
- #define GPIO_AF_SAI1 ((uint8_t)0x06) /* SAI1 Alternate Function mapping */" H$ H0 ~- \4 G1 @4 G
- #define GPIO_AF_I2S2ext ((uint8_t)0x06) /* I2S2ext_SD Alternate Function mapping (only for STM32F412xG and STM32F413_423xx Devices) */ |5 F7 T1 C: v
- #if defined(STM32F412xG) || defined(STM32F413_423xx)
* l0 \* E S7 c- B: O - #define GPIO_AF6_DFSDM1 ((uint8_t)0x06) /* DFSDM1 Alternate Function mapping */
$ [3 n; z. K) H4 K* d* l( ~ - #endif /* STM32F412xG || STM32F413_423xx */
+ j3 L8 l( r6 s6 c' U5 C" } - #if defined(STM32F413_423xx)
4 Z2 M. a/ r/ w: Y" W - #define GPIO_AF6_DFSDM2 ((uint8_t)0x06) /* DFSDM2 Alternate Function mapping */
' O& X1 A% n' a - #endif /* STM32F413_423xx */
7 F. L* m' ~2 y6 K* e% Q9 k0 D - ! _( H9 ?+ F! C# e# w
- /** / T0 g" ] L7 a* _6 q
- * @brief AF 7 selection
2 `% e2 M" X3 _# n* q' A - */
0 V* \. F# f- @3 E - #define GPIO_AF_USART1 ((uint8_t)0x07) /* USART1 Alternate Function mapping */
: f: m- U0 p/ {* t - #define GPIO_AF_USART2 ((uint8_t)0x07) /* USART2 Alternate Function mapping */- ^8 i. C- q4 q4 z8 [1 G
- #define GPIO_AF_USART3 ((uint8_t)0x07) /* USART3 Alternate Function mapping *// x) Z7 k+ ~* j8 v3 p4 M
- #define GPIO_AF7_SPI3 ((uint8_t)0x07) /* SPI3/I2S3ext Alternate Function mapping */9 C- u* A- x: m/ o
- #if defined(STM32F413_423xx)0 P" _ q( l2 @# O& |( N7 J3 j9 k
- #define GPIO_AF7_DFSDM2 ((uint8_t)0x07) /* DFSDM2 Alternate Function mapping */& B( R( `% D! T8 e5 F% i/ a
- #define GPIO_AF7_SAI1 ((uint8_t)0x07) /* SAI1 Alternate Function mapping */: v# W3 d9 r$ q8 p$ m; h
- #endif /* STM32F413_423xx */2 X. z! i6 e7 f6 z
- % j+ E; Q% t9 N# c4 O) g
- /** ! h% l: q! m' w) W2 }. O
- * @brief AF 7 selection Legacy ' s) v! A. h9 H' y
- */
) \! D6 Y' T5 N' ?, j& t - #define GPIO_AF_I2S3ext GPIO_AF7_SPI3: s- A4 f, t. b6 z, Q, O9 y
- & u- B7 R0 k) }% F
- /** " Y2 e2 p8 v+ K5 M; M4 A
- * @brief AF 8 selection
; s/ d6 j" n( N4 ]: F1 g/ A - */
7 q( {8 w7 S5 z. [ - #define GPIO_AF_UART4 ((uint8_t)0x08) /* UART4 Alternate Function mapping */
% Z1 E* F, H0 ]9 l" L$ t, ?- Q- s - #define GPIO_AF_UART5 ((uint8_t)0x08) /* UART5 Alternate Function mapping */
5 H+ E( S* h+ p; I - #define GPIO_AF_USART6 ((uint8_t)0x08) /* USART6 Alternate Function mapping */
$ h/ X% c2 y* A8 k5 G- G - #define GPIO_AF_UART7 ((uint8_t)0x08) /* UART7 Alternate Function mapping */
9 ^0 Q$ x3 T: o9 J8 B' P - #define GPIO_AF_UART8 ((uint8_t)0x08) /* UART8 Alternate Function mapping */( w/ r2 n* Z, ?+ Q! t
- #if defined(STM32F412xG) || defined(STM32F413_423xx)
: [$ _8 Z- `' K' \ - #define GPIO_AF8_USART3 ((uint8_t)0x08) /* USART3 Alternate Function mapping */1 `) J$ [# o( }9 X( t3 l; x
- #define GPIO_AF8_DFSDM1 ((uint8_t)0x08) /* DFSDM Alternate Function mapping */
D8 t5 f* B; B0 H7 J - #define GPIO_AF8_CAN1 ((uint8_t)0x08) /* CAN1 Alternate Function mapping */
6 i9 z7 @; Z1 t+ o7 V) t" \ - #endif /* STM32F412xG || STM32F413_423xx */$ O. L5 M2 Y o0 d8 w$ ^
- #if defined(STM32F446xx) z. w8 J- T- o
- #define GPIO_AF8_SAI2 ((uint8_t)0x08) /* SAI2 Alternate Function mapping */
& s# k$ j4 n H% Q- K) Q8 V - #define GPIO_AF_SPDIF ((uint8_t)0x08) /* SPDIF Alternate Function mapping */- u) z& G: Y0 Q
- #endif /* STM32F446xx */
5 P8 V; o; X: y3 Y7 J! e
# n. H) i: Q b9 M+ m% q- /** . [% L$ ]& @9 ?
- * @brief AF 9 selection
6 O- p- g) M6 ]% f. x - */ 8 {! C8 B& h# O
- #define GPIO_AF_CAN1 ((uint8_t)0x09) /* CAN1 Alternate Function mapping */
% f) O" s8 S( ^: d' t4 L9 D" F - #define GPIO_AF_CAN2 ((uint8_t)0x09) /* CAN2 Alternate Function mapping */
& y" R; p9 S0 y. s# m - #define GPIO_AF_TIM12 ((uint8_t)0x09) /* TIM12 Alternate Function mapping */
d" c' d0 f7 p - #define GPIO_AF_TIM13 ((uint8_t)0x09) /* TIM13 Alternate Function mapping */0 x( n* C6 W- Q, E
- #define GPIO_AF_TIM14 ((uint8_t)0x09) /* TIM14 Alternate Function mapping */1 [& O0 D7 \" x% N) P ?+ ]
- #define GPIO_AF9_I2C2 ((uint8_t)0x09) /* I2C2 Alternate Function mapping (Only for STM32F401xx/STM32F410xx/STM32F411xE/STM32F412xG/STM32F413_423xx Devices) */
1 k$ R" k6 e, U6 l: A - #define GPIO_AF9_I2C3 ((uint8_t)0x09) /* I2C3 Alternate Function mapping (Only for STM32F401xx/STM32F411xE/STM32F412xG and STM32F413_423xx Devices) */& k) L5 t, ^9 x0 H/ ]$ i
- #if defined(STM32F446xx)
" q7 e, o2 R2 l0 M. |! d; V, K - #define GPIO_AF9_SAI2 ((uint8_t)0x09) /* SAI2 Alternate Function mapping */. w% [1 K% S G+ W! r3 }' |
- #endif /* STM32F446xx */
) s h& c' x% o c7 L2 g$ t - #define GPIO_AF9_LTDC ((uint8_t)0x09) /* LTDC Alternate Function mapping */0 G% I% G" I/ s/ i
- #if defined(STM32F412xG) || defined(STM32F413_423xx) || defined(STM32F446xx) || defined(STM32F469_479xx)7 C2 T( T2 g& \9 z
- #define GPIO_AF9_QUADSPI ((uint8_t)0x09) /* QuadSPI Alternate Function mapping */: @6 T* F& N F* V B/ {
- #endif /* STM32F412xG || STM32F413_423xx || STM32F446xx || STM32F469_479xx */* Z I$ U% F8 F' f, h
- #if defined(STM32F410xx) || defined(STM32F412xG) || defined(STM32F413_423xx)! B$ n+ e) {, ~3 L3 b6 T7 o" i
- #define GPIO_AF9_FMPI2C ((uint8_t)0x09) /* FMPI2C Alternate Function mapping (Only for STM32F410xx Devices) */) M. w8 \( m' v7 d8 D
- #endif /* STM32F410xx || STM32F412xG || STM32F413_423xx */
! p4 n* `* M% A - . a$ p! T# j2 v% ^* w/ V. p) p) c
- /** % h$ O3 B# i- @- h1 H- @- f
- * @brief AF 10 selection 9 M1 v. n9 t/ g. x% v* Y/ e! O
- */
# {' x v6 |# m( s' M - #define GPIO_AF_OTG_FS ((uint8_t)0xA) /* OTG_FS Alternate Function mapping */; @8 `9 g: y+ Y! ]: R: w
- #define GPIO_AF_OTG_HS ((uint8_t)0xA) /* OTG_HS Alternate Function mapping */
' N! l! Y; x" v: G- g0 G - #if defined(STM32F446xx)
4 z( k& _# O* q+ k, ~( L/ x - #define GPIO_AF10_SAI2 ((uint8_t)0x0A) /* SAI2 Alternate Function mapping */& Q- @9 {+ T; S# m" Y7 J# Z, r0 O
- #endif /* STM32F446xx */
- m5 G' v2 ?# ]( r. K - #if defined(STM32F412xG) || defined(STM32F413_423xx) || defined(STM32F446xx) || defined(STM32F469_479xx)
! o5 o" S7 I" D - #define GPIO_AF10_QUADSPI ((uint8_t)0x0A) /* QuadSPI Alternate Function mapping */0 x: r$ o2 G2 t; P5 l2 L5 J
- #endif /* STM32F412xG || STM32F413_423xx || STM32F446xx || STM32F469_479xx */
- c; ~4 r, f# J+ a! u/ N6 e9 O - #if defined(STM32F412xG) || defined(STM32F413_423xx)
9 a: ^# B2 _* r& k5 [ - #define GPIO_AF10_FMC ((uint8_t)0xA) /* FMC Alternate Function mapping */( D4 X1 Y; M+ Q& H
- #define GPIO_AF10_DFSDM1 ((uint8_t)0xA) /* DFSDM Alternate Function mapping */, }- b9 \# _9 V0 o/ V. f
- #endif /* STM32F412xG || STM32F413_423xx */+ ^/ C6 B& W3 n/ O( i
- #if defined(STM32F413_423xx)+ X `# N% g- ~
- #define GPIO_AF10_DFSDM2 ((uint8_t)0x0A) /* DFSDM2 Alternate Function mapping */; Y" h+ h+ l; q4 u
- #define GPIO_AF10_SAI1 ((uint8_t)0x0A) /* SAI1 Alternate Function mapping */
8 x1 N0 Q" U$ M1 ^ - #endif /* STM32F413_423xx */
$ n M% ]2 M. d. e& Z" u' h - /**
& F) a8 E" K; ?6 S% `) o - * @brief AF 11 selection
( Z) T5 T9 @7 A; |" H" a - */
! j) |6 ], P3 Q# D/ ~0 U0 _! k - #define GPIO_AF_ETH ((uint8_t)0x0B) /* ETHERNET Alternate Function mapping */
) G1 f2 R/ m9 L" ? - #if defined(STM32F413_423xx)9 |" @( Y! z5 U) E
- #define GPIO_AF11_UART4 ((uint8_t)0x0B) /* UART4 Alternate Function mapping */+ a, A+ U& Y3 {9 v1 L( \
- #define GPIO_AF11_UART5 ((uint8_t)0x0B) /* UART5 Alternate Function mapping */( F! g5 d% I( |1 q# A: j( D: i
- #define GPIO_AF11_UART9 ((uint8_t)0x0B) /* UART9 Alternate Function mapping */
6 x' N, j( x7 Q6 D" _0 L - #define GPIO_AF11_UART10 ((uint8_t)0x0B) /* UART10 Alternate Function mapping */
% L }/ H) j! ]. a- C1 a - #define GPIO_AF11_CAN3 ((uint8_t)0x0B) /* CAN3 Alternate Function mapping */+ E. {6 a& Z0 K8 _1 M7 H
- #endif /* STM32F413_423xx */
9 C& \1 p- E9 g+ _ - 3 n2 v& g$ f9 Z* w
- /** / ^( ^1 {. B' J+ A% U! b' l
- * @brief AF 12 selection
1 O, ?# j/ U9 O" R( z - */
! A* L, j, m( C5 ?+ a; q - #if defined(STM32F40_41xxx) || defined(STM32F412xG) || defined(STM32F413_423xx)* ?2 B Y- x9 l) k
- #define GPIO_AF_FSMC ((uint8_t)0xC) /* FSMC Alternate Function mapping */
6 s% a% E+ [4 |6 {9 Z' Y! j - #endif /* STM32F40_41xxx || STM32F412xG || STM32F413_423xx */% j/ C( ]9 }4 I" ]+ c& r- C
' E9 h( C! h: D- S1 c/ C5 i- #if defined(STM32F427_437xx) || defined(STM32F429_439xx) || defined(STM32F446xx) || defined(STM32F469_479xx) F" M8 k0 H1 C
- #define GPIO_AF_FMC ((uint8_t)0xC) /* FMC Alternate Function mapping */$ R8 W8 t% n S. P( V
- #endif /* STM32F427_437xx || STM32F429_439xx || STM32F446xx || STM32F469_479xx */
1 v" B+ u# M9 J - - W; J: G- |: w
- #define GPIO_AF_OTG_HS_FS ((uint8_t)0xC) /* OTG HS configured in FS, Alternate Function mapping */: y/ R; [/ E+ V' N2 P& l0 H
- #define GPIO_AF_SDIO ((uint8_t)0xC) /* SDIO Alternate Function mapping */9 i; d! n8 G$ U( I& u# Y# t4 |
S( |3 c' H, T* y3 m! X3 m- /** 6 X" R* V) [: B! g
- * @brief AF 13 selection $ S' s1 D& x+ v! i8 d- C8 J, o
- */ , H/ E; X4 u# H* |( b
- #define GPIO_AF_DCMI ((uint8_t)0x0D) /* DCMI Alternate Function mapping */3 q1 g8 E& b& S; d3 C' P! h
- #if defined(STM32F469_479xx)
' q) Y7 b7 O6 i9 o& D - #define GPIO_AF_DSI ((uint8_t)0x0D) /* DSI Alternate Function mapping */ U1 V% r- S2 v% Y
- #endif /* STM32F469_479xx */
c2 a: \/ j1 o6 |& t; K; b6 R - /**
: A0 b3 v) R# P- C0 [1 l+ B; h - * @brief AF 14 selection : H" @1 d7 ]7 a* k. }
- */
. g! e: D7 o' l - #define GPIO_AF_LTDC ((uint8_t)0x0E) /* LCD-TFT Alternate Function mapping */: ?% ?5 f* m2 W9 [' ~
- #if defined(STM32F413_423xx)" k% Q8 b1 o/ I6 J/ f3 P
- #define GPIO_AF14_RNG ((uint8_t)0x0E) /* RNG Alternate Function mapping */
1 @' C# J+ l5 ?+ s+ T/ N - #endif /* STM32F413_423xx *// H) W0 \+ K) u3 K
- 4 _' ?$ E* d p& x2 M: E
- /**
3 ?+ }6 Y4 x) X$ z - * @brief AF 15 selection v4 P% {! E! B, J2 ^0 t
- */
; c* X+ G8 c& `5 U* Q - #define GPIO_AF_EVENTOUT ((uint8_t)0x0F) /* EVENTOUT Alternate Function mapping */; }% j7 t7 R4 _3 d
- # o/ A) ^$ h. \5 F* A
- #define IS_GPIO_AF(AF) (((AF) == GPIO_AF_RTC_50Hz) || ((AF) == GPIO_AF_TIM14) || \
* j. s) D5 `7 E' r - ((AF) == GPIO_AF_MCO) || ((AF) == GPIO_AF_TAMPER) || \
* }' x. ?3 x* J3 H% P' g$ a1 U - ((AF) == GPIO_AF_SWJ) || ((AF) == GPIO_AF_TRACE) || \
# X. k; l- i8 E/ r# m - ((AF) == GPIO_AF_TIM1) || ((AF) == GPIO_AF_TIM2) || \
( D: M" ]8 X3 p5 V7 s1 l/ F - ((AF) == GPIO_AF_TIM3) || ((AF) == GPIO_AF_TIM4) || \
- r. j" O: Q; d( P/ `8 b$ \8 b* O - ((AF) == GPIO_AF_TIM5) || ((AF) == GPIO_AF_TIM8) || \
" k/ I# w$ w) N; m s, R) B - ((AF) == GPIO_AF_I2C1) || ((AF) == GPIO_AF_I2C2) || \
( I* S+ x/ W* D6 l G" _. d - ((AF) == GPIO_AF_I2C3) || ((AF) == GPIO_AF_SPI1) || \
0 [# G0 O: d* s8 j6 x2 L2 _& ? - ((AF) == GPIO_AF_SPI2) || ((AF) == GPIO_AF_TIM13) || \
' i6 v' x" n# n9 M - ((AF) == GPIO_AF_SPI3) || ((AF) == GPIO_AF_TIM14) || \3 G: v. m7 ? p# k9 f; }
- ((AF) == GPIO_AF_USART1) || ((AF) == GPIO_AF_USART2) || \
- o* K2 N! b( p# E4 U3 I - ((AF) == GPIO_AF_USART3) || ((AF) == GPIO_AF_UART4) || \
/ p# s4 s9 x; y* _& t; Y9 G! }: i - ((AF) == GPIO_AF_UART5) || ((AF) == GPIO_AF_USART6) || \8 W# _1 W- S0 P
- ((AF) == GPIO_AF_CAN1) || ((AF) == GPIO_AF_CAN2) || \% A8 h6 f. {, n6 b4 H2 [
- ((AF) == GPIO_AF_OTG_FS) || ((AF) == GPIO_AF_OTG_HS) || \
8 z3 m W3 A9 T9 C$ G - ((AF) == GPIO_AF_ETH) || ((AF) == GPIO_AF_OTG_HS_FS) || \# q/ z0 }* v7 Y2 W8 x
- ((AF) == GPIO_AF_SDIO) || ((AF) == GPIO_AF_DCMI) || \% W# {, E7 n& [1 A; w2 S0 s/ `- ?
- ((AF) == GPIO_AF_EVENTOUT) || ((AF) == GPIO_AF_FSMC))
. i7 G) Q" \" B0 B4 j5 B: u0 }; _0 ] - #endif /* STM32F40_41xxx */
复制代码 ( g4 _6 m0 Q, W/ H# `: v3 R
04. 函数* P6 ?" J7 G, V) U
GPIO复用功能函数8 R) a& ~; C1 u" h) l, `
9 [. H+ V) c$ y- W- M' v+ E3 p# i- /* GPIO Alternate functions configuration function ****************************/! {+ k( J1 _9 p
- void GPIO_PinAFConfig(GPIO_TypeDef* GPIOx, uint16_t GPIO_PinSource, uint8_t GPIO_AF);
复制代码 " E' @6 L0 z+ { h1 S; C
05. 参考示例( [. S4 N1 s; @. u% z
串口配置) r0 V% {$ P" t; ?7 Z7 l
3 o2 H0 M' H: j4 ~, z, r+ ^
- /*GPIOA9 与 GPIOA10 初始化*// S& I6 u' _) N8 R/ ^5 b
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10;
& j( Z% Z9 w) o$ ^9 N4 l( k - GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;// 复用功能 W* Y, n6 A7 O) I& z% n3 N
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//速度 50MHz V* {+ K: ] e. m
- GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推挽复用输出
j8 K2 x7 Q, L) H7 U - GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; //上拉' Z( I5 b' d( a
- GPIO_Init(GPIOA,&GPIO_InitStructure); //初始化 PA9,PA107 ?/ p) g$ U/ \8 S1 ?" |! {
- @) i# e6 V+ C; j1 w- /*PA9 连接 AF7,复用为 USART1_TX */
+ I9 ^) `9 M6 T5 T8 R - GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_USART1);' d7 u0 a1 b3 }8 m
- /* PA10 连接 AF7,复用为 USART1_RX*/' K* C8 E' H9 i, I3 \5 C
- GPIO_PinAFConfig(GPIOA,GPIO_PinSource10,GPIO_AF_USART1);
复制代码
0 e5 P) @, c8 N2 A0 r2 ]6 k; p) D7 f( F. i) j$ ]
5 F' J& r( c+ C F2 { |