01. GPIO复用概述4 |: e( ~3 K! C8 m8 h* M
STM32F4 有很多的内置外设,这些外设的外部引脚都是与 GPIO 复用的。也就是说,一个 GPIO如果可以复用为内置外设的功能引脚,那么当这个 GPIO 作为内置外设使用的时候,就叫做复用。' y( @+ V r: r6 B+ r
( h% }, V# e+ ` D& f
STM32F4 系列微控制器 IO 引脚通过一个复用器连接到内置外设或模块。该复用器一次只允许一个外设的复用功能(AF)连接到对应的 IO 口。这样可以确保共用同一个 IO 引脚的外设之间不会发生冲突。
$ \# a) [7 z3 A# g
9 H! S3 y9 \7 |9 |) |1 g$ n每个 IO 引脚都有一个复用器,该复用器采用 16 路复用功能输入(AF0 到 AF15),可通过GPIOx_AFRL(针对引脚 0-7)和 GPIOx_AFRH(针对引脚 8-15)寄存器对这些输入进行配置,每四位控制一路复用
0 m+ H: r; T) Y# ]8 x" w# p8 Z- t: G" [4 b
1)完成复位后,所有 IO 都会连接到系统的复用功能 0(AF0)。
% r; J K2 ] y, @" q+ `2)外设的复用功能映射到 AF1 到 AF13。
+ p9 Q) q$ K0 M3 j& W; x/ F3)Cortex-M4 EVENTOUT 映射到 AF15。. @ \5 D0 F$ D" y- v
; k2 y/ M4 I/ U2 Z0 J
$ D- _0 D, W7 H. C; T: H
8 E0 e2 M% O/ x. N* _7 ]02. 寄存器描述1 x6 F& G" V; J( A3 I2 S
探索者 STM32F407 开发板的原理图上 PC11 的原理图如图 所示:2 {$ T. [ C+ K8 r: k9 C3 S
5 {- T! _, x; Q$ h n# k% C
8 Z% U0 i/ b4 D0 ^
# c9 _) [4 B- T% `% mPC11 可以作为 SPI3_MISO/U3_RX/U4_RX/SDIO_D3/DCMI_D4/I2S3ext_SD等复用功能输出,这么多复用功能,如果这些外设都开启了,那么对 STM32F1 来说,那就可能乱套了,外设之间可互相干扰,但是 STM32F4,由于有复用功能选择功能,可以让 PC11 仅连接到某个特定的外设,因此不存在互相干扰的情况。
$ M* S" k- j! H+ u6 o& U
$ c' t( S2 d* KGPIO 复用功能低位寄存器 (GPIOx_AFRL) (x = A…I)
& Y! g5 u% G* ~) _$ h# SGPIO alternate function low register2 @0 c* ]7 n. q; l' w+ d3 f
偏移地址:0x20
?( x6 u) y5 h# p6 C% k4 i2 h复位值:0x0000 00004 R/ t- x3 M2 R5 Q3 _
3 c4 `3 K9 e, T# Y9 n
' M5 [9 X3 M- T7 V
$ D/ ~$ l) N W4 ^: fGPIO 复用功能高位寄存器 (GPIOx_AFRH) (x = A…I)
# ^+ ` J' s5 E3 k+ m4 YGPIO alternate function high register _8 [% b2 `+ J3 \- d7 ^6 p
偏移地址:0x24
; L5 @6 e4 T3 Y! N复位值:0x0000 00005 F q, R" I9 ]. X( C8 a
/ L# T: F7 X+ M' b" n
. y1 E3 e6 C0 J' e5 R/ c$ N/ U- m, K3 |
在微控制器完成复位后,所有 IO 口都会连接到系统复用功能 0(AF0)。这里大家需要注意,对于系统复用功能 AF0,我们将 IO 口连接到 AF0 之后,还要根据所用功能进行配置:
7 r. Y( e8 E) {- |. h; r8 f' S: a. l: x9 c* K& j! d
JTAG/SWD:在器件复位之后,会将这些功能引脚指定为专用引脚。也就是说,这些引脚在复位后默认就是 JTAG/SWD 功能。如果我们要作为 GPIO 来使用,就需要对对应的 IO口复用器进行配置。6 x3 @$ }; s3 b
; f' I3 b" L* B- d' }4 KRTC_REFIN:此引脚在系统复位之后要使用的话要配置为浮空输入模式。
1 J' V) P9 I% D; s) S
5 i. y5 p' X/ J6 QMCO1 和 MCO2:这些引脚在系统复位之后要使用的话要配置为复用功能模式。
" v$ h& k: z& z9 [) V N9 `& m1 l( e: {9 w" n: y8 t& ]
03. 类型5 z3 V0 j4 n0 X
复用功能相关宏4 x4 P2 ^) R" ]# k5 f
# m9 f% F; X3 a7 t- /** 4 z3 f g, A( W6 n2 `3 [
- * @brief AF 0 selection
4 w4 G) c$ u) f# `( Q. I5 d; a) ~7 l - */
; O9 E# s7 j% \9 f+ C1 b. o8 U - #define GPIO_AF_RTC_50Hz ((uint8_t)0x00) /* RTC_50Hz Alternate Function mapping */7 h' }& Q& W8 }: V1 n' Y
- #define GPIO_AF_MCO ((uint8_t)0x00) /* MCO (MCO1 and MCO2) Alternate Function mapping */( w7 |4 B; d' c% q# D$ a- A
- #define GPIO_AF_TAMPER ((uint8_t)0x00) /* TAMPER (TAMPER_1 and TAMPER_2) Alternate Function mapping */& Z; u' B9 H2 u/ v9 i. |
- #define GPIO_AF_SWJ ((uint8_t)0x00) /* SWJ (SWD and JTAG) Alternate Function mapping */ W. _1 u: m6 e
- #define GPIO_AF_TRACE ((uint8_t)0x00) /* TRACE Alternate Function mapping */" V" D: n' ]3 M& u
- #if defined(STM32F446xx)
. B9 j+ J; y( J! y4 Q; ?: M - #define GPIO_AF0_TIM2 ((uint8_t)0x00) /* TIM2 Alternate Function mapping */
. g5 v Q7 l+ A" S - #endif /* STM32F446xx */; B2 j5 |8 K9 [# T
8 q$ W' a" {6 Q! I6 e- /**
1 \: A0 M9 E% c* h0 o9 G - * @brief AF 1 selection
) M% S) m, @2 O# W% l2 } - */
( g( |! H8 }" U: l$ D - #define GPIO_AF_TIM1 ((uint8_t)0x01) /* TIM1 Alternate Function mapping */ O+ L* R/ g4 S! L. P, u
- #define GPIO_AF_TIM2 ((uint8_t)0x01) /* TIM2 Alternate Function mapping */' Y5 D1 W) N& p4 {
- #if defined(STM32F410xx) || defined(STM32F413_423xx)9 ~ _7 ~# |4 g6 p
- #define GPIO_AF_LPTIM ((uint8_t)0x01) /* LPTIM Alternate Function mapping */
3 B4 o" H2 `2 P8 I! B' Q - #endif /* STM32F410xx || STM32F413_423xx */$ J* z8 e# U( J: |9 M- g5 \2 ? d0 b
- /** + h5 F5 |) o( C6 S/ Z
- * @brief AF 2 selection : k& X, z2 {' j
- */ ' c# t+ h% u/ p: r N; Q7 ]
- #define GPIO_AF_TIM3 ((uint8_t)0x02) /* TIM3 Alternate Function mapping */) N6 k' ~7 o; k8 ~/ v6 I6 J$ Y$ J, v
- #define GPIO_AF_TIM4 ((uint8_t)0x02) /* TIM4 Alternate Function mapping */& V( I4 Q+ i* ]* H; I5 H, M
- #define GPIO_AF_TIM5 ((uint8_t)0x02) /* TIM5 Alternate Function mapping */
& p' W( y; t6 T9 F
- `2 |7 M1 `* ?& N3 _5 a- /** " J0 C3 c A( H( Y% s0 L+ C
- * @brief AF 3 selection
4 H- j" g( a2 Z/ x! ]- q4 u - */
, t n" U/ L* s K# E! c6 P - #define GPIO_AF_TIM8 ((uint8_t)0x03) /* TIM8 Alternate Function mapping */
7 `! X2 s! S# S6 @% |+ _9 B/ {( [ - #define GPIO_AF_TIM9 ((uint8_t)0x03) /* TIM9 Alternate Function mapping */
+ F8 A8 N- E1 @$ j - #define GPIO_AF_TIM10 ((uint8_t)0x03) /* TIM10 Alternate Function mapping */
# w6 {0 I* i h }# {3 K6 Q! o - #define GPIO_AF_TIM11 ((uint8_t)0x03) /* TIM11 Alternate Function mapping */
+ a: ~! z0 S& D, ~3 f, ]0 v - #if defined(STM32F446xx)
0 \: H' @2 [* n - #define GPIO_AF3_CEC ((uint8_t)0x03) /* CEC Alternate Function mapping */1 ?: I( Z6 }- \ r& n6 ?+ L: ^0 g/ }
- #endif /* STM32F446xx */
% _7 x5 x; B( V+ Y' w% }# v - #if defined(STM32F413_423xx)
5 H! ~6 a9 N9 e, {, w0 x - #define GPIO_AF3_DFSDM2 ((uint8_t)0x03) /* DFSDM2 Alternate Function mapping */
% D. G4 B x( n! [ - #endif /* STM32F413_423xx */
9 k0 c( M; i8 m0 b3 @5 A8 z5 e, K0 P - /**
4 C7 N' j/ v5 F& J. f; \ - * @brief AF 4 selection * a% d* l( [$ l
- */ # [. ~3 H5 N( D! i* _0 g2 p4 n
- #define GPIO_AF_I2C1 ((uint8_t)0x04) /* I2C1 Alternate Function mapping */
5 F. n5 p7 q4 l5 t+ M - #define GPIO_AF_I2C2 ((uint8_t)0x04) /* I2C2 Alternate Function mapping */1 j$ S* W( L8 q: w
- #define GPIO_AF_I2C3 ((uint8_t)0x04) /* I2C3 Alternate Function mapping */% ~$ y! j: ~ K% j4 k& W
- #if defined(STM32F446xx)
9 y; S. H, n( S5 |* ~ - #define GPIO_AF4_CEC ((uint8_t)0x04) /* CEC Alternate Function mapping */# B# {' E8 `: ]. C
- #endif /* STM32F446xx */2 G+ u8 Z2 {- |2 N' G* s' O5 @& L
- #if defined(STM32F410xx) || defined(STM32F412xG) || defined(STM32F413_423xx) || defined(STM32F446xx)
6 I- i# g% C: u, G# C3 D - #define GPIO_AF_FMPI2C ((uint8_t)0x04) /* FMPI2C Alternate Function mapping */& I* I @" ~, b# Q/ o4 L8 }
- #endif /* STM32F410xx || STM32F446xx */8 c9 K/ l! ~% [) n0 V7 A
# P5 \7 ~' ~6 _% E8 C! L- /**
8 m/ C6 ^6 I, c4 J& l - * @brief AF 5 selection
4 X, ^$ o$ K' ~1 o - */
a" V* E+ P; Z$ k- r - #define GPIO_AF_SPI1 ((uint8_t)0x05) /* SPI1/I2S1 Alternate Function mapping */, c3 k7 C& g" k) U: [
- #define GPIO_AF_SPI2 ((uint8_t)0x05) /* SPI2/I2S2 Alternate Function mapping */4 m( W% C- n) c% y
- #define GPIO_AF5_SPI3 ((uint8_t)0x05) /* SPI3/I2S3 Alternate Function mapping (Only for STM32F411xE and STM32F413_423xx Devices) */
; q! z$ e( Y! A& j3 Q( C& n - #define GPIO_AF_SPI4 ((uint8_t)0x05) /* SPI4/I2S4 Alternate Function mapping */
I8 b( D+ T0 F* C( ?/ q - #define GPIO_AF_SPI5 ((uint8_t)0x05) /* SPI5 Alternate Function mapping */' s: V8 Y: M* I. p$ o" Y
- #define GPIO_AF_SPI6 ((uint8_t)0x05) /* SPI6 Alternate Function mapping */
8 N0 L. E6 Z6 }% A6 [
2 y7 U4 W/ T' {. X- /**
* s3 }- t) b8 ?7 u' l! i8 [ - * @brief AF 6 selection
- f. G& P2 {6 s. c9 F+ a - */ : p, ^. y6 T( {/ B; S* r5 B0 M
- #define GPIO_AF_SPI3 ((uint8_t)0x06) /* SPI3/I2S3 Alternate Function mapping */
; T- V7 x3 B) {! i - #define GPIO_AF6_SPI1 ((uint8_t)0x06) /* SPI1 Alternate Function mapping (Only for STM32F410xx Devices) */
$ s9 X. S" V+ u4 x' S - #define GPIO_AF6_SPI2 ((uint8_t)0x06) /* SPI2 Alternate Function mapping (Only for STM32F410xx/STM32F411xE Devices) */# Y7 K( ]) ?1 e
- #define GPIO_AF6_SPI4 ((uint8_t)0x06) /* SPI4 Alternate Function mapping (Only for STM32F411xE Devices) */
# X3 E3 h$ y/ r. [3 g! G0 ^ - #define GPIO_AF6_SPI5 ((uint8_t)0x06) /* SPI5 Alternate Function mapping (Only for STM32F410xx/STM32F411xE Devices) */
7 z2 X/ S* P7 o/ s - #define GPIO_AF_SAI1 ((uint8_t)0x06) /* SAI1 Alternate Function mapping */
. \! g! x; S6 U9 S9 d8 [# R - #define GPIO_AF_I2S2ext ((uint8_t)0x06) /* I2S2ext_SD Alternate Function mapping (only for STM32F412xG and STM32F413_423xx Devices) */
: T6 e5 W/ w8 G% J3 B/ j - #if defined(STM32F412xG) || defined(STM32F413_423xx), D5 }+ e8 ]. f) x" E! y
- #define GPIO_AF6_DFSDM1 ((uint8_t)0x06) /* DFSDM1 Alternate Function mapping */
5 H2 d& `/ \5 p! W* |9 H - #endif /* STM32F412xG || STM32F413_423xx */
. Y2 Z# E# \' c% ] - #if defined(STM32F413_423xx)
. r2 D' G0 s% i - #define GPIO_AF6_DFSDM2 ((uint8_t)0x06) /* DFSDM2 Alternate Function mapping */
- ?2 l: _; T. s z6 S - #endif /* STM32F413_423xx */3 z$ |! t+ j% Q6 _0 s3 Y( U
- 7 u t" Y8 u- u1 m( o+ N+ g
- /**
- G) @( x+ Z6 R* n' z m - * @brief AF 7 selection
. g; u, C$ P e' q - */
- Y3 H; E: j; V( [ - #define GPIO_AF_USART1 ((uint8_t)0x07) /* USART1 Alternate Function mapping */. d, `( |' {$ ^3 R. B2 f
- #define GPIO_AF_USART2 ((uint8_t)0x07) /* USART2 Alternate Function mapping */
- b2 H' _4 t/ d. J9 A j - #define GPIO_AF_USART3 ((uint8_t)0x07) /* USART3 Alternate Function mapping */0 m( |+ }; M; b4 L' m
- #define GPIO_AF7_SPI3 ((uint8_t)0x07) /* SPI3/I2S3ext Alternate Function mapping */7 [, i9 p+ S F! h8 D, b
- #if defined(STM32F413_423xx)
" c& h3 m- w. y: @% U' A - #define GPIO_AF7_DFSDM2 ((uint8_t)0x07) /* DFSDM2 Alternate Function mapping */
6 \: B% k: G& c) l. ?* L - #define GPIO_AF7_SAI1 ((uint8_t)0x07) /* SAI1 Alternate Function mapping */# Y+ w; j) N( ^. _$ v
- #endif /* STM32F413_423xx */
! ?) x& M2 p9 t' C- i2 {/ \) S
6 P) ^+ M. t1 S, q9 b- /** g8 |+ p' F! N f2 I
- * @brief AF 7 selection Legacy
' o$ p/ C& D+ m9 g9 g - */ 9 m& e, O& A" Y$ f
- #define GPIO_AF_I2S3ext GPIO_AF7_SPI3
7 \- a2 ~ o* X6 |% ]. A5 D8 L
2 j1 l0 T2 d2 V, H0 X: e- /** 9 g% d4 h6 D) \* ]$ D
- * @brief AF 8 selection 4 n! ?$ J5 b4 t
- */ $ ]3 b8 P* N9 `" ~; U: O* s1 Y
- #define GPIO_AF_UART4 ((uint8_t)0x08) /* UART4 Alternate Function mapping */
6 F U# W" L: C @8 Z! e& f - #define GPIO_AF_UART5 ((uint8_t)0x08) /* UART5 Alternate Function mapping */
8 W7 ~' j/ t$ K1 B - #define GPIO_AF_USART6 ((uint8_t)0x08) /* USART6 Alternate Function mapping */
5 R6 r/ K) h, C/ ^3 H - #define GPIO_AF_UART7 ((uint8_t)0x08) /* UART7 Alternate Function mapping */
" \+ x: ?- C6 R5 v( a8 I3 Z - #define GPIO_AF_UART8 ((uint8_t)0x08) /* UART8 Alternate Function mapping */
& l2 }5 e# v7 I0 N" g! `# v - #if defined(STM32F412xG) || defined(STM32F413_423xx)
5 a% P8 A/ U: G+ I - #define GPIO_AF8_USART3 ((uint8_t)0x08) /* USART3 Alternate Function mapping */ e* P# a7 x/ f: s$ p+ u+ Y* q7 }
- #define GPIO_AF8_DFSDM1 ((uint8_t)0x08) /* DFSDM Alternate Function mapping */5 @$ M4 h4 g- x A2 z4 E: n3 {. ^6 }
- #define GPIO_AF8_CAN1 ((uint8_t)0x08) /* CAN1 Alternate Function mapping */
/ d( X$ q; p E/ j& z0 \: \1 u - #endif /* STM32F412xG || STM32F413_423xx */ ?4 t4 E% y: X" ~
- #if defined(STM32F446xx)- O1 }1 J5 C/ p& o
- #define GPIO_AF8_SAI2 ((uint8_t)0x08) /* SAI2 Alternate Function mapping */" p( u7 |6 |9 }1 ?4 Q2 T1 L5 W5 [
- #define GPIO_AF_SPDIF ((uint8_t)0x08) /* SPDIF Alternate Function mapping */. ^1 t& q& ~8 r. n8 ~+ d% _ f
- #endif /* STM32F446xx */
! X* m2 v, x! [( h( k/ O - , L$ p9 w: k+ C W, |
- /** - ?: d, w1 V$ d+ |& A* Q
- * @brief AF 9 selection
8 f0 V5 N! Y% C& A. h+ g& q - */ ' y( y. H5 Y8 c% z! ` s- z! |1 G: U
- #define GPIO_AF_CAN1 ((uint8_t)0x09) /* CAN1 Alternate Function mapping */
) G9 S! ?' T" t3 g0 a/ K# C: g - #define GPIO_AF_CAN2 ((uint8_t)0x09) /* CAN2 Alternate Function mapping */2 o! i- H& b9 }6 ~
- #define GPIO_AF_TIM12 ((uint8_t)0x09) /* TIM12 Alternate Function mapping */
2 u, r% H$ Q' `* o - #define GPIO_AF_TIM13 ((uint8_t)0x09) /* TIM13 Alternate Function mapping */) W$ J5 R( g4 M! g) U4 g
- #define GPIO_AF_TIM14 ((uint8_t)0x09) /* TIM14 Alternate Function mapping */9 D$ W6 j% R. }
- #define GPIO_AF9_I2C2 ((uint8_t)0x09) /* I2C2 Alternate Function mapping (Only for STM32F401xx/STM32F410xx/STM32F411xE/STM32F412xG/STM32F413_423xx Devices) */' \ b" `% N* b) f2 X: T- o9 d
- #define GPIO_AF9_I2C3 ((uint8_t)0x09) /* I2C3 Alternate Function mapping (Only for STM32F401xx/STM32F411xE/STM32F412xG and STM32F413_423xx Devices) */9 \. Q' P4 B* |
- #if defined(STM32F446xx)8 n& G Q# r8 t. A! H6 l! V' i
- #define GPIO_AF9_SAI2 ((uint8_t)0x09) /* SAI2 Alternate Function mapping */: u5 F* X5 _5 R3 M* e
- #endif /* STM32F446xx */
' k2 ^# F+ Z% X7 h; ~ - #define GPIO_AF9_LTDC ((uint8_t)0x09) /* LTDC Alternate Function mapping */
5 _' ]4 i; F. z/ [ - #if defined(STM32F412xG) || defined(STM32F413_423xx) || defined(STM32F446xx) || defined(STM32F469_479xx), N9 Z" W' m K+ l
- #define GPIO_AF9_QUADSPI ((uint8_t)0x09) /* QuadSPI Alternate Function mapping */
' [3 T2 g- `( z6 O - #endif /* STM32F412xG || STM32F413_423xx || STM32F446xx || STM32F469_479xx */
7 \ w1 A' ~1 H3 B8 Y2 D - #if defined(STM32F410xx) || defined(STM32F412xG) || defined(STM32F413_423xx)) O& P) R# ^% A+ b
- #define GPIO_AF9_FMPI2C ((uint8_t)0x09) /* FMPI2C Alternate Function mapping (Only for STM32F410xx Devices) */2 b. C0 h% [, O# p! z6 F4 s
- #endif /* STM32F410xx || STM32F412xG || STM32F413_423xx */. a# B- I* f' W8 A4 k& m7 D8 l
- 9 X; l1 x" r d5 i; S6 S. R
- /**
% P" H9 c: E" ^4 ] c - * @brief AF 10 selection
+ L9 k4 |3 o7 |2 w9 T3 f! i% _ - */ 8 Q4 n" R! y0 x# ?* Y9 j# V
- #define GPIO_AF_OTG_FS ((uint8_t)0xA) /* OTG_FS Alternate Function mapping */7 q3 m3 l6 h( D P3 W
- #define GPIO_AF_OTG_HS ((uint8_t)0xA) /* OTG_HS Alternate Function mapping */0 ?) X- E: @$ w4 A0 ], N0 a; W
- #if defined(STM32F446xx)4 J+ s9 `: O f
- #define GPIO_AF10_SAI2 ((uint8_t)0x0A) /* SAI2 Alternate Function mapping */& ~4 |1 [! d: M; ~
- #endif /* STM32F446xx */' n* I. C. Q/ T) p8 r! F e
- #if defined(STM32F412xG) || defined(STM32F413_423xx) || defined(STM32F446xx) || defined(STM32F469_479xx)* r1 X+ h8 E8 L& ?; D
- #define GPIO_AF10_QUADSPI ((uint8_t)0x0A) /* QuadSPI Alternate Function mapping */
$ [" Z& H7 z; i1 E7 D: y - #endif /* STM32F412xG || STM32F413_423xx || STM32F446xx || STM32F469_479xx */
8 W; ^. l# d( ]8 z- X - #if defined(STM32F412xG) || defined(STM32F413_423xx); x! T4 j- S/ J4 Z: J3 k
- #define GPIO_AF10_FMC ((uint8_t)0xA) /* FMC Alternate Function mapping */, P" H) l F7 \* F7 B
- #define GPIO_AF10_DFSDM1 ((uint8_t)0xA) /* DFSDM Alternate Function mapping */6 `9 e. X! `# Z
- #endif /* STM32F412xG || STM32F413_423xx */
& B( ~* x" Y6 i% `+ [2 ] - #if defined(STM32F413_423xx)
1 w( A5 u6 N! Y6 D7 h0 k1 f - #define GPIO_AF10_DFSDM2 ((uint8_t)0x0A) /* DFSDM2 Alternate Function mapping */2 B6 s4 l5 R2 {. w8 ]
- #define GPIO_AF10_SAI1 ((uint8_t)0x0A) /* SAI1 Alternate Function mapping */$ ^5 i. ~ q$ E
- #endif /* STM32F413_423xx */! r; X7 _0 }. m1 X( X
- /**
$ q: ^, K8 i+ E5 u - * @brief AF 11 selection
- K1 i7 ]6 B" z1 b _ - */
. y5 [; k; D- X( L7 e% K - #define GPIO_AF_ETH ((uint8_t)0x0B) /* ETHERNET Alternate Function mapping */* ~0 c: x. V! J
- #if defined(STM32F413_423xx)
) h8 C% r$ a1 T- ]8 ? - #define GPIO_AF11_UART4 ((uint8_t)0x0B) /* UART4 Alternate Function mapping */
0 s; P k) k. `) ?' k - #define GPIO_AF11_UART5 ((uint8_t)0x0B) /* UART5 Alternate Function mapping */
* T/ }1 T5 h; Y+ j7 B& o - #define GPIO_AF11_UART9 ((uint8_t)0x0B) /* UART9 Alternate Function mapping */7 R% ^& J" J$ N2 m6 ~
- #define GPIO_AF11_UART10 ((uint8_t)0x0B) /* UART10 Alternate Function mapping */
6 q3 O7 o3 s, M& b: y# i* H; k - #define GPIO_AF11_CAN3 ((uint8_t)0x0B) /* CAN3 Alternate Function mapping */
+ d' R1 p3 ~6 l" l6 {, N - #endif /* STM32F413_423xx */8 s9 L: [- t# h8 u6 Q; T
- & h$ V4 C9 K! U. ^5 |% ?+ U3 A
- /**
' W0 V' b+ N& D - * @brief AF 12 selection
: V" ~' v) J0 W: ^ - */ , B' N1 i/ F* C
- #if defined(STM32F40_41xxx) || defined(STM32F412xG) || defined(STM32F413_423xx)1 d/ [6 d7 s* o: P0 O
- #define GPIO_AF_FSMC ((uint8_t)0xC) /* FSMC Alternate Function mapping */: O7 q; }+ I5 R5 _& [4 h1 A$ g
- #endif /* STM32F40_41xxx || STM32F412xG || STM32F413_423xx */) t3 G7 R/ c2 D- p: O z) v& t/ y
* c0 b2 F# b) K; K# n- #if defined(STM32F427_437xx) || defined(STM32F429_439xx) || defined(STM32F446xx) || defined(STM32F469_479xx)0 U9 `: _# b6 {
- #define GPIO_AF_FMC ((uint8_t)0xC) /* FMC Alternate Function mapping */, R7 ^3 T- z& Q
- #endif /* STM32F427_437xx || STM32F429_439xx || STM32F446xx || STM32F469_479xx */- d( g- U' J* g ]" N0 b& L U
) u6 A) M5 V/ ^) ]+ i- #define GPIO_AF_OTG_HS_FS ((uint8_t)0xC) /* OTG HS configured in FS, Alternate Function mapping */; b5 s; j" E3 F) Z
- #define GPIO_AF_SDIO ((uint8_t)0xC) /* SDIO Alternate Function mapping */
$ P* v# M0 ?/ z2 u - + F1 ]4 g# k- L5 U" c6 }9 E. K
- /** ( _0 N8 `9 v: r5 K6 y3 R$ r( y3 _7 W
- * @brief AF 13 selection
& u/ Z8 K Z, {/ Q - */
8 P8 P; n- T' V - #define GPIO_AF_DCMI ((uint8_t)0x0D) /* DCMI Alternate Function mapping */
" g( e( w M8 \ - #if defined(STM32F469_479xx)5 R7 l- ^9 j, I7 ^
- #define GPIO_AF_DSI ((uint8_t)0x0D) /* DSI Alternate Function mapping */
3 p% B9 h0 u% ], k - #endif /* STM32F469_479xx */# S* [' x5 G/ s+ |7 M5 z! ^
- /** ) N1 |9 Z- x2 s1 ?8 c# R1 X7 c
- * @brief AF 14 selection 4 @! c6 V3 `/ ^4 I' j$ k
- */
4 r8 u) s& a/ p3 T6 u/ k, K! X& T* ? - #define GPIO_AF_LTDC ((uint8_t)0x0E) /* LCD-TFT Alternate Function mapping */8 ^$ [! |7 T4 R) J
- #if defined(STM32F413_423xx)
# h' d. o# b* D/ L- d - #define GPIO_AF14_RNG ((uint8_t)0x0E) /* RNG Alternate Function mapping */
) [$ O' `/ S( |+ N" @ Z - #endif /* STM32F413_423xx */# V" R. f* d: X" r
" S |4 Y: W6 ~ _7 y8 Q3 C; H- /**
; M6 \" A6 M! i - * @brief AF 15 selection , f6 J& {7 Y& t& v8 g& I1 j1 {
- */
, z& y/ W5 f8 I - #define GPIO_AF_EVENTOUT ((uint8_t)0x0F) /* EVENTOUT Alternate Function mapping */% |. I$ @: Y: P) \
- 2 I1 O1 @% E$ A5 S% ?. \% O! i \
- #define IS_GPIO_AF(AF) (((AF) == GPIO_AF_RTC_50Hz) || ((AF) == GPIO_AF_TIM14) || \5 H7 {. X0 b& x1 n( U0 Y
- ((AF) == GPIO_AF_MCO) || ((AF) == GPIO_AF_TAMPER) || \$ o; u( ^% R' f1 W
- ((AF) == GPIO_AF_SWJ) || ((AF) == GPIO_AF_TRACE) || \: T/ a0 Q) M9 m4 j! n- k
- ((AF) == GPIO_AF_TIM1) || ((AF) == GPIO_AF_TIM2) || \. l- y; z: Z! E5 Y/ i# k+ ~' b
- ((AF) == GPIO_AF_TIM3) || ((AF) == GPIO_AF_TIM4) || \' s# y0 ]. B) n p
- ((AF) == GPIO_AF_TIM5) || ((AF) == GPIO_AF_TIM8) || \5 b1 B) {9 N! k5 h x
- ((AF) == GPIO_AF_I2C1) || ((AF) == GPIO_AF_I2C2) || \
& Y1 h0 }' N! c9 T - ((AF) == GPIO_AF_I2C3) || ((AF) == GPIO_AF_SPI1) || \
9 h- @8 y- r; t& D5 z - ((AF) == GPIO_AF_SPI2) || ((AF) == GPIO_AF_TIM13) || \" q1 |0 k8 }0 Q5 C" W; n7 B& j( _
- ((AF) == GPIO_AF_SPI3) || ((AF) == GPIO_AF_TIM14) || \! b( S; t8 A# V K* L
- ((AF) == GPIO_AF_USART1) || ((AF) == GPIO_AF_USART2) || \
: }0 x% m- G p% f - ((AF) == GPIO_AF_USART3) || ((AF) == GPIO_AF_UART4) || \( V1 M3 p9 C: C1 r4 h
- ((AF) == GPIO_AF_UART5) || ((AF) == GPIO_AF_USART6) || \
) ^! I1 l) b4 R* | - ((AF) == GPIO_AF_CAN1) || ((AF) == GPIO_AF_CAN2) || \# g8 z! I/ k1 S- a; L+ q# U- H
- ((AF) == GPIO_AF_OTG_FS) || ((AF) == GPIO_AF_OTG_HS) || \3 \" h7 C4 w$ K3 `; x# T5 E( I9 p4 E6 B
- ((AF) == GPIO_AF_ETH) || ((AF) == GPIO_AF_OTG_HS_FS) || \
$ `0 \' t4 S R& g; G) { - ((AF) == GPIO_AF_SDIO) || ((AF) == GPIO_AF_DCMI) || \
1 w7 z) R6 y6 z6 k/ i# ] - ((AF) == GPIO_AF_EVENTOUT) || ((AF) == GPIO_AF_FSMC))5 d" G+ W; B" ]- r) P
- #endif /* STM32F40_41xxx */
复制代码
, X/ p& R0 h% ]+ ^04. 函数 O2 }0 x" H7 v7 i Z l
GPIO复用功能函数6 @: W* `, f# w" A2 c' c. C# g
# i" C4 @1 P0 z3 [7 ~$ P# y- /* GPIO Alternate functions configuration function ****************************/
6 a6 |! a1 D" u8 q - void GPIO_PinAFConfig(GPIO_TypeDef* GPIOx, uint16_t GPIO_PinSource, uint8_t GPIO_AF);
复制代码
1 _" r9 `; P* @* d05. 参考示例6 B/ s8 M5 d6 b+ g! w
串口配置
0 Y; W8 \( W7 i6 i- K9 ~7 M/ o
B% a8 v6 B4 m$ E+ {; [# P- /*GPIOA9 与 GPIOA10 初始化*/
6 J# g5 ]: @) I - GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10;
2 \& n: H9 y( @& N6 _# j - GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;// 复用功能
# e$ T L2 @/ q- s2 [7 z - GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//速度 50MHz& z' f( k, T$ d) S
- GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推挽复用输出2 H& {' r3 N. `
- GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; //上拉
7 _$ x* I4 M6 g0 o9 v3 s - GPIO_Init(GPIOA,&GPIO_InitStructure); //初始化 PA9,PA10
4 V0 S' g" K. ^7 z - : c) \$ t% s) @8 k
- /*PA9 连接 AF7,复用为 USART1_TX */& r9 C3 S6 J; m9 t# r5 v
- GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_USART1);
3 N8 m i0 h* P: `+ a - /* PA10 连接 AF7,复用为 USART1_RX*/
: M2 P) p, w) m$ x' K( {; p - GPIO_PinAFConfig(GPIOA,GPIO_PinSource10,GPIO_AF_USART1);
复制代码
" N8 E6 ^3 k, W6 Y6 @; m- y8 r3 z( f& w3 [! m
~) v0 u+ J( U* J; q$ M; X* x X. n |