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

一、引脚重映射的定义

引脚重映射是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_PPGPIO_Mode_IPU,否则外设功能无法正常工作。
  4. 部分重映射可能需要屏蔽默认引脚对于部分重映射,默认引脚可能会处于悬空状态,可根据需求配置为下拉输入,避免干扰。

五、常见应用场景

  1. PCB 布线优化:默认引脚位置不利于布线时,重映射到更合适的引脚;
  2. 引脚冲突解决:默认引脚被其他外设(如 LED、按键)占用时,切换到备选引脚;
  3. 功能扩展:同一个外设切换不同引脚,实现 "一个外设,多个接口" 的灵活设计。
相关推荐
知南x8 小时前
【正点原子STM32MP157 可信任固件TF-A学习篇】(2) STM32MP1 中的 TF-A
stm32·嵌入式硬件·学习·stm32mp157
逐步前行9 小时前
C51_OLED
单片机
LaoZhangGong12310 小时前
深度学习uip中“uip_arp.c“
c语言·stm32·以太网·arp·uip·enc28j60
Bona Sun11 小时前
单片机手搓掌上游戏机(二十三)—esp32运行简单街机模拟器软硬件准备
c语言·c++·单片机
做一道光12 小时前
电机控制——电流采样(三电阻)
单片机·嵌入式硬件·学习·电机控制
d111111111d13 小时前
STM32外设学习-WDG看门狗-(学习笔记)
笔记·stm32·单片机·嵌入式硬件·学习
点灯小铭14 小时前
基于51单片机的医院银行排队叫号系统设计与实现
单片机·嵌入式硬件·毕业设计·51单片机·课程设计·期末大作业
啊森要自信14 小时前
【STM32】USART串口通信
c语言·开发语言·stm32·单片机·嵌入式硬件
做一道光14 小时前
电机控制——电流采样(双电阻)
笔记·单片机·嵌入式硬件·电机控制