引脚重映射是什么意思?如何使用?

一、引脚重映射的定义

引脚重映射是STM32 等单片机的一种外设功能配置机制 ,简单来说:单片机出厂时,外设(如串口、SPI、定时器、ADC 等)的功能引脚是默认分配 在芯片的固定引脚的;通过引脚重映射,可以把这些外设的功能引脚,转移到芯片的其他备选引脚上。

它的核心目的是 提升硬件设计的灵活性,比如:

  1. 避免默认引脚与其他硬件(如传感器、显示屏)的引脚冲突;
  2. 优化 PCB 布线,减少交叉走线,降低电磁干扰;
  3. 同一个外设可以切换到不同引脚,适配不同的硬件布局。

举个例子:STM32F103 的串口 1(USART1)默认引脚是 PA9(TX)、PA10(RX) ,通过重映射可以转移到 PB6(TX)、PB7(RX)。

二、引脚重映射的分类(以 STM32 为例)

STM32 的引脚重映射分为两类,配置难度和功能范围不同:

  1. 部分重映射外设的部分引脚被重新映射,另一部分仍使用默认引脚。
  2. 完全重映射外设的所有功能引脚都被转移到备选引脚,完全不使用默认引脚。

三、引脚重映射的使用步骤(以 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);
}

四、使用注意事项

  1. 查手册确认重映射引脚 不同型号的 STM32(如 F1、F4、H7)的重映射引脚不同,必须查阅对应芯片的《数据手册》 ,比如:
    • STM32F103 的 USART1 重映射引脚是 PB6/PB7;
    • STM32F407 的 USART1 重映射引脚可能是 PA9/PA10 或 PB6/PB7。
  2. 必须开启 AFIO 时钟复用功能时钟(AFIO)是配置重映射的前提,遗漏会导致重映射失效。
  3. GPIO 模式必须配置为复用功能 重映射后的引脚不能用 GPIO_Mode_Out_PP 或 GPIO_Mode_IPU,否则外设功能无法正常工作。
  4. 部分重映射可能需要屏蔽默认引脚对于部分重映射,默认引脚可能会处于悬空状态,可根据需求配置为下拉输入,避免干扰。

五、常见应用场景

  1. PCB 布线优化:默认引脚位置不利于布线时,重映射到更合适的引脚;
  2. 引脚冲突解决:默认引脚被其他外设(如 LED、按键)占用时,切换到备选引脚;
  3. 功能扩展:同一个外设切换不同引脚,实现 "一个外设,多个接口" 的灵活设计。
相关推荐
不悔哥4 天前
开源OV-Watch:怎么做一个智能手表
单片机·开源·嵌入式
XiHongShi20164 天前
STM32F407 RTC定时器例程,建议保存
stm32·单片机·学习
优信电子4 天前
AIT1001 非接触式红外测温模块 STM32 驱动开发实战:从引脚到代码全解析
stm32·嵌入式·温度传感器·红外测温·非接触式测温·ait1001
深圳老胡4 天前
STM32F407 控制 L6470 步进电机驱动 —— 控制过程简介
笔记·stm32·单片机·嵌入式硬件·代码规范
wuyk5554 天前
《WiFi 嵌入式物联网开发全套实战》| 第 16 章 ESP32 AP+STA 双模共存原理与工程坑点
网络·stm32·物联网
女神下凡4 天前
嵌入式设计的各种存储芯片的硬件/软件设计规范,非常全面。
arm开发·单片机·嵌入式硬件
梅梅9664 天前
一款mipi转lvds的lcd调试(LT8912B)
单片机·计算机外设·电脑·显示器·pd芯片
开发笔记-阿牛4 天前
蓝牙音乐灯拆解,又一次拆到蓝牙音乐灯芯片CK6865L
人工智能·单片机·嵌入式硬件·音视频·音频
CHENKONG_CK4 天前
破解制鞋打磨痛点:RFID赋能去毛刺工序自动化升级
网络·单片机·嵌入式硬件·网络协议·tcp/ip
三佛科技-187366133974 天前
128KB~512KB Flash车规级MCU选型指南(FT32A072 / FT32A103 系列)
单片机·嵌入式硬件