01. GPIO复用概述1 z9 |7 k7 `3 k$ E% d
STM32F4 有很多的内置外设,这些外设的外部引脚都是与 GPIO 复用的。也就是说,一个 GPIO如果可以复用为内置外设的功能引脚,那么当这个 GPIO 作为内置外设使用的时候,就叫做复用。9 k( U3 _0 v0 B- Y7 T5 ]4 I- D7 a
+ W: @* r8 r7 w
STM32F4 系列微控制器 IO 引脚通过一个复用器连接到内置外设或模块。该复用器一次只允许一个外设的复用功能(AF)连接到对应的 IO 口。这样可以确保共用同一个 IO 引脚的外设之间不会发生冲突。
" O/ |5 a; V- A" ^3 ^ ]$ P* g% W, q" e
每个 IO 引脚都有一个复用器,该复用器采用 16 路复用功能输入(AF0 到 AF15),可通过GPIOx_AFRL(针对引脚 0-7)和 GPIOx_AFRH(针对引脚 8-15)寄存器对这些输入进行配置,每四位控制一路复用
N6 |! B/ d/ G* ?
2 c4 s& b! ~$ u9 H) k: r$ L' `/ l1)完成复位后,所有 IO 都会连接到系统的复用功能 0(AF0)。
$ ?, T- x g& Y8 h2)外设的复用功能映射到 AF1 到 AF13。
: x6 H+ C7 h# u1 M7 M3)Cortex-M4 EVENTOUT 映射到 AF15。
0 l7 ?: u: p8 d2 W/ Q& V
9 f2 n2 V$ x& {5 {5 V' P
0 {- J6 v' y, g: r( l. b* z5 k* x3 b, a
+ o$ I9 i4 Y$ s7 K1 ~* @02. 寄存器描述
( Y, e7 @+ x' v) K0 @: Z) y探索者 STM32F407 开发板的原理图上 PC11 的原理图如图 所示:
* V6 A _! c4 U7 j8 ~7 Q ? f( B3 J2 T0 L: Q+ x% i
! z# {. }- f. Z0 t
4 U0 ?& C. Y5 V0 y. o" u, k5 [
PC11 可以作为 SPI3_MISO/U3_RX/U4_RX/SDIO_D3/DCMI_D4/I2S3ext_SD等复用功能输出,这么多复用功能,如果这些外设都开启了,那么对 STM32F1 来说,那就可能乱套了,外设之间可互相干扰,但是 STM32F4,由于有复用功能选择功能,可以让 PC11 仅连接到某个特定的外设,因此不存在互相干扰的情况。
2 O# z3 t' B, P0 I( `: a4 ~' P
" n: |+ r7 n6 L" n! sGPIO 复用功能低位寄存器 (GPIOx_AFRL) (x = A…I)( j% {+ X2 l ?6 V. O2 W. o [
GPIO alternate function low register
* [7 N6 N c2 x7 J偏移地址:0x20
8 A( A4 ]: o5 ] P9 B' ]! ^复位值:0x0000 0000& M. [+ y& P9 H# ?. u: T; z
3 Z. ~, l/ b+ q
# i; H4 g1 _* L( v1 R
! h" w' k, D8 M8 a2 hGPIO 复用功能高位寄存器 (GPIOx_AFRH) (x = A…I)
) E k1 m4 v+ x' ^( W3 r1 R6 A4 aGPIO alternate function high register3 p2 O( r! N. Z0 Q/ m/ q0 j2 }
偏移地址:0x24* ^2 l) x. z; W# A: ~* |; A. V
复位值:0x0000 0000
$ n4 g- ^9 Q/ _ `8 b
" g# N7 `2 W" Y$ S' O
( ~" h0 ~4 a. Q( R* G7 k- s9 G" P" F
3 ^! O& B# A8 _3 r( B @% i. B, j在微控制器完成复位后,所有 IO 口都会连接到系统复用功能 0(AF0)。这里大家需要注意,对于系统复用功能 AF0,我们将 IO 口连接到 AF0 之后,还要根据所用功能进行配置:
4 J* [7 \2 u+ ?4 P- e' f
$ m- ^; H' d5 F: r Y- D" kJTAG/SWD:在器件复位之后,会将这些功能引脚指定为专用引脚。也就是说,这些引脚在复位后默认就是 JTAG/SWD 功能。如果我们要作为 GPIO 来使用,就需要对对应的 IO口复用器进行配置。; `" r8 p" z& f/ f0 p! H8 f6 x% ?
! ~4 t+ w9 _& h# n4 c. u' v
RTC_REFIN:此引脚在系统复位之后要使用的话要配置为浮空输入模式。- J5 ^0 E1 T" g$ N- _
: N* `# Q6 E, gMCO1 和 MCO2:这些引脚在系统复位之后要使用的话要配置为复用功能模式。4 s8 Z9 w8 v' s$ {
% A _" a, Q$ y: G7 q$ O- T
03. 类型! j% ^$ _3 ]! ]" m
复用功能相关宏- v7 _' V& t( e0 y
5 }& K% G3 I T- /** + i$ n3 Y7 l3 N3 y( S
- * @brief AF 0 selection
) a1 Y3 x6 E# G5 m; ~; [ C" M - */
1 ]( v: k" f- ?0 T6 a8 u1 D - #define GPIO_AF_RTC_50Hz ((uint8_t)0x00) /* RTC_50Hz Alternate Function mapping */
6 Y+ n0 K" i. v2 q! z* N1 L' Q% l1 } - #define GPIO_AF_MCO ((uint8_t)0x00) /* MCO (MCO1 and MCO2) Alternate Function mapping */
. P& _4 V/ Y5 L! z% Z, o# c - #define GPIO_AF_TAMPER ((uint8_t)0x00) /* TAMPER (TAMPER_1 and TAMPER_2) Alternate Function mapping */
9 V8 \5 `/ W0 F* W9 n - #define GPIO_AF_SWJ ((uint8_t)0x00) /* SWJ (SWD and JTAG) Alternate Function mapping */6 L1 _0 s) B& j) c c
- #define GPIO_AF_TRACE ((uint8_t)0x00) /* TRACE Alternate Function mapping */
8 W5 O0 q$ \. ] U4 o; [. T0 C - #if defined(STM32F446xx)
9 F/ r" M3 ?' R - #define GPIO_AF0_TIM2 ((uint8_t)0x00) /* TIM2 Alternate Function mapping */
3 ~+ S6 b) \2 B9 v1 m& c& t - #endif /* STM32F446xx */
' k( ?6 [% f7 }; S+ |% }7 d
5 h; W! C' X0 V- P- /** , `& C1 z6 h, I; @# ]! k- n
- * @brief AF 1 selection / m' t8 G8 f& Y: _# p$ j) Z6 g. K. v4 R
- */
& t# \$ k# F7 Y0 C$ d! e# f2 m' _ - #define GPIO_AF_TIM1 ((uint8_t)0x01) /* TIM1 Alternate Function mapping */3 z8 [" ^+ S3 y5 C5 H( N$ O- ^4 l
- #define GPIO_AF_TIM2 ((uint8_t)0x01) /* TIM2 Alternate Function mapping */
) w6 {1 n+ {: n. {9 W7 D! S- ] - #if defined(STM32F410xx) || defined(STM32F413_423xx)& ?; o3 `: S7 N' `& e+ I# b
- #define GPIO_AF_LPTIM ((uint8_t)0x01) /* LPTIM Alternate Function mapping */, S6 X/ [/ c. W. }( C; \ x
- #endif /* STM32F410xx || STM32F413_423xx */$ _5 v5 Q" I, {, q% J$ t' _& E/ c
- /**
6 ]8 i4 _7 L4 U4 Q+ a - * @brief AF 2 selection 9 I: v" c. c+ X' P* c
- */
) q+ y" L* w8 a' x9 o/ g/ t+ Z0 @" m - #define GPIO_AF_TIM3 ((uint8_t)0x02) /* TIM3 Alternate Function mapping */: T5 ]7 {" P' |1 E& b1 m
- #define GPIO_AF_TIM4 ((uint8_t)0x02) /* TIM4 Alternate Function mapping */
% _, f1 c; W# j, z - #define GPIO_AF_TIM5 ((uint8_t)0x02) /* TIM5 Alternate Function mapping */1 r3 X5 P* r' S- d6 h, B6 O
2 ]* c. ?, \- k2 _2 N6 Z- /**
' D# j, W& I T( v2 m - * @brief AF 3 selection
$ ?0 l7 @2 s3 M8 L% r - */ " s& V9 L& ~! s; b4 ~$ c$ R
- #define GPIO_AF_TIM8 ((uint8_t)0x03) /* TIM8 Alternate Function mapping */$ }! F) a0 v! ?
- #define GPIO_AF_TIM9 ((uint8_t)0x03) /* TIM9 Alternate Function mapping */8 R h" V6 _7 ^; J9 M9 d" G
- #define GPIO_AF_TIM10 ((uint8_t)0x03) /* TIM10 Alternate Function mapping */4 d" a6 G8 `3 S" b O
- #define GPIO_AF_TIM11 ((uint8_t)0x03) /* TIM11 Alternate Function mapping */8 v% ?$ u3 G H+ }: v5 w& Q
- #if defined(STM32F446xx)) N6 s% V8 p# ?" s" Z% n
- #define GPIO_AF3_CEC ((uint8_t)0x03) /* CEC Alternate Function mapping */4 g r: g: X1 W2 F! F: P6 t# j- t
- #endif /* STM32F446xx */! W# `+ J- D+ P5 y
- #if defined(STM32F413_423xx)
; v ]8 W3 O% {. m - #define GPIO_AF3_DFSDM2 ((uint8_t)0x03) /* DFSDM2 Alternate Function mapping */
7 l& O1 ?. v; r7 o) Y) H - #endif /* STM32F413_423xx */" S# S1 B! f2 s* C* h
- /** " e8 Y7 J) C2 h _: I
- * @brief AF 4 selection
% \* m x+ ?6 u6 Q8 v" ? - */ . U( H* p+ \ i, t4 H) X
- #define GPIO_AF_I2C1 ((uint8_t)0x04) /* I2C1 Alternate Function mapping */1 A5 l+ w0 p. r# K9 K, g
- #define GPIO_AF_I2C2 ((uint8_t)0x04) /* I2C2 Alternate Function mapping */2 S6 p2 J; f! @$ T! q' @& y
- #define GPIO_AF_I2C3 ((uint8_t)0x04) /* I2C3 Alternate Function mapping */, T( U6 a" a8 t2 c1 N
- #if defined(STM32F446xx)
! N3 `. X% E/ z2 h - #define GPIO_AF4_CEC ((uint8_t)0x04) /* CEC Alternate Function mapping */( ^0 P* W+ J+ a8 s; r, Z N8 h
- #endif /* STM32F446xx */8 N- l; u9 i8 h8 S! d |' f
- #if defined(STM32F410xx) || defined(STM32F412xG) || defined(STM32F413_423xx) || defined(STM32F446xx)' Y/ |3 r, D& ^$ ?/ b+ b& z, \
- #define GPIO_AF_FMPI2C ((uint8_t)0x04) /* FMPI2C Alternate Function mapping */" h+ S0 G1 h+ F. |! n- g" E$ m/ \
- #endif /* STM32F410xx || STM32F446xx */
; B# V5 \& T& ^& a9 J6 r7 Y! n
6 }% v& M8 A6 o- /**
8 a) D8 y% U& R8 D. n3 f - * @brief AF 5 selection * y. [' O# U& L$ X0 a6 F
- */
$ s6 G+ l. D2 T1 n! n! t9 e - #define GPIO_AF_SPI1 ((uint8_t)0x05) /* SPI1/I2S1 Alternate Function mapping */, n, U6 u2 N" e1 I5 B2 v
- #define GPIO_AF_SPI2 ((uint8_t)0x05) /* SPI2/I2S2 Alternate Function mapping */* Y% p( c( k* |, c {& Z+ c n
- #define GPIO_AF5_SPI3 ((uint8_t)0x05) /* SPI3/I2S3 Alternate Function mapping (Only for STM32F411xE and STM32F413_423xx Devices) */
7 c8 C& Y; m! @0 j5 K - #define GPIO_AF_SPI4 ((uint8_t)0x05) /* SPI4/I2S4 Alternate Function mapping */5 J$ t' ?6 {8 @* y8 i+ z Q2 ^5 a
- #define GPIO_AF_SPI5 ((uint8_t)0x05) /* SPI5 Alternate Function mapping */
# W! F) S, J7 p+ \6 G, i4 o& i* _ - #define GPIO_AF_SPI6 ((uint8_t)0x05) /* SPI6 Alternate Function mapping */
, m- m a" n/ t% @: V3 \( Q) M - . x4 g: R7 X$ t3 A' E2 j3 K
- /** $ X9 l- T) G0 u
- * @brief AF 6 selection
8 g: Q# z2 c2 O1 e5 @ - */
8 q/ R- U* E$ }9 t$ Y1 Q8 b+ T - #define GPIO_AF_SPI3 ((uint8_t)0x06) /* SPI3/I2S3 Alternate Function mapping */
9 b! I( r) I4 a4 D - #define GPIO_AF6_SPI1 ((uint8_t)0x06) /* SPI1 Alternate Function mapping (Only for STM32F410xx Devices) */& J9 G+ }9 f% j( I9 o4 P2 M8 U
- #define GPIO_AF6_SPI2 ((uint8_t)0x06) /* SPI2 Alternate Function mapping (Only for STM32F410xx/STM32F411xE Devices) */
4 D, }9 a' [" Z9 p3 L3 t, m - #define GPIO_AF6_SPI4 ((uint8_t)0x06) /* SPI4 Alternate Function mapping (Only for STM32F411xE Devices) */
) K$ `! h3 H- \ - #define GPIO_AF6_SPI5 ((uint8_t)0x06) /* SPI5 Alternate Function mapping (Only for STM32F410xx/STM32F411xE Devices) */5 v+ J0 L }9 g0 q! \. z
- #define GPIO_AF_SAI1 ((uint8_t)0x06) /* SAI1 Alternate Function mapping */
8 \& S1 c% j* m/ Q - #define GPIO_AF_I2S2ext ((uint8_t)0x06) /* I2S2ext_SD Alternate Function mapping (only for STM32F412xG and STM32F413_423xx Devices) */
; x) J: T8 ?" E: e6 i' F2 D - #if defined(STM32F412xG) || defined(STM32F413_423xx), O$ \: \( Z" }
- #define GPIO_AF6_DFSDM1 ((uint8_t)0x06) /* DFSDM1 Alternate Function mapping */7 f* z8 ~1 x8 \3 o, I
- #endif /* STM32F412xG || STM32F413_423xx */6 T) ^+ Q' p9 Y. d7 J! I
- #if defined(STM32F413_423xx)
0 d# I6 }- w4 o1 L - #define GPIO_AF6_DFSDM2 ((uint8_t)0x06) /* DFSDM2 Alternate Function mapping */
W( B8 Q1 Y+ Z- M: P; y - #endif /* STM32F413_423xx */
7 E4 W+ K/ e5 O: w# ?
( Q v, G8 w1 g r4 g0 N2 i- /**
0 d4 @/ p" d3 I4 g6 L1 e ]% d - * @brief AF 7 selection & G, D7 Y' ]" O* H
- */
% @/ S/ ~) I. z- k! D7 m - #define GPIO_AF_USART1 ((uint8_t)0x07) /* USART1 Alternate Function mapping */
_) {$ ^: P! z9 I - #define GPIO_AF_USART2 ((uint8_t)0x07) /* USART2 Alternate Function mapping */
. |- f8 U" o) z, }/ M - #define GPIO_AF_USART3 ((uint8_t)0x07) /* USART3 Alternate Function mapping */
; k- [8 U& X4 u - #define GPIO_AF7_SPI3 ((uint8_t)0x07) /* SPI3/I2S3ext Alternate Function mapping */% { h! w7 h0 ?$ N
- #if defined(STM32F413_423xx)
. o1 y, A* y6 X5 d" ^ - #define GPIO_AF7_DFSDM2 ((uint8_t)0x07) /* DFSDM2 Alternate Function mapping */6 N# t/ G( s: Q7 u% E: p1 K
- #define GPIO_AF7_SAI1 ((uint8_t)0x07) /* SAI1 Alternate Function mapping */$ s; U' \7 h/ ^% ? b3 g
- #endif /* STM32F413_423xx */- ~8 _4 I% z5 u5 f& X
- $ s* j8 s' q$ W8 K, |% H- w0 z
- /** M5 s# X. x1 P3 f/ p
- * @brief AF 7 selection Legacy 2 h% w* ]$ N8 F# `% ?
- */ 7 ?+ Y: U9 Z' a) t$ J# K
- #define GPIO_AF_I2S3ext GPIO_AF7_SPI3
( \8 V& W# p. [" j
: K6 F3 U/ A% k4 B+ d0 h) [8 q- /**
* @+ T4 ^$ h' M, ? - * @brief AF 8 selection
0 C* ^, d- n) w# H6 \1 H! u - */ & z0 {7 I" z2 }+ \# ], M& h
- #define GPIO_AF_UART4 ((uint8_t)0x08) /* UART4 Alternate Function mapping */$ T) v5 E) }' N; R7 C
- #define GPIO_AF_UART5 ((uint8_t)0x08) /* UART5 Alternate Function mapping */
|' u# N0 ]* u - #define GPIO_AF_USART6 ((uint8_t)0x08) /* USART6 Alternate Function mapping */6 `; Z1 F% X1 ^& o- ]
- #define GPIO_AF_UART7 ((uint8_t)0x08) /* UART7 Alternate Function mapping *// N3 ~' A6 q8 s1 s8 H# J3 Y
- #define GPIO_AF_UART8 ((uint8_t)0x08) /* UART8 Alternate Function mapping */3 }, r0 H4 ~" _
- #if defined(STM32F412xG) || defined(STM32F413_423xx)$ K; \3 ~" w0 z' }9 h: F% ]. h
- #define GPIO_AF8_USART3 ((uint8_t)0x08) /* USART3 Alternate Function mapping */
' Z) a4 X1 F8 W( e9 U2 p) T% e - #define GPIO_AF8_DFSDM1 ((uint8_t)0x08) /* DFSDM Alternate Function mapping */
5 ]3 i5 F4 o2 l& W) p# d - #define GPIO_AF8_CAN1 ((uint8_t)0x08) /* CAN1 Alternate Function mapping */
+ W2 `+ G: H$ v+ u6 }# s2 s) K - #endif /* STM32F412xG || STM32F413_423xx */
2 K+ T" v# s+ q4 Z5 m; ` - #if defined(STM32F446xx)
B8 [, W( l7 A9 M' H2 c$ G - #define GPIO_AF8_SAI2 ((uint8_t)0x08) /* SAI2 Alternate Function mapping */( c+ _8 \4 w1 ~$ H5 v
- #define GPIO_AF_SPDIF ((uint8_t)0x08) /* SPDIF Alternate Function mapping */
! T4 V' C+ i/ L1 C) s - #endif /* STM32F446xx */
" j7 X1 u- u u9 Z
" H% l) U3 L3 w, W- /** ( W; g0 a5 M* }4 R' I
- * @brief AF 9 selection
& u5 E, W1 W& k1 f9 F - */
5 ^* `5 ]& k1 n) T0 [: Y0 i2 ~ i - #define GPIO_AF_CAN1 ((uint8_t)0x09) /* CAN1 Alternate Function mapping */, \0 N1 ] l/ E# w; ?) D5 r7 }4 f( G
- #define GPIO_AF_CAN2 ((uint8_t)0x09) /* CAN2 Alternate Function mapping */
9 C3 c4 l! V1 L7 k/ Q( {( }. S - #define GPIO_AF_TIM12 ((uint8_t)0x09) /* TIM12 Alternate Function mapping */
- v7 Q" [' O2 D# `. [ - #define GPIO_AF_TIM13 ((uint8_t)0x09) /* TIM13 Alternate Function mapping */
4 v$ f5 p( T% D1 J% d - #define GPIO_AF_TIM14 ((uint8_t)0x09) /* TIM14 Alternate Function mapping */3 ]2 a6 `. |" F* h) e
- #define GPIO_AF9_I2C2 ((uint8_t)0x09) /* I2C2 Alternate Function mapping (Only for STM32F401xx/STM32F410xx/STM32F411xE/STM32F412xG/STM32F413_423xx Devices) */" n. ]+ Q; e" |0 I' K* M/ I1 {' v
- #define GPIO_AF9_I2C3 ((uint8_t)0x09) /* I2C3 Alternate Function mapping (Only for STM32F401xx/STM32F411xE/STM32F412xG and STM32F413_423xx Devices) */
5 f u3 d' N2 N+ j - #if defined(STM32F446xx)3 h4 A; c7 g/ _! y
- #define GPIO_AF9_SAI2 ((uint8_t)0x09) /* SAI2 Alternate Function mapping */
6 U3 h3 x9 t6 O& } - #endif /* STM32F446xx */
+ A7 z( ~# V u/ D% a1 P6 h - #define GPIO_AF9_LTDC ((uint8_t)0x09) /* LTDC Alternate Function mapping */; X* K2 m/ j. t$ |+ d6 v1 Y
- #if defined(STM32F412xG) || defined(STM32F413_423xx) || defined(STM32F446xx) || defined(STM32F469_479xx)
/ j$ L4 _5 c+ Q9 g8 I7 d8 p - #define GPIO_AF9_QUADSPI ((uint8_t)0x09) /* QuadSPI Alternate Function mapping */
) h5 Q% Z3 b. n( f - #endif /* STM32F412xG || STM32F413_423xx || STM32F446xx || STM32F469_479xx */8 m: y: ]( a2 L. T
- #if defined(STM32F410xx) || defined(STM32F412xG) || defined(STM32F413_423xx)
x( N- v& |5 @+ q# f, \! r - #define GPIO_AF9_FMPI2C ((uint8_t)0x09) /* FMPI2C Alternate Function mapping (Only for STM32F410xx Devices) */* u- `$ k1 e! g" H! ~ T
- #endif /* STM32F410xx || STM32F412xG || STM32F413_423xx */
2 c& n% P8 z" U" b" ~! Y
# ?: V A# b, ^* ? H: K: z- /** : u @4 |6 B4 X
- * @brief AF 10 selection . z+ O3 R5 O# g8 s
- */ " a& j+ n) H/ s% T9 y* w% ~/ A- S
- #define GPIO_AF_OTG_FS ((uint8_t)0xA) /* OTG_FS Alternate Function mapping */
, A8 F( \! H- q" O: j v1 q - #define GPIO_AF_OTG_HS ((uint8_t)0xA) /* OTG_HS Alternate Function mapping */' N0 {) P3 |8 B1 U8 E4 V9 T. P
- #if defined(STM32F446xx)) B, |' ~) d5 h4 t
- #define GPIO_AF10_SAI2 ((uint8_t)0x0A) /* SAI2 Alternate Function mapping */
/ I: X6 D' N; `+ S - #endif /* STM32F446xx */
I4 G, l/ ]6 z' L K/ S+ H8 g - #if defined(STM32F412xG) || defined(STM32F413_423xx) || defined(STM32F446xx) || defined(STM32F469_479xx)6 n! S# _. U1 y& y# U
- #define GPIO_AF10_QUADSPI ((uint8_t)0x0A) /* QuadSPI Alternate Function mapping */
* |; D. x6 |( |: [: b0 C, D - #endif /* STM32F412xG || STM32F413_423xx || STM32F446xx || STM32F469_479xx */4 |/ A |% H1 j! C
- #if defined(STM32F412xG) || defined(STM32F413_423xx)
8 U/ R9 X# _7 \0 ` - #define GPIO_AF10_FMC ((uint8_t)0xA) /* FMC Alternate Function mapping */
, g1 \& c" K/ g% _% h - #define GPIO_AF10_DFSDM1 ((uint8_t)0xA) /* DFSDM Alternate Function mapping */
' \% C* Z T& ^3 A- V& w' H" G8 I - #endif /* STM32F412xG || STM32F413_423xx */
% a \- G0 K3 z# B% l# j, e - #if defined(STM32F413_423xx)
1 m! }6 v: V/ q- \ - #define GPIO_AF10_DFSDM2 ((uint8_t)0x0A) /* DFSDM2 Alternate Function mapping */
5 z; t# k( [- ~0 z! j - #define GPIO_AF10_SAI1 ((uint8_t)0x0A) /* SAI1 Alternate Function mapping */! @; V8 W1 C# z7 k1 s# U) F8 _
- #endif /* STM32F413_423xx */" E! c4 e1 h5 i p
- /**
0 Z/ H; a7 a- S" x, N: c - * @brief AF 11 selection / V8 S0 K2 x1 |( F. r9 U8 N: B
- */
% e% _2 x5 f: Z# ~2 S% W - #define GPIO_AF_ETH ((uint8_t)0x0B) /* ETHERNET Alternate Function mapping */
9 C2 j9 L0 R1 ~5 i6 y0 L - #if defined(STM32F413_423xx)
/ K/ c+ q& F8 \ - #define GPIO_AF11_UART4 ((uint8_t)0x0B) /* UART4 Alternate Function mapping */
$ h/ g% [+ k; v1 q$ {( n( _ - #define GPIO_AF11_UART5 ((uint8_t)0x0B) /* UART5 Alternate Function mapping */
8 _7 o5 }/ ^- ~2 c - #define GPIO_AF11_UART9 ((uint8_t)0x0B) /* UART9 Alternate Function mapping */
7 D- b; V. @( j. P; ]- z* N$ _ - #define GPIO_AF11_UART10 ((uint8_t)0x0B) /* UART10 Alternate Function mapping */
$ v5 e- O. M$ Y% ~( ~# M. m8 y - #define GPIO_AF11_CAN3 ((uint8_t)0x0B) /* CAN3 Alternate Function mapping */9 [( \0 B, a5 {
- #endif /* STM32F413_423xx */
+ k6 `! q3 S) K- N - ( h) o6 W- q* r( p6 I- ?
- /**
. M' g5 u) R" D! w1 m - * @brief AF 12 selection
# R! `# }4 y- K) h6 N - */
I4 y* W* G$ C# L d; o" H) |0 b% V - #if defined(STM32F40_41xxx) || defined(STM32F412xG) || defined(STM32F413_423xx)
$ [& k0 P( K1 _; U, W - #define GPIO_AF_FSMC ((uint8_t)0xC) /* FSMC Alternate Function mapping */3 s s' e4 `% U1 }" b* G; a
- #endif /* STM32F40_41xxx || STM32F412xG || STM32F413_423xx */ u# P3 d! h* P# \
. }2 `* N9 K& j6 g$ ]- c- #if defined(STM32F427_437xx) || defined(STM32F429_439xx) || defined(STM32F446xx) || defined(STM32F469_479xx)2 I \' K* B4 z! F
- #define GPIO_AF_FMC ((uint8_t)0xC) /* FMC Alternate Function mapping */
4 A( s n& ]" Q; T' m6 p9 `( R - #endif /* STM32F427_437xx || STM32F429_439xx || STM32F446xx || STM32F469_479xx */; e" z1 I* M2 G0 p3 V6 |; l
- ; \9 h: V" V+ w! z. A% y
- #define GPIO_AF_OTG_HS_FS ((uint8_t)0xC) /* OTG HS configured in FS, Alternate Function mapping */
" w. R# |; q& I- t# \ - #define GPIO_AF_SDIO ((uint8_t)0xC) /* SDIO Alternate Function mapping */
0 G: l. E6 S( S) X" A
+ }! Z( d1 ~3 c& h( n# w* ~9 p- /**
. i0 I9 @+ e; K/ g - * @brief AF 13 selection
& D6 N# w5 o! e! h/ i2 R' b - */ / d8 C" F* W0 a0 q
- #define GPIO_AF_DCMI ((uint8_t)0x0D) /* DCMI Alternate Function mapping */( h, R( a p9 i- O# Z6 `$ A* b
- #if defined(STM32F469_479xx), l( O7 @- P9 H# t/ h$ V2 `8 S
- #define GPIO_AF_DSI ((uint8_t)0x0D) /* DSI Alternate Function mapping *// T5 s: O/ f( v3 x# }
- #endif /* STM32F469_479xx */
6 p, y$ l; C& T& S9 F! _( u - /** 9 Y: m" _9 M2 M# k2 G% O
- * @brief AF 14 selection
. N3 H7 L3 C/ { - */
* d8 m l9 G# r$ o" j - #define GPIO_AF_LTDC ((uint8_t)0x0E) /* LCD-TFT Alternate Function mapping */
' A5 P4 h0 p$ k+ k, ]$ s, H; N - #if defined(STM32F413_423xx)9 n0 w7 p% c. E- b
- #define GPIO_AF14_RNG ((uint8_t)0x0E) /* RNG Alternate Function mapping */7 w6 x5 r5 `+ X; i) ^9 M- a
- #endif /* STM32F413_423xx */, |2 B; H0 r5 S- P C
- 2 g0 Q% d1 c! f# X
- /**
, e' f9 s" t3 d6 ~- k: j - * @brief AF 15 selection
f) g! m) g9 R6 e$ [5 W: Z - */
. Z- d! I+ a& r& k - #define GPIO_AF_EVENTOUT ((uint8_t)0x0F) /* EVENTOUT Alternate Function mapping */2 `% O- h5 T: i1 r
- # K/ S* d) S6 j: V
- #define IS_GPIO_AF(AF) (((AF) == GPIO_AF_RTC_50Hz) || ((AF) == GPIO_AF_TIM14) || \% D% e/ z& `& ~% x
- ((AF) == GPIO_AF_MCO) || ((AF) == GPIO_AF_TAMPER) || \. D% E# E+ h* c# j, e
- ((AF) == GPIO_AF_SWJ) || ((AF) == GPIO_AF_TRACE) || \0 T* }$ ]& N6 U* `
- ((AF) == GPIO_AF_TIM1) || ((AF) == GPIO_AF_TIM2) || \
9 `6 q8 h3 h& b8 z7 t \: Z# J - ((AF) == GPIO_AF_TIM3) || ((AF) == GPIO_AF_TIM4) || \+ u6 {6 w- j1 h: L* A$ W
- ((AF) == GPIO_AF_TIM5) || ((AF) == GPIO_AF_TIM8) || \
) v! S; P+ a/ G; E5 j2 ?; m - ((AF) == GPIO_AF_I2C1) || ((AF) == GPIO_AF_I2C2) || \
% s, f `. P G/ {$ Q2 ? - ((AF) == GPIO_AF_I2C3) || ((AF) == GPIO_AF_SPI1) || \
! u0 T) T& T" v5 C* O - ((AF) == GPIO_AF_SPI2) || ((AF) == GPIO_AF_TIM13) || \2 B# y0 S( Z& D1 A; `
- ((AF) == GPIO_AF_SPI3) || ((AF) == GPIO_AF_TIM14) || \( K- Z1 X8 K+ t/ X! Z% C
- ((AF) == GPIO_AF_USART1) || ((AF) == GPIO_AF_USART2) || \
4 \+ s9 w. b" d i! q" K5 o5 m" f: g - ((AF) == GPIO_AF_USART3) || ((AF) == GPIO_AF_UART4) || \7 L# ^, p2 y H
- ((AF) == GPIO_AF_UART5) || ((AF) == GPIO_AF_USART6) || \
2 h( u7 c! ]) g e5 ^' e) | - ((AF) == GPIO_AF_CAN1) || ((AF) == GPIO_AF_CAN2) || \
6 Y" Y$ o7 C& m& z' A l! E# Z" D3 K - ((AF) == GPIO_AF_OTG_FS) || ((AF) == GPIO_AF_OTG_HS) || \: A9 e) k1 r) U/ m
- ((AF) == GPIO_AF_ETH) || ((AF) == GPIO_AF_OTG_HS_FS) || \: |( D) Z+ q+ d6 L) j2 y m1 n
- ((AF) == GPIO_AF_SDIO) || ((AF) == GPIO_AF_DCMI) || \
( s0 e/ y/ D9 A$ @7 E6 m3 p4 e - ((AF) == GPIO_AF_EVENTOUT) || ((AF) == GPIO_AF_FSMC))0 D( G& z% j6 }. c9 O# U7 Y6 D
- #endif /* STM32F40_41xxx */
复制代码
N- d M9 u' A2 |6 a, R04. 函数) K) E4 F7 F9 c' l* b4 R- q, u& @$ E
GPIO复用功能函数6 N3 Y$ i; `& C. Q$ w7 @1 S! Y
2 u5 y$ N; E/ c- /* GPIO Alternate functions configuration function ****************************/
2 O0 V9 k/ p. l6 [7 F - void GPIO_PinAFConfig(GPIO_TypeDef* GPIOx, uint16_t GPIO_PinSource, uint8_t GPIO_AF);
复制代码 ; a# N5 U+ U/ a. j( z
05. 参考示例 E, v. a1 R3 e8 D
串口配置
7 I' Z0 I) I" B+ I; j0 ^& E- U7 _& N1 W
- /*GPIOA9 与 GPIOA10 初始化*/7 p: B7 q& e" T( U6 j2 h# x
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10;
6 O. t% g) b" W* N6 @ - GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;// 复用功能
4 `9 K' a! o3 y8 N! l# f* S - GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//速度 50MHz: _; p4 o( [7 v
- GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推挽复用输出
* S4 b$ f: r, R3 ^ v - GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; //上拉1 H6 s: R: c; D2 L3 E) G) p n$ m
- GPIO_Init(GPIOA,&GPIO_InitStructure); //初始化 PA9,PA104 [ s% n+ z- y& P$ G$ h" A8 `; c
- - Z9 I5 j) t$ h, J* I# i3 P# X
- /*PA9 连接 AF7,复用为 USART1_TX */
: O# x O) P5 s" v, j! M: s - GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_USART1);" c6 R6 k' k5 t
- /* PA10 连接 AF7,复用为 USART1_RX*/
$ x' j2 _7 v* h: p6 q# k - GPIO_PinAFConfig(GPIOA,GPIO_PinSource10,GPIO_AF_USART1);
复制代码
, T T' U2 H* @" r9 r
* _! v+ Q7 M) r3 V c' m m {' F% u8 q9 y* X4 d4 q8 b: u; o
|