STM32F103ZET6 — 端口Remap

准备在 STM32F103ZET6 玩高级定时器 TIM1 / TIM8 的时候,突然发现一些端口复用的问题:

TIM1 的管脚如下所示:

STM32F103ZET6 — 端口Remap_第1张图片

USART2 的管脚如下:


而重映射寄存器 AFIO 的默认值是 0x0000 0000

这就代表了上述的 PA9, PA10同时被USART2 和 TIM1 使用了,这让我很是纠结,到底这几个管脚是什么功能,如何进行配置。

在网上找到一些相关的说明,不敢独享,赶紧贴出来先:

为了节省IO资源单片机会在一个IO上复用很多功能,一般的单片机用到 一个功能后就能再用两外复用的功能了,这就体现出了STM32 GPIO的强大功能了,我们用重映射的方法把其中一个外设映射到其他IO脚上,这样就可以充分利用片内资源!


1. 不是使用了 IO 复用,就一定要开启 AFIO 的时钟,这是个误区。

最常用的USART1,如果你的板子上,默认用的就是PA9和PA10这两个IO作为USART1的TX和TX,那么也就是没有重映射,No Remap,这种情况下根本不需要开启AFIO时钟,只要开启USART1的外设时钟就行了。这个实验很简单,自己试试就知道了

2. STM32中,USART2的CTS、RTS、TX、RX和TIM2的CH1~CH4都在PA0~PA3上面,具体要如何选择这两个功能呢?

如果要使用USART2,就开始USART2的外设时钟,如果要使用TIM2,就开启TIM2的外设时钟,如果你同时开启,我也不知道会怎么样,你可以自己试试,我觉得应该是两个都不能用。如果你一定要在PA0~PA3上使用这两个功能,只能是时分复用。

正确的同时使用USART2和TIM2,应该是使用上面提到的AFIO_Remap寄存器,将其中的一个重映射到其他IO上去,当然这样其他IO的本身的复用功能你就不能开启了。


如果你不做Remap,你根本不可能同时在PA0~PA3上同时使用这两个外设,现在你的方案有两种:

一、保留USART2在PA口上,将TIM2完全重映射(Full Remap)到其他IO上,或者,如果你不用RTS和CTS的硬件流控制,PA0(CTS)和PA1(RTS)上对应的CH1和CH2是可以不用重映射的,只需要将Bit9:8改成10,也就是将CH3和CH4部分重映射到PB10和PB11上去,而CH1和CH2继续保留在PA0和PA1上。但这种情况下,PB10和PB11上的I2C2和USART3就不能用了。

二、保留TIM2在PA口,将USART2重映射到PD口上,很明显,当TIM2完全不重映射时,USART2必须的信号线只有Clock不受影响,这种情况下也没有部分映射可言了,必须将USART2完全重映射到PD3~PD7上,同样的,这种情况下FSMC就不能用了。


重映射的配置步骤

1.打开重映射时钟和USART重映射后的I/O口引脚时钟

比如:

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO,ENABLE);

2.I/O口重映射开启:

比如:

GPIO_PinRemapConfig(GPIO_Remap_USART1,ENABLE);

3. 配制重映射引脚, 这里只需配置重映射后的I/O,原来的不需要去配置.(不同功能的引脚,参考不同的引脚配置方法)

比如:

STM32F103ZET6 — 端口Remap_第2张图片

等等表格,

代码比如:

    // PA9 As TXD
    stGpioInit.GPIO_Pin = GPIO_Pin_9;
    stGpioInit.GPIO_Speed = GPIO_Speed_50MHz;
    stGpioInit.GPIO_Mode = GPIO_Mode_AF_PP; 
    GPIO_Init(GPIOA, &stGpioInit);
   
    // PA10 As RXD
    stGpioInit.GPIO_Pin = GPIO_Pin_10;
    stGpioInit.GPIO_Mode = GPIO_Mode_IN_FLOATING;
    GPIO_Init(GPIOA, &stGpioInit);

你可能感兴趣的:(MCU)