01. GPIO复用概述9 g: g" ]3 [6 U9 B6 s
STM32F4 有很多的内置外设,这些外设的外部引脚都是与 GPIO 复用的。也就是说,一个 GPIO如果可以复用为内置外设的功能引脚,那么当这个 GPIO 作为内置外设使用的时候,就叫做复用。7 @. V! a/ N" [) t% A( {# h
8 p) u0 d1 P( E% F9 S
STM32F4 系列微控制器 IO 引脚通过一个复用器连接到内置外设或模块。该复用器一次只允许一个外设的复用功能(AF)连接到对应的 IO 口。这样可以确保共用同一个 IO 引脚的外设之间不会发生冲突。$ I6 ~: A( J3 i5 |$ A: F
# o6 t, Y$ i! D4 G# n# Y每个 IO 引脚都有一个复用器,该复用器采用 16 路复用功能输入(AF0 到 AF15),可通过GPIOx_AFRL(针对引脚 0-7)和 GPIOx_AFRH(针对引脚 8-15)寄存器对这些输入进行配置,每四位控制一路复用1 Q+ f3 W/ i1 h4 C+ a. ^3 m1 O! I" Q
4 x. n' N" y0 @5 m6 v
1)完成复位后,所有 IO 都会连接到系统的复用功能 0(AF0)。 `( N" P# u8 I4 s6 ~6 H5 ]0 c8 h+ V
2)外设的复用功能映射到 AF1 到 AF13。6 k: i. Q9 W" g6 @
3)Cortex-M4 EVENTOUT 映射到 AF15。. v- m1 Q( S9 B* o
# i5 D, m. Y/ P' N) f8 f1 R6 H
# Q" Q( [; @- i* |# K7 L
0 U2 U) Z' U+ g# }) I) C% f
02. 寄存器描述: K* y9 `; t7 l' Y# u
探索者 STM32F407 开发板的原理图上 PC11 的原理图如图 所示:# S7 x8 T1 c& x- Q7 B/ ~
9 z# V- L0 |4 M$ V. K8 G2 X% H
( X- o. A5 ~, D( f/ ]
8 |! d5 S9 f; [! j! b
PC11 可以作为 SPI3_MISO/U3_RX/U4_RX/SDIO_D3/DCMI_D4/I2S3ext_SD等复用功能输出,这么多复用功能,如果这些外设都开启了,那么对 STM32F1 来说,那就可能乱套了,外设之间可互相干扰,但是 STM32F4,由于有复用功能选择功能,可以让 PC11 仅连接到某个特定的外设,因此不存在互相干扰的情况。/ \0 F3 J" K3 @3 l, @. d
$ t/ p2 l' k G5 U: F. s/ @& YGPIO 复用功能低位寄存器 (GPIOx_AFRL) (x = A…I)
2 _8 }. ?8 U9 ?4 s& V4 ?GPIO alternate function low register# k' ]: w: i0 \7 X _" _( Z
偏移地址:0x20
, M; u z* _ |4 G1 p复位值:0x0000 0000
$ K9 k4 S2 Z" i0 S2 x) c3 `4 k5 P5 o1 U( m. x, f# O% D
4 ~' @4 x6 d% E+ M0 f! \0 B6 E, C/ f& r6 E
GPIO 复用功能高位寄存器 (GPIOx_AFRH) (x = A…I)
' {5 o. j+ `. \% V1 }/ `GPIO alternate function high register
4 K0 Q+ x2 G8 w$ P4 K/ ~ e偏移地址:0x24! s1 c7 \7 I: r2 b5 j
复位值:0x0000 0000; { a* M* {% J6 \ J0 T
: V3 S; B: F7 ], }- s/ z& P1 ~
! p$ k- M/ o. y+ @3 I% Z/ }& V
3 y/ [5 N7 Z( f在微控制器完成复位后,所有 IO 口都会连接到系统复用功能 0(AF0)。这里大家需要注意,对于系统复用功能 AF0,我们将 IO 口连接到 AF0 之后,还要根据所用功能进行配置:; j3 X6 Q1 E& q D4 ]/ H
$ y3 Y" Y* Z8 m; Y8 l+ g' k) y0 v: `
1.JTAG/SWD:在器件复位之后,会将这些功能引脚指定为专用引脚。也就是说,这些引脚在复位后默认就是 JTAG/SWD 功能。如果我们要作为 GPIO 来使用,就需要对对应的 IO口复用器进行配置。* y! s* Q3 L8 g. T5 C
0 L# h q0 N9 o% p2 Y0 d: [2.RTC_REFIN:此引脚在系统复位之后要使用的话要配置为浮空输入模式。
5 p2 `- R) e1 p/ F1 M
. _, w- q* ^0 N6 S3.MCO1 和 MCO2:这些引脚在系统复位之后要使用的话要配置为复用功能模式。
# E+ a, N) p9 ~ m9 i1 }9 U* W6 R% |, Z4 r: {' r/ K- c
03. 类型
% D& {$ {' A9 e; r0 V" p复用功能相关宏& w% x8 m0 l' M- I
: \5 R) h8 D$ x! d/ P
- /** ) P' |0 F5 F+ x1 r0 y' j* t
- * @brief AF 0 selection * W! r Y6 l3 Q1 h3 `
- */ 4 ]& ?. [8 _ U+ y2 x) G
- #define GPIO_AF_RTC_50Hz ((uint8_t)0x00) /* RTC_50Hz Alternate Function mapping */
, ?' B( {4 j! L( j1 Y" G - #define GPIO_AF_MCO ((uint8_t)0x00) /* MCO (MCO1 and MCO2) Alternate Function mapping */. x8 e+ k9 `" p5 `
- #define GPIO_AF_TAMPER ((uint8_t)0x00) /* TAMPER (TAMPER_1 and TAMPER_2) Alternate Function mapping */% e) D( M$ ?$ D" _+ f1 f& {/ Q
- #define GPIO_AF_SWJ ((uint8_t)0x00) /* SWJ (SWD and JTAG) Alternate Function mapping */
/ d7 J5 }9 x G. V8 _; [ - #define GPIO_AF_TRACE ((uint8_t)0x00) /* TRACE Alternate Function mapping */ }' |- W0 l, N* u* k& \; r- B
- #if defined(STM32F446xx)
6 |6 e- [. A0 h; i4 h* g, [ - #define GPIO_AF0_TIM2 ((uint8_t)0x00) /* TIM2 Alternate Function mapping */4 A6 j" c9 S3 }0 C$ H& [
- #endif /* STM32F446xx */
. n `- Y) j/ [
+ j3 ?7 N9 Q' @7 _/ X- /**
% f' X# P* D2 N9 R; l - * @brief AF 1 selection
+ L* Q* E0 W7 h8 Z% o - */ : r( S+ a0 |; n2 |; Z. ? `, H! a% G( I
- #define GPIO_AF_TIM1 ((uint8_t)0x01) /* TIM1 Alternate Function mapping */
1 c6 n1 D$ H" x5 Z3 |/ C1 E2 o - #define GPIO_AF_TIM2 ((uint8_t)0x01) /* TIM2 Alternate Function mapping */5 S( U8 J5 P; I+ y, C
- #if defined(STM32F410xx) || defined(STM32F413_423xx)
/ X4 |- L8 g. V! @ - #define GPIO_AF_LPTIM ((uint8_t)0x01) /* LPTIM Alternate Function mapping */5 C j3 n- h c G$ d, e/ m
- #endif /* STM32F410xx || STM32F413_423xx */0 ^% M4 ?; J: M6 X6 Z4 i( F
- /** , a; W0 F( H; q* b) b/ L6 R
- * @brief AF 2 selection ) `9 ^# u. N8 P7 a7 |
- */ % N4 Q$ R) V6 X0 o4 s' c& ~
- #define GPIO_AF_TIM3 ((uint8_t)0x02) /* TIM3 Alternate Function mapping */6 ]; ?0 [' \% |: c# c& v( v
- #define GPIO_AF_TIM4 ((uint8_t)0x02) /* TIM4 Alternate Function mapping */) a2 `" p1 E# ?0 B6 w1 t. g! p/ \
- #define GPIO_AF_TIM5 ((uint8_t)0x02) /* TIM5 Alternate Function mapping */
$ \# u# t3 l' F4 P7 G( x' j
; t- {; P* W- L a2 I- /**
7 n% Y1 o( `" y" V7 B9 ^ - * @brief AF 3 selection
3 S! t- k. y1 y4 Q$ _ - */
L3 S% y& `5 H. E# a# D$ s - #define GPIO_AF_TIM8 ((uint8_t)0x03) /* TIM8 Alternate Function mapping */1 h7 h, g: G2 ^- S
- #define GPIO_AF_TIM9 ((uint8_t)0x03) /* TIM9 Alternate Function mapping */
7 e3 z- P1 t$ j/ S - #define GPIO_AF_TIM10 ((uint8_t)0x03) /* TIM10 Alternate Function mapping */
1 d( `" g8 v9 `- l$ v - #define GPIO_AF_TIM11 ((uint8_t)0x03) /* TIM11 Alternate Function mapping */
9 T c& C) ]: M/ n% k; ^# t - #if defined(STM32F446xx)
- x& w) D( o2 @* [+ \/ i/ M4 k" {4 k - #define GPIO_AF3_CEC ((uint8_t)0x03) /* CEC Alternate Function mapping */$ C% R: l* _2 V0 ~
- #endif /* STM32F446xx */
: \* F3 C' {; [* F% ]7 M, g - #if defined(STM32F413_423xx)
2 [+ G* v* C0 V- Q) s6 t% V - #define GPIO_AF3_DFSDM2 ((uint8_t)0x03) /* DFSDM2 Alternate Function mapping */
) G- K2 [! z, U, I' X - #endif /* STM32F413_423xx */
' Q% v" X, _4 d - /**
$ }' L5 ]5 a7 d, G6 `: F4 l9 [ - * @brief AF 4 selection
5 N5 k3 j1 H9 ^) r* ?- n - */ 7 o9 Q3 f4 x( G& f+ Q
- #define GPIO_AF_I2C1 ((uint8_t)0x04) /* I2C1 Alternate Function mapping */
( u3 L, u5 T" g - #define GPIO_AF_I2C2 ((uint8_t)0x04) /* I2C2 Alternate Function mapping */
. p$ j7 t$ `( ]3 j3 A - #define GPIO_AF_I2C3 ((uint8_t)0x04) /* I2C3 Alternate Function mapping */
2 d4 v2 M4 l3 K, `) ]8 b, w - #if defined(STM32F446xx)
/ Y3 i* D3 T9 Z8 N2 N4 Y* B - #define GPIO_AF4_CEC ((uint8_t)0x04) /* CEC Alternate Function mapping */
5 e2 `) O. W3 t& e - #endif /* STM32F446xx */( W0 X0 f1 A* s* g' j
- #if defined(STM32F410xx) || defined(STM32F412xG) || defined(STM32F413_423xx) || defined(STM32F446xx)
2 ^5 N) Y; _) Q' ?6 v - #define GPIO_AF_FMPI2C ((uint8_t)0x04) /* FMPI2C Alternate Function mapping */6 I1 }9 H: T8 w' Y d# }
- #endif /* STM32F410xx || STM32F446xx */
* z F1 j6 y9 l9 @1 g8 d - 9 A/ f: r. ^2 Y, j
- /**
$ q" O, n( e# D# n - * @brief AF 5 selection
l/ T! d( V7 V! D5 l - */ , O; t+ f- T: a1 a% A- l/ i) p
- #define GPIO_AF_SPI1 ((uint8_t)0x05) /* SPI1/I2S1 Alternate Function mapping */
! @ K5 c9 d" W) w - #define GPIO_AF_SPI2 ((uint8_t)0x05) /* SPI2/I2S2 Alternate Function mapping */
9 b1 L! ?* g3 N, M5 o - #define GPIO_AF5_SPI3 ((uint8_t)0x05) /* SPI3/I2S3 Alternate Function mapping (Only for STM32F411xE and STM32F413_423xx Devices) */5 D1 A3 d7 M3 [
- #define GPIO_AF_SPI4 ((uint8_t)0x05) /* SPI4/I2S4 Alternate Function mapping */5 ^5 a9 j9 g: y. u5 |) K! t: p. v
- #define GPIO_AF_SPI5 ((uint8_t)0x05) /* SPI5 Alternate Function mapping */( r. c; w5 M# z( z( s" G/ h
- #define GPIO_AF_SPI6 ((uint8_t)0x05) /* SPI6 Alternate Function mapping */$ h0 N" K2 G9 W" j
! F, C0 ^. c. G" [0 ]- /**
& U# `" z ?& }3 W: }8 ?) |7 I - * @brief AF 6 selection
0 h; u- b1 A, x4 G# o3 ? - */ * U$ J& U' d8 i, ]3 W# `! K5 ^
- #define GPIO_AF_SPI3 ((uint8_t)0x06) /* SPI3/I2S3 Alternate Function mapping */0 T( R5 x V" E( P+ B9 Y# d. X
- #define GPIO_AF6_SPI1 ((uint8_t)0x06) /* SPI1 Alternate Function mapping (Only for STM32F410xx Devices) */2 O, |8 G) N4 b# p7 P
- #define GPIO_AF6_SPI2 ((uint8_t)0x06) /* SPI2 Alternate Function mapping (Only for STM32F410xx/STM32F411xE Devices) */5 f4 @& b% O% I7 a: |
- #define GPIO_AF6_SPI4 ((uint8_t)0x06) /* SPI4 Alternate Function mapping (Only for STM32F411xE Devices) */) a. @' x. y8 [2 u( o5 Z! V' s! x Y; R
- #define GPIO_AF6_SPI5 ((uint8_t)0x06) /* SPI5 Alternate Function mapping (Only for STM32F410xx/STM32F411xE Devices) */
$ K+ C8 O) I4 T" C - #define GPIO_AF_SAI1 ((uint8_t)0x06) /* SAI1 Alternate Function mapping */3 B Z# j, F2 o0 g
- #define GPIO_AF_I2S2ext ((uint8_t)0x06) /* I2S2ext_SD Alternate Function mapping (only for STM32F412xG and STM32F413_423xx Devices) */
4 @/ ~$ M9 ` ^" a* Z9 @0 ]( } - #if defined(STM32F412xG) || defined(STM32F413_423xx)" R# b) u8 K4 R
- #define GPIO_AF6_DFSDM1 ((uint8_t)0x06) /* DFSDM1 Alternate Function mapping */: L: S/ a8 o) d% s3 G# T; b3 e
- #endif /* STM32F412xG || STM32F413_423xx */
5 u' [% h# M5 [ G' t4 E3 N - #if defined(STM32F413_423xx)3 r+ j" t* }$ O
- #define GPIO_AF6_DFSDM2 ((uint8_t)0x06) /* DFSDM2 Alternate Function mapping */
5 i8 `! i6 w) o5 B% @; Z8 H - #endif /* STM32F413_423xx */0 Z% r. {+ D" F. B& ^
" T; A% t( I/ g, m/ c- /** 4 Z: T( B- j1 V/ v) C
- * @brief AF 7 selection # l9 D( V5 o, s5 b2 W/ ^1 e: J
- */ ' [" F% A W; Y8 _# [; I$ y
- #define GPIO_AF_USART1 ((uint8_t)0x07) /* USART1 Alternate Function mapping */
! e( S2 J# {$ t - #define GPIO_AF_USART2 ((uint8_t)0x07) /* USART2 Alternate Function mapping */
8 u' m+ k$ u3 M J8 w2 o# | - #define GPIO_AF_USART3 ((uint8_t)0x07) /* USART3 Alternate Function mapping */! |1 _ w" p' E s# B+ V
- #define GPIO_AF7_SPI3 ((uint8_t)0x07) /* SPI3/I2S3ext Alternate Function mapping */
! e9 W' T- K- a! c0 K$ k - #if defined(STM32F413_423xx)) i6 R( s- I- I3 z* x9 q- k
- #define GPIO_AF7_DFSDM2 ((uint8_t)0x07) /* DFSDM2 Alternate Function mapping */6 R. U( b' a! q1 b9 ~
- #define GPIO_AF7_SAI1 ((uint8_t)0x07) /* SAI1 Alternate Function mapping */. T/ j$ o& n1 a3 o- F1 {
- #endif /* STM32F413_423xx */9 }# F! ]; Y$ t. I/ d! r% s8 c4 `
" l& I- o9 e! R, p9 ~. @. N8 R- /**
" O9 }4 |2 m/ ^/ C2 P; H$ | - * @brief AF 7 selection Legacy
' p# I: [ D( |' Q; V" C- S6 M - */
( f, J: [# j) Z6 e S - #define GPIO_AF_I2S3ext GPIO_AF7_SPI3- {/ a$ E M% X6 o/ z" }* o
4 n, S8 K6 m" s+ `- /**
8 V' \) s/ [- P* k - * @brief AF 8 selection
- r' s: {5 u) T; u$ Z6 x& U - */ W1 g Q- Q1 W" N S3 [/ u8 L
- #define GPIO_AF_UART4 ((uint8_t)0x08) /* UART4 Alternate Function mapping */
4 N& T- z C! C4 J& A - #define GPIO_AF_UART5 ((uint8_t)0x08) /* UART5 Alternate Function mapping */
* l8 O* M' t& g/ K+ s, u - #define GPIO_AF_USART6 ((uint8_t)0x08) /* USART6 Alternate Function mapping */7 H- c' ]% x7 s/ G
- #define GPIO_AF_UART7 ((uint8_t)0x08) /* UART7 Alternate Function mapping */6 y% M( b6 K( Y! F' i) g1 t
- #define GPIO_AF_UART8 ((uint8_t)0x08) /* UART8 Alternate Function mapping */
& F2 g; p% M+ @4 f3 _5 f - #if defined(STM32F412xG) || defined(STM32F413_423xx)3 k; R, c8 D2 u6 i$ Z. ~$ g
- #define GPIO_AF8_USART3 ((uint8_t)0x08) /* USART3 Alternate Function mapping */
( k* {; D9 |' B( n" U# c$ H! ^) L - #define GPIO_AF8_DFSDM1 ((uint8_t)0x08) /* DFSDM Alternate Function mapping */
, |! B& l) _1 M8 ^/ L3 l' P - #define GPIO_AF8_CAN1 ((uint8_t)0x08) /* CAN1 Alternate Function mapping */
! N# R1 O! H2 a' G- k' W" A& [ - #endif /* STM32F412xG || STM32F413_423xx *// }$ f; ^4 ^) Z% V* V/ L. e
- #if defined(STM32F446xx): ]3 B+ f L/ _% K8 o$ Q9 k
- #define GPIO_AF8_SAI2 ((uint8_t)0x08) /* SAI2 Alternate Function mapping */
S! P) r8 O) |/ u8 [) g - #define GPIO_AF_SPDIF ((uint8_t)0x08) /* SPDIF Alternate Function mapping */
. o$ ^! a% L9 M) |4 F- U - #endif /* STM32F446xx */9 x+ L2 F" b' Y! s1 O$ a: c( y
: L, V+ U6 y9 H8 M- /** - j* ~- o0 T2 o* k
- * @brief AF 9 selection
% o" P' J1 N2 }) p - */
* x& G8 c) j u& Y' @# I - #define GPIO_AF_CAN1 ((uint8_t)0x09) /* CAN1 Alternate Function mapping */
- h- W6 @. \) i - #define GPIO_AF_CAN2 ((uint8_t)0x09) /* CAN2 Alternate Function mapping */" g4 J$ l; K0 G" N8 o9 y
- #define GPIO_AF_TIM12 ((uint8_t)0x09) /* TIM12 Alternate Function mapping */9 e7 [5 d* E% f1 a# q M
- #define GPIO_AF_TIM13 ((uint8_t)0x09) /* TIM13 Alternate Function mapping */
- `2 w# Q) `' i$ d, u- w% j- b, q - #define GPIO_AF_TIM14 ((uint8_t)0x09) /* TIM14 Alternate Function mapping */
8 _( a2 S3 ^ B - #define GPIO_AF9_I2C2 ((uint8_t)0x09) /* I2C2 Alternate Function mapping (Only for STM32F401xx/STM32F410xx/STM32F411xE/STM32F412xG/STM32F413_423xx Devices) */
2 G4 I) M+ q' ^; @( b - #define GPIO_AF9_I2C3 ((uint8_t)0x09) /* I2C3 Alternate Function mapping (Only for STM32F401xx/STM32F411xE/STM32F412xG and STM32F413_423xx Devices) */1 d ^4 } X v: o
- #if defined(STM32F446xx)
; L# |2 n+ p: O. s" Q2 H! y - #define GPIO_AF9_SAI2 ((uint8_t)0x09) /* SAI2 Alternate Function mapping */& Z! J& ^5 }" S- w3 j, f' C5 H
- #endif /* STM32F446xx */
/ J2 M1 U7 Z, t; E4 A) v - #define GPIO_AF9_LTDC ((uint8_t)0x09) /* LTDC Alternate Function mapping */6 [- @$ T( `) [
- #if defined(STM32F412xG) || defined(STM32F413_423xx) || defined(STM32F446xx) || defined(STM32F469_479xx)! o6 A8 e7 m0 _) T8 {
- #define GPIO_AF9_QUADSPI ((uint8_t)0x09) /* QuadSPI Alternate Function mapping */! a/ Q# k! V0 |! v) S ^: ]
- #endif /* STM32F412xG || STM32F413_423xx || STM32F446xx || STM32F469_479xx */. g( W/ p& q- _$ C. V
- #if defined(STM32F410xx) || defined(STM32F412xG) || defined(STM32F413_423xx)- \0 @: y- q0 v& C
- #define GPIO_AF9_FMPI2C ((uint8_t)0x09) /* FMPI2C Alternate Function mapping (Only for STM32F410xx Devices) */& c/ _" @, A7 m& R' I
- #endif /* STM32F410xx || STM32F412xG || STM32F413_423xx */9 ?9 j) R3 P! ^' ?! y" M/ f, l
- + @% P* Z3 ~ }1 R
- /**
" o0 k2 S i' I5 n1 r - * @brief AF 10 selection - j" z b8 E& R: `) s( i
- */ 1 c3 m* Y9 k: i) k7 ]$ s
- #define GPIO_AF_OTG_FS ((uint8_t)0xA) /* OTG_FS Alternate Function mapping */
1 A; p% m5 O6 Q* ~7 z, f - #define GPIO_AF_OTG_HS ((uint8_t)0xA) /* OTG_HS Alternate Function mapping */; m7 P+ f, _1 w5 ]8 q9 t' Z
- #if defined(STM32F446xx)
# R: {) M" o$ F3 Q* d8 I - #define GPIO_AF10_SAI2 ((uint8_t)0x0A) /* SAI2 Alternate Function mapping */
9 s% Y/ U" F# {/ y8 a) ^ - #endif /* STM32F446xx */) Q- t$ J- ]2 Q5 L+ \
- #if defined(STM32F412xG) || defined(STM32F413_423xx) || defined(STM32F446xx) || defined(STM32F469_479xx)* |+ h0 w) {' \, \
- #define GPIO_AF10_QUADSPI ((uint8_t)0x0A) /* QuadSPI Alternate Function mapping */ l, z+ H. H3 c1 Q8 F
- #endif /* STM32F412xG || STM32F413_423xx || STM32F446xx || STM32F469_479xx */2 `3 } W5 @7 e: ~% m( L
- #if defined(STM32F412xG) || defined(STM32F413_423xx)) B3 \% l" A* U* \& L- n6 s
- #define GPIO_AF10_FMC ((uint8_t)0xA) /* FMC Alternate Function mapping */# t0 m2 s6 B' W
- #define GPIO_AF10_DFSDM1 ((uint8_t)0xA) /* DFSDM Alternate Function mapping */
* j1 U5 _2 C# Z! H& ~- \ - #endif /* STM32F412xG || STM32F413_423xx */" X0 L9 d: Y! A7 E' j% A: P
- #if defined(STM32F413_423xx)
5 l1 w" F* A1 y7 q, G - #define GPIO_AF10_DFSDM2 ((uint8_t)0x0A) /* DFSDM2 Alternate Function mapping */% k$ Z& c j+ v0 }0 z
- #define GPIO_AF10_SAI1 ((uint8_t)0x0A) /* SAI1 Alternate Function mapping */( q3 r5 i( y S0 G
- #endif /* STM32F413_423xx */
8 Z$ B, z. p. R - /** ( y0 T5 D, p. C- M# x! }9 v" E
- * @brief AF 11 selection $ C; V/ w# y# W( N' ]! |
- */ 0 Y9 N5 j4 U: P6 M5 O8 ^
- #define GPIO_AF_ETH ((uint8_t)0x0B) /* ETHERNET Alternate Function mapping */
, Q* [7 l1 `6 B C( V - #if defined(STM32F413_423xx)
8 [' c T; H5 O- t# t% B - #define GPIO_AF11_UART4 ((uint8_t)0x0B) /* UART4 Alternate Function mapping */
8 J. U: F6 M9 v, G$ i- w - #define GPIO_AF11_UART5 ((uint8_t)0x0B) /* UART5 Alternate Function mapping */
- v* y* \/ L. ?/ Z5 R* q - #define GPIO_AF11_UART9 ((uint8_t)0x0B) /* UART9 Alternate Function mapping */% I# `6 p5 m4 U+ c, D3 y
- #define GPIO_AF11_UART10 ((uint8_t)0x0B) /* UART10 Alternate Function mapping */8 w! C! g6 s. s1 K5 v
- #define GPIO_AF11_CAN3 ((uint8_t)0x0B) /* CAN3 Alternate Function mapping */
5 f" p5 x e& M1 I - #endif /* STM32F413_423xx */* X D! S: P- g& t
' M! b" q6 m7 R" _2 u: q1 \- /** , I1 x% z) J/ t4 d0 g" Q9 x
- * @brief AF 12 selection 5 }* O$ ~0 X; P5 e! a' M* ^
- */
- f! I2 B4 f# g - #if defined(STM32F40_41xxx) || defined(STM32F412xG) || defined(STM32F413_423xx)5 {6 ?1 R# _+ X' b2 q. ~
- #define GPIO_AF_FSMC ((uint8_t)0xC) /* FSMC Alternate Function mapping */
& N8 H) b% J4 y: N* o - #endif /* STM32F40_41xxx || STM32F412xG || STM32F413_423xx */
) [. s1 |+ K2 c: n0 U; e' F
3 B( k! t: P& I2 {1 X7 F- #if defined(STM32F427_437xx) || defined(STM32F429_439xx) || defined(STM32F446xx) || defined(STM32F469_479xx)/ y8 f8 }8 e+ ~: t3 t8 A# E B
- #define GPIO_AF_FMC ((uint8_t)0xC) /* FMC Alternate Function mapping */% H4 B" G S% O5 E, X d
- #endif /* STM32F427_437xx || STM32F429_439xx || STM32F446xx || STM32F469_479xx */
; w' H8 W \2 b3 G6 K
8 h+ Q! t* e; ~- #define GPIO_AF_OTG_HS_FS ((uint8_t)0xC) /* OTG HS configured in FS, Alternate Function mapping */
4 i) J& f0 e b# x8 X! j - #define GPIO_AF_SDIO ((uint8_t)0xC) /* SDIO Alternate Function mapping */' r4 Q7 V# }8 P" f
- 9 q8 b2 s& b! c
- /** _( w. d! j, E( o4 C
- * @brief AF 13 selection 4 I1 M/ z& F9 j! r+ Y# g2 h6 s/ |
- */
5 i1 V! }5 u' M5 p) {# @ - #define GPIO_AF_DCMI ((uint8_t)0x0D) /* DCMI Alternate Function mapping *// _% l( z n) _, y% w$ g& b' N5 C
- #if defined(STM32F469_479xx)
: ~" B4 |+ ?/ y: z! S - #define GPIO_AF_DSI ((uint8_t)0x0D) /* DSI Alternate Function mapping */- |, T- Y0 f9 B3 \6 W L0 z1 S
- #endif /* STM32F469_479xx */4 V/ ^0 D7 f8 `1 k; d c
- /** # U- A4 n9 S0 A% ?3 ]7 E- `/ Q, h
- * @brief AF 14 selection - j# z5 j z, Q6 U
- */3 c9 r7 H9 x; q: r. c
- #define GPIO_AF_LTDC ((uint8_t)0x0E) /* LCD-TFT Alternate Function mapping */% Z' z) |8 c2 O' B3 G0 Q4 I
- #if defined(STM32F413_423xx), f2 M7 x0 X. V6 ~( c8 S
- #define GPIO_AF14_RNG ((uint8_t)0x0E) /* RNG Alternate Function mapping */6 ^/ d$ s& ?% T
- #endif /* STM32F413_423xx */
! I8 f% S. i G4 i3 [* |
1 \9 R$ r& G8 z- /** 1 \5 @# R3 E, x. s3 R7 H! o/ }
- * @brief AF 15 selection
8 L3 E& ~) U) ]% x0 @ - */
0 W: A8 A" V T' Q# i! X1 [ - #define GPIO_AF_EVENTOUT ((uint8_t)0x0F) /* EVENTOUT Alternate Function mapping *// Y- L, n# x) W
3 L, x7 @8 }7 `9 `' I( T- #define IS_GPIO_AF(AF) (((AF) == GPIO_AF_RTC_50Hz) || ((AF) == GPIO_AF_TIM14) || \9 ]3 p, U- S7 V9 ~) h
- ((AF) == GPIO_AF_MCO) || ((AF) == GPIO_AF_TAMPER) || \
0 H; }/ G8 q9 J - ((AF) == GPIO_AF_SWJ) || ((AF) == GPIO_AF_TRACE) || \
7 M( t$ @8 a8 e - ((AF) == GPIO_AF_TIM1) || ((AF) == GPIO_AF_TIM2) || \
- O8 u( V# n: F( m% l - ((AF) == GPIO_AF_TIM3) || ((AF) == GPIO_AF_TIM4) || \
& M- y, x1 k. v - ((AF) == GPIO_AF_TIM5) || ((AF) == GPIO_AF_TIM8) || \
: m7 e1 ^' {! J: _ - ((AF) == GPIO_AF_I2C1) || ((AF) == GPIO_AF_I2C2) || \( Q, h2 v% E" F% B5 U
- ((AF) == GPIO_AF_I2C3) || ((AF) == GPIO_AF_SPI1) || \- f/ L6 \3 j$ h* K7 B% ~4 t
- ((AF) == GPIO_AF_SPI2) || ((AF) == GPIO_AF_TIM13) || \# W2 c7 H D5 L7 `2 h/ W- l
- ((AF) == GPIO_AF_SPI3) || ((AF) == GPIO_AF_TIM14) || \" w' e4 W$ L) f" f% O- q* u: J
- ((AF) == GPIO_AF_USART1) || ((AF) == GPIO_AF_USART2) || \
# H6 i0 t, d6 P7 E& I- ? - ((AF) == GPIO_AF_USART3) || ((AF) == GPIO_AF_UART4) || \) ~& ]7 u) W3 @% i& y
- ((AF) == GPIO_AF_UART5) || ((AF) == GPIO_AF_USART6) || \' I' `5 ]* Y4 ]. u* M
- ((AF) == GPIO_AF_CAN1) || ((AF) == GPIO_AF_CAN2) || \: e5 V! e% N8 N& ~" [
- ((AF) == GPIO_AF_OTG_FS) || ((AF) == GPIO_AF_OTG_HS) || \
8 L9 X0 u2 g; O* I4 e$ P - ((AF) == GPIO_AF_ETH) || ((AF) == GPIO_AF_OTG_HS_FS) || \
& a. w. u; l+ n5 e1 u - ((AF) == GPIO_AF_SDIO) || ((AF) == GPIO_AF_DCMI) || \: U9 ?+ \4 [: t* L) c
- ((AF) == GPIO_AF_EVENTOUT) || ((AF) == GPIO_AF_FSMC))
3 _% A# P8 f& x0 B* t4 n - #endif /* STM32F40_41xxx */
复制代码
+ e. w4 N, }% b5 ^* Y; s04. 函数% R6 V2 @- l) |
GPIO复用功能函数
8 l4 M& l& n& X/ U- L5 _% J5 u1 c' c7 n2 v7 Z
- /* GPIO Alternate functions configuration function ****************************/5 j* E' \: j& S0 X. H2 k$ `
- void GPIO_PinAFConfig(GPIO_TypeDef* GPIOx, uint16_t GPIO_PinSource, uint8_t GPIO_AF);
复制代码 1 A# n7 r9 n7 H) }9 T) T: i/ U8 W
05. 参考示例
7 X9 q6 _! g' k6 Z& n! H) i/ W/ ^串口配置; a( l. @; d" T7 N. O" [( K; u
/ s$ h: E% b; i" N
- /*GPIOA9 与 GPIOA10 初始化*/
2 D0 M) u3 q2 a, P - GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10;
& S4 R+ P5 A! H - GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;// 复用功能1 t t; g4 B% ^# l
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//速度 50MHz
% I' j7 F2 `: \1 C' ` - GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推挽复用输出2 y* q/ K6 h3 m$ u/ T; k/ L
- GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; //上拉" ?/ u$ v* V: G. x" d# @
- GPIO_Init(GPIOA,&GPIO_InitStructure); //初始化 PA9,PA10
, y' T; ~5 |: c. ?% u! U - , d- g. c8 S5 S8 X( C8 i; C
- /*PA9 连接 AF7,复用为 USART1_TX */1 b- Z+ _9 I' k! B
- GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_USART1);
# b# v& [9 B1 ?) M: o' j - /* PA10 连接 AF7,复用为 USART1_RX*/
6 ?. ~: ?6 Y9 ^! B7 d8 [' V8 X8 p - GPIO_PinAFConfig(GPIOA,GPIO_PinSource10,GPIO_AF_USART1);
复制代码 l: |( V/ e8 }( W( e+ b: E, U
& j- P8 l( D7 B
7 m& q, D& I' r4 \; k) H( b
|