目录
STM32的端口引脚的复用功能及重映射功能解析
复用功能
首先、我们可以这样去理解stm32引脚的复用功能。以stm32F103RCT6芯片引脚PA9、PA10为例。 这两个芯片引脚定义如下: PA9引脚: PA9/USART1_TX/TIM1_CH2 PA10引脚:PA10/USART1_RX/TIM1_CH3 1、这里的PA9引脚和PA10引脚我们可以理解为引脚名,用于区分两个不同的引脚。 2、可以看到PA9引脚、PA10引脚都有三种功能。其中第一项PA9和PA10是其默认功能,默认功能为GPIO功能,也即是作为通用的输入输出端口使用。 3、这样我们就知道,当PA9引脚和PA10引脚不在作为默认的GPIO功能使用,而是作为USART1_TX/USART1_RX或者作为TIM1_CH2/TIM1_CH3功能使用时,就是对PA9引脚和PA10引脚的复用。 4、总而言之,对于stm32来说,由于其内部各种外设的存在,往往每个引脚都会有几种不同的功能,这几种不同的功能都可以使用这一个端口引脚。但是由于stm32的端口引脚都有一个自己的默认功能存在,当该引脚不在作为默认功能使用时对于该引脚来说就是复用。由于大多数引脚的默认功能和其引脚名称PA9引脚或者PA10引脚一样都是作为GPIO功能使用,因此当不在作为GPIO功能而是作为其他外设的相关功能使用时就是对引脚的复用。
复用功能的初始化
通过前面的分析我们可以知道,在使用stm32的引脚复用功能时,最少要使能2个时钟。 1、无论引脚使用哪种功能,总之是要使用引脚的,因此要使能对应的GPIO组的端口时钟。 例如,对于复用为串口1的PA9、PA10引脚来说需要使能PA组端口的时钟。 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); 2、由于引脚不在作为默认功能,而是复用为其他外设的相关功能使用,因此还需要使能对应外设的时钟。 对于复用为串口1的PA9、PA10引脚来说还需要使能外设USART1的时钟。 RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE); 3、复用后的引脚的功能配置及对应外设功能的初始化。以PA9、PA10引脚为例: 3.1 复用后的引脚功能配置 //PA9引脚复用为USART1_TX功能,复用后的引脚配置为复用推挽输出模式 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_Init(GPIOA, &GPIO_InitStructure); //PA10引脚复用为USART1_RX功能,复用后的引脚配置为浮空输入模式 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOA, &GPIO_InitStructure); 3.2 复用后的外设功能初始化 //这里初始化串口的各种功能
重映射功能
为了让工程师能够更好的安排布局及方便布线,在stm32中引入了外设引脚的重映射功能。即一个外设的引脚除了具有默认的引脚外还可以通过配置重映射寄存器的方式将这个外设的引脚映射到其他的引脚上去。 同样的以PA9引脚和PA10引脚为例,对于stm32F103RCT6芯片来说,有如下引脚定义: PA9引脚: PA9/USART1_TX/TIM1_CH2 PA10引脚:PA10/USART1_RX/TIM1_CH3 PB6引脚: PB6/I2C1_SCL/TIM4_CH1/USART1_TX PB7引脚: PB7/I2C1_SDA/FSMC_NADV/TIM4_CH2/USART1_RX
1、首先、我们要明确一点,重映射的概念是对于芯片的各种外设本身来说的而非GPIO。因为引脚作为GPIO功能使用时一般是其默认的功能,而重映射的概念是建立在对引脚的复用功能上的。也即是当引脚复用为非GPIO功能时才可能会使用到重映射的功能。 2、USART1_REMAP=0表示没有使用重映射功能的情况;USART1_REMAP=1则表示使用重映射功能的情况。 3、从上面表中可以看到,默认情况下(没有使用重映射),USART1的TX和RX引脚默认使用的就是PA9引脚和PA10引脚。 4、在开启重映射功能时,USART1的TX和RX引脚还可以重映射到PB6和PB7引脚上去。
重映射功能的初始化
在使用重映射功能时,除了需要使能复用功能的GPIO组的端口时钟和对应的外设时钟外我们还需要使能AFIO功能时钟。 例如当开启串口1的重映射时: 1、使能PB组端口时钟: RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); 2、使能串口1外设时钟: RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE); 3、使能AFIO功能时钟: RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); 4、开启重映射功能 GPIO_PinRemapConfig(GPIO_Remap_USART1, ENABLE); 5、之后就是对重映射后的引脚的功能配置及对应外设功能的初始化。
复用功能和重映射的区别
通过以上对于复用功能和重映射功能的分析我们可以知道: 复用功能和重映射最大的区别就在于引脚复用功能是对于单个引脚来说的。比如同一个引脚既可以作为GPIO功能又可以作为其他外设功能使用。而重映射功能往往是对于芯片内部外设的一组引脚或者某些引脚来说的。例如USART1的发送功能引脚和接收功能引脚既可以使用PA9、PA10引脚又可以使用PB6和PB7引脚。
部分重映射与完全重映射
通过前面对于重映射功能的分析,我们理解部分重映射及完全重映射将不再困难。 从字面意思也容易知道,部分重映射就是把一部分的功能引脚重映射为其他的引脚而另外一部分引脚仍然使用默认的引脚。 完全重映射就是把所有的功能引脚全部重映射到其他的引脚上。 如下图是USART3外设的重映射功能引脚对应情况:
通过表中的信息我们可以知道: 1、对于USART3的五个功能引脚来说,默认使用的五个引脚为PB10-PB14这5个引脚。 2、部分重映射时,原来默认使用的PB10、PB11、PB12三个功能引脚将重映射到引脚PC10、PC11和PC12上。而PB13和PB14仍然使用原来的默认引脚。 3、完全重映射就是将原来默认使用的PB10、PB11、PB12、PB13、PB14五个功能引脚全部重映射到引脚PD8、PD9、PD10、PD11和PD12上去。 4、以USART3为例,部分重映射时,我们需要使用的接口函数为: GPIO_PinRemapConfig(GPIO_PartialRemap_USART3, ENABLE); 5、以USART3为例,全部重映射时,我们需要使用的接口函数为: GPIO_PinRemapConfig(GPIO_FullRemap_USART3, ENABLE);
补充
重映射的配置函数: void GPIO_PinRemapConfig(uint32_t GPIO_Remap, FunctionalState NewState) 1、对于有些外设只有一种重映射时,例如前面的USART1时,第一个参数GPIO_Remap只需要设置为:GPIO_Remap_USART1即可。 2、对于有些外设有两种重映射时,例如前面的USART3时,第一个参数GPIO_Remap可以根据情况设置为: 部分重映射:GPIO_PartialRemap_USART3 完全重映射:GPIO_FullRemap_USART3
完结。。。