STM32端口复用和重映射

一 端口复用
STM32有很多内置资源,但是其IO口的数量是固定的,普通IO口在充当GPIO口的同时,还需要成为内置资源的外设引脚,那么如何才能物尽其用呢?于是STM32给出了解决方案:“端口复用”,什么是端口复用呢?当GPIO作为外设引脚使用时即为端口复用。
MCU都有串口功能,根据《STM32中文参考手册》查询得到USART1_TX引脚复用对应PIN口为PA9,USART1_RX引脚复用对应PIN口为PA10,原本PA9与PA10引脚都为普通IO口使用,而我们现在将其使用为串口IO来使用,这个过程就是端口复用。
STM32端口复用和重映射
端口复用有几大步骤:

  1. 使能GPIO端口时钟,RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
  2. 复用外设时钟使能,RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);使用哪一个外设就使能哪一个外设。
  3. 端口模式配置,使用外设,就必须对外设IO口进行配置,具体如何配置请查询《STM32中文参考手册》,我们将USART配置全部配置为全双工模式,然后USART1_TX配置为推挽复用输出,USART1_RX配置为浮空输入或带上拉输入。
    STM32端口复用和重映射
    代码展示:
//USART1_TX PA9 复用推挽输出
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //PA.9
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出
GPIO_Init(GPIOA, &GPIO_InitStructure);
//USART1_RX PA10 浮空输入
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;//PA10
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入
GPIO_Init(GPIOA, &GPIO_InitStructure);``

代码解释:首先GPIO_InitStructure为结构体,它的变量有3个,分别是GPIO_InitStructure.GPIO_Pin(确定PIN口),GPIO_InitStructure.GPIO_Speed(确定端口速度),GPIO_InitStructure.GPIO_Mode(确定端口模式),最后GPIO_Init(GPIOA, &GPIO_InitStructure);写入GPIOB组,然后GPIO_InitStructure结构体通过与运算写入GPIO_Init中。
二 端口重映射
通常端口重映射都是为了更好地布线而开发出的一款功能,这个功能对于硬件工程师来说更加友好,因为硬件工程师在设计电路图时要考虑很多因素,要尽量避免跳线情况的发生,而有些时候这种情况不可避免,那怎么办呢,于是软件工程师想到了使用端口重映射寄存器将这个外设的引脚映射到其它的端口。简单的讲就是把管脚的外设功能映射到另一个管脚,但不是可以随便映射的,具体对应关系参考《STM32 中文参考手册 V10》的 P116 页“8.3 复用功能和调试配置”。我们还是以USART1来配置,首先图片上的REMAP=0是默认情况的端口复用功能,而REMAP=1则是端口重映射,图片显示我们要把USART1_TX重映射到PB6上,USART1_RX重映射到PB7上。
STM32端口复用和重映射
代码解释:

  1. 使能 GPIOB 时钟: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);:
    AFIO寄存器为复用重映射和调试I/O配置寄存器,其中端口重映射与端口复用函数大差不差,在此不再叙述。
    STM32端口复用和重映射