我们先来看什么是复用功能?
我们在《stm32f103rc_datasheet.pdf》中可以看到对I/O口的功能描述表格
比如:PC10 I/O口,UART4_TX与SDIO_D2功能都是PC10 I/O口的复用功能。也就是说,PC10 I/O口不仅仅只能进行由内核控制的输入/输出功能,还可以进行由片上外设控制的UART4_TX与SDIO_D2功能。注意:UART4_TX与SDIO_D2功能是来自不同模块的功能。
当我们使用复用功能UART4_TX时,那么PC10 I/O口就由UART外设模块控制,此时PC10 I/O口输入/输出的数据就都来自于UART外设模块了,而不是来自于内核或者其他外设模块。
注意:下图中BGA144、BGA100、LQFP144,表示该表引脚功能还可以适用于BGA144、BGA100、LQFP144封装的芯片。
什么是端口重映射?
1、复用功能:片内外设(如:I^2C UART ADC等)是与I/O口共用引出管脚(不同的功能对应同一管脚)stm32所有内置外设的外部引脚都是与标准GPIO引脚复用的,如果有多个复用功能模块对应同一个引脚,只能使能其中之一,其它模块保持非使能状态。
2、重映射功能:复用功能的引出脚可以通过重映射,从不同的I/O管脚引出,即复用功能的引出脚位是可通过程序改变到其他的引脚上!
实际上就是:
如红框中的PD12引脚,它规定这个引脚所占用的复用功能为TIM4_CH1和UART3。
假设现在,PD12 I/O口被设备1所占用。那么如果此时我想使用UART3功能,我只能使用PD12端口的复用功能,但是PD12端口已经被设备1占用了,那么就无法使用UART3功能了。
所以,为了使资源被更加全面的使用,芯片厂家就开发出UART3还可以被其他端口使用的方法,如下图:
当PD12端口被占用的时候,我们还可以通过PB10端口来使用UART3功能。这就是重映射。(注意:一个功能不能被两个端口同时使用)
当我们将UART3功能重映射到PB10端口上面时,就会阻断UART3功能与PD12的连接,此时PD12就不能再使用UART3功能了:
我们还可以看到,TIM3_CH1、TIM3_CH2、TIM3_CH2分别是PA6、PA7、PB0端口的复用功能。
现在我们看到,TIM3_CH1、TIM3_CH2、TIM3_CH2功能还可以经过重映射,映射到PC6、PC7、PC8端口上,由PC6、PC7、PC8端口来使用这些功能。注意:在进行重映射后,原先的PA6、PA7、PB0端口就不能使用TIM3_CH1、TIM3_CH2、TIM3_CH2功能了。
由参考手册——通用和复用功能I/O章节知道,没有重映射的时候,UART3_CK为PB12引脚的复用功能。我们如果使用部分重映射,将UART3_CK重映射到PC12引脚,这样就可以通过PC12来使用UART3_CK功能了。我们还可以使用完全重映射,通过PD10引脚来使用UART3_CK功能。
部分重映射:由图知,如果我们选择部分重映射,那么对于UART3功能的PB端口,有一部分UART3功能可以映射到PC端口上面,另外一部分还是在PB端口上。
完全重映射:如果我们选择完全重映射,对于UART3功能的PB端口,UART3功能全部都映射PD端口上面去。