一、引脚重映射的定义
引脚重映射是STM32 等单片机的一种外设功能配置机制 ,简单来说:单片机出厂时,外设(如串口、SPI、定时器、ADC 等)的功能引脚是默认分配 在芯片的固定引脚的;通过引脚重映射,可以把这些外设的功能引脚,转移到芯片的其他备选引脚上。
它的核心目的是 提升硬件设计的灵活性,比如:
- 避免默认引脚与其他硬件(如传感器、显示屏)的引脚冲突;
- 优化 PCB 布线,减少交叉走线,降低电磁干扰;
- 同一个外设可以切换到不同引脚,适配不同的硬件布局。
举个例子:STM32F103 的串口 1(USART1)默认引脚是 PA9(TX)、PA10(RX) ,通过重映射可以转移到 PB6(TX)、PB7(RX)。
二、引脚重映射的分类(以 STM32 为例)
STM32 的引脚重映射分为两类,配置难度和功能范围不同:
- 部分重映射外设的部分引脚被重新映射,另一部分仍使用默认引脚。
- 完全重映射外设的所有功能引脚都被转移到备选引脚,完全不使用默认引脚。
三、引脚重映射的使用步骤(以 STM32F103 + Keil5 为例)
使用引脚重映射的核心是 配置复用功能时钟 + 配置 GPIO + 配置重映射寄存器 ,下面以USART1 完全重映射(PB6/TX、PB7/RX) 为例,给出步骤化代码实现。
1. 开启相关时钟
需要开启 GPIO 时钟 、外设时钟 和 复用功能时钟(关键!很多人会遗漏)。
c
运行
#include "stm32f10x.h"
void USART1_Remap_Init(void)
{
// 1. 开启时钟:GPIOB时钟 + USART1时钟 + AFIO复用功能时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_USART1 | RCC_APB2Periph_AFIO, ENABLE);
}
AFIO(Alternate Function I/O)是 STM32 的复用功能管理模块,必须开启其时钟才能配置重映射。
2. 配置 GPIO 为复用推挽输出 / 浮空输入
重映射后的引脚需要配置为 复用功能模式,不能配置为普通 GPIO 模式:
- 串口 TX 引脚:复用推挽输出(GPIO_Mode_AF_PP)
- 串口 RX 引脚:浮空输入(GPIO_Mode_IN_FLOATING)
c
运行
void USART1_Remap_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
// 步骤1:开启时钟(同上)
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_USART1 | RCC_APB2Periph_AFIO, ENABLE);
// 步骤2:配置PB6(TX)为复用推挽输出
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; // 复用推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
// 配置PB7(RX)为浮空输入
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; // 浮空输入
GPIO_Init(GPIOB, &GPIO_InitStructure);
}
3. 配置引脚重映射(关键步骤)
通过 GPIO_PinRemapConfig() 函数配置重映射模式,函数原型:
c
运行
void GPIO_PinRemapConfig(uint32_t GPIO_Remap, FunctionalState NewState);
GPIO_Remap:重映射类型(查手册选择对应宏定义)NewState:ENABLE(开启重映射)/ DISABLE(关闭重映射)
对于 USART1 完全重映射,对应的宏定义是 GPIO_Remap_USART1,添加配置:
c
运行
void USART1_Remap_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
// 步骤1:开启时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_USART1 | RCC_APB2Periph_AFIO, ENABLE);
// 步骤2:配置GPIO
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOB, &GPIO_InitStructure);
// 步骤3:开启USART1完全重映射
GPIO_PinRemapConfig(GPIO_Remap_USART1, ENABLE);
}
4. 配置外设功能(以 USART1 初始化为例)
重映射只是改变引脚,外设本身的功能配置(如波特率、数据位、停止位)仍需正常配置:
c
运行
void USART1_Remap_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
// 步骤1:开启时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_USART1 | RCC_APB2Periph_AFIO, ENABLE);
// 步骤2:配置GPIO
// ...(同上,省略)
// 步骤3:开启重映射
GPIO_PinRemapConfig(GPIO_Remap_USART1, ENABLE);
// 步骤4:配置USART1参数
USART_InitStructure.USART_BaudRate = 9600; // 波特率
USART_InitStructure.USART_WordLength = USART_WordLength_8b; // 8位数据位
USART_InitStructure.USART_StopBits = USART_StopBits_1; // 1位停止位
USART_InitStructure.USART_Parity = USART_Parity_No; // 无校验
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; // 无硬件流控
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; // 收发模式
USART_Init(USART1, &USART_InitStructure);
// 步骤5:使能USART1
USART_Cmd(USART1, ENABLE);
}
四、使用注意事项
- 查手册确认重映射引脚 不同型号的 STM32(如 F1、F4、H7)的重映射引脚不同,必须查阅对应芯片的《数据手册》 ,比如:
- STM32F103 的 USART1 重映射引脚是 PB6/PB7;
- STM32F407 的 USART1 重映射引脚可能是 PA9/PA10 或 PB6/PB7。
- 必须开启 AFIO 时钟复用功能时钟(AFIO)是配置重映射的前提,遗漏会导致重映射失效。
- GPIO 模式必须配置为复用功能 重映射后的引脚不能用
GPIO_Mode_Out_PP或GPIO_Mode_IPU,否则外设功能无法正常工作。 - 部分重映射可能需要屏蔽默认引脚对于部分重映射,默认引脚可能会处于悬空状态,可根据需求配置为下拉输入,避免干扰。
五、常见应用场景
- PCB 布线优化:默认引脚位置不利于布线时,重映射到更合适的引脚;
- 引脚冲突解决:默认引脚被其他外设(如 LED、按键)占用时,切换到备选引脚;
- 功能扩展:同一个外设切换不同引脚,实现 "一个外设,多个接口" 的灵活设计。