
端口复用功能 STM32 有很多的内置外设(比如:串口、ADC、DAC等是独立的模块和内核连接在一起),这些外设的外部引脚都是与 GPIO 复用的。也就是说,一个 GPIO如果可以复用为内置外设的功能引脚,那么当这个 GPIO 作为内置外设使用的时候,就叫做复用。! Z8 @9 c8 A& |$ Z" v9 k' u6 c1 b/ ] 大家都知道,MCU 都有串口,STM32 有好几个串口。比如说 STM32F103ZET6 有 5 个串口,我们可以查手册知道,串口 1 的引脚对应的 IO 为 PA9,PA10.PA9,PA10 默认功能是 GPIO,所以当PA9,PA10 引脚作为串口 1 的 TX,RX 引脚使用的时候,那就是端口复用。查看芯片资料可知道那些口是复用端口。" ?8 a2 d' J0 }9 s# e0 s2 D, O4 J 4 S3 Q+ s' i# c& ^, r 复用端口初始化有几个步骤:8 Z+ t6 r- D2 L" n! ? 8 i8 g* u/ x1 d: k$ _ + s) m1 w" N+ c0 n8 \; W GPIO 端口时钟使能。要使用到端口复用,当然要使能端口的时钟了。/ S& V5 n9 h+ ]5 }& L
复用的外设时钟使能。比如你要将端口 PA9,PA10 复用为串口,所以要使能串口时钟。
端口模式配置。 在 IO 复用为内置外设功能引脚的时候,必须设置 GPIO 端口的模式,至于 在复用功能下 GPIO 的模式是怎么对应的,这个可以查看手册《STM32 中文参考手册 V10》 P110 的表格“8.1.11 外设的 GPIO 配置”。这里我们拿 Usart1 举例: B+ c- `6 N$ r y' P' _$ @; ] 5 t0 J1 [5 S4 I 1 x9 _& E+ L# g3 O, U ![]() $ E6 v- t* g( x6 E9 [" [ ; a$ v) D u; h' @6 U/ } 从表格中可以看出,我们要配置全双工的串口 1,那么 TX 管脚需要配置为推挽复用输出,RX 管脚配置为浮空输入或者带上拉输入。' X. r( ?3 l' \- [( z 代码如下:
我们在使用复用功能的是时候,最少要使能 2 个时钟: GPIO 时钟使能 复用的外设时钟使能同时要初始化 GPIO 以及复用外设功能" [8 p; w+ m& u6 \/ N( U 0 P: y! @9 [ r' N! t$ C# n 端口重映射2 O: t, l3 r6 k' \0 L5 |# H# I9 l 为了使不同器件封装的外设 IO 功能数量达到最优,可以把一些复用功能重新映射到其他一些引脚上。STM32 中有很多内置外设的输入输出引脚都具有重映射(remap)的功能。我们知道每个内置外设都有若干个输入输出引脚,一般这些引脚的输出端口都是固定不变的,为了让设计工程师可以更好地安排引脚的走向和功能,在 STM32 中引入了外设引脚重映射的概念,即一个外设的引脚除了具有默认的端口外,还可以通过设置重映射寄存器的方式,把这个外设的引脚映射到其它的端口。 简单的讲就是把管脚的外设功能映射到另一个管脚,但不是可以随便映射的,具体对应关系《STM32 中文参考手册 V10》的 P116 页“8.3 复用功能和调试配置”有讲解。这里我们同样拿串口 1 为例来讲解。" Y* v( R5 X5 ^: y+ a: F: s 4 M! S. _+ A }9 Y) ~6 O j 5 Q3 Q$ Z# ^/ N+ S ![]() ; O. P% I5 Y$ J6 W6 p& d- N 上图是截取的中文参考手册中的重映射表,从表中可以看出,默认情况下,串口 1 复用的时候的引脚位 PA9,PA10,同时我们可以将 TX 和 RX 重新映射到管脚 PB6 和 PB7 上面去。 所以重映射我们同样要使能复用功能的时候讲解的 2 个时钟外,还要使能 AFIO 功能时钟,然后要调用重映射函数。详细步骤为: ! h: Y- c, k; B% S' Q% J- k! |5 a 使能 GPIOB 时钟:
使能串口 1 时钟:
使能 AFIO 时钟:
PS: 在对寄存器AFIO_MARR,AFIO_EXTICRX和AFIO_EVCP进行读写操作前,应首先打开AFIO时钟。- c2 h8 r- p k5 p 1、 AFIO_MARR:配置复用功能映射" y' t% w- d. |+ I# R: E' C 2、 AFIO_EXTICRX:配置外部中断线映射* T0 W5 l+ z7 Z2 _5 I/ F/ y/ k/ [ 3、 AFIO_EVCP:配置EVENTOUT事件输出4 B- `3 O7 C a5 P0 ? ( n( f3 n. y4 s- F2 }8 a5 W 开启重映射:
这样就将串口的 TX 和 RX 重映射到管脚 PB6 和 PB7 上面了。至于有哪些功能可以重映射,大家除了查看中文参考手册之外,还可以从 GPIO_PinRemapConfig 函数入手查看第一个入口参数的取值范围可以得知。在stm32f10x_gpio.h 文件中定义了取值范围为下面宏定义的标识符,这里我们贴一小部分:$ w' z7 ^( V4 p
从上面可以看出,USART1 只有一种重映射,而对于 USART3,存在部分重映射和完全重映射。所谓部分重映射就是部分管脚和默认的是一样的,而部分管脚是重新映射到其他管脚。而完全重映射就是所有管脚都重新映射到其他管脚。看看手册中的 USART3 重映射表: 8 @! {- }* j. U5 n& a& C0 |) B( C 4 B5 O$ r# A, H+ i ![]() ! x% h Z* ^- B0 f+ T) ]. ] 部分重映射就是 PB10,PB11,PB12 重映射到 PC10,PC11,PC12 上。而 PB13 和 PB14 和没有重映射情况是一样的,都是 USART3_CTS 和 USART3_RTS 对应管脚。完全重映射就是将这两个脚重新映射到 PD11 和 PD12 上去。我们要使用 USART3 的部分重映射,我们调用函数方法为:
———————————————— 版权声明:FHNCSDN 如有侵权请联系删除, F. c) `+ R2 v+ }' {6 r" I / Z1 p6 m R5 X7 C) B7 T: J) F # q* F: Q) q' ?' s* M* F |