一、引言
GPIO作为MCU与外界交互最基本的接口,其复用功能(Alternate Function)允许我们将同一个引脚分配给不同的片上外设(如USART、SPI、I2C、定时器等),而引脚重映射(Remap)则是在芯片引脚布局有限的情况下,为解决外设引脚冲突或优化PCB走线而设计的灵活机制。例如,默认位于PA9/PA10的USART1串口,可以通过重映射转移到PB6/PB7,从而释放默认引脚用于其他功能。本文将以STM32F1系列为主,通过查阅STM32F10xxx参考手册从寄存器层面详细剖析如何配置GPIO的复用功能,如何通过AFIO_MAPR寄存器实现引脚重映射,并提供可直接测试的代码示例。希望通过这篇文章,读者能够彻底掌握STM32 GPIO的高级配置技巧,在底层开发中更加自信。
二、STM32 GPIO复用功能介绍
2.1 什么是复用功能(AF)?
GPIO的本职工作:
- 输出高低电平(比如点亮LED、控制继电器)
- 读取外部电平状态(比如读取按键,读传感器的开关信号
这种用法叫通用模式(GPIO模式),但是在很多芯片里,UART串口、I2C、SPI、PWM、ADC、定时器、CAN等外设,都需要专用的外部引脚来收发信号。为了不浪费芯片引脚,厂商会把这些外设的信号“绑定”到同一个GPIO引脚上,让它可以切换工作模式。比如STM32的PA9引脚:
- 可以配置成普通GPIO输出,点亮LED
- 也可以配置成复用功能(AF),作为USART1的发送引脚(TX),用作串口通信
- 还可以配置成定时器一的通道二输出PWM信号控制电机
2.2 相关寄存器
事件控制寄存器(AFIO_EVCR):
EVOE:该位为寄存器使能位,设置该位后Cortex的EVENTOUT事件将路由到PORT[3:0]和PIN[3:0]指定的引脚上去,当内核检测到特定事件触发条件时,ENVENTOUT引脚会产生一个脉冲。
PORT[2:0]:选择用于输出Cortex的EVENTOUT信号的端口:
- 000:选择PA
- 001:选择PB
- 010:选择PC
- 011:选择PD
- 100:选择PE
三、引脚重映射概念
3.1 为什么需要重映射
芯片引脚数量有限,同一个外设功能可能对应多个引脚位置。
例如 USART1 的 TX/RX 默认在 PA9/PA10,可以重映射到 PB6/PB7。
3.2 重映射的分类
部分重映射:只移动部分信号(如定时器通道)。
完全重映射:所有信号移到另一组引脚。
是否支持重映射需查看芯片数据手册。
该寄存器是 STM32F1 系列实现引脚重映射的核心控制单元。详细地描述了STM32各复用功能和引脚重映射(图中仅列出位26~15),通过对寄存器的不同位的配置实现重映射不同组之间的灵活切换。
四、寄存器配置以及代码示例
4.1 复用功能配置步骤(无重映射)
开启 GPIO 和外设时钟(RCC 相关寄存器)。
配置 GPIOx_CRL/CRH 为复用推挽输出(或复用开漏)。
(F4 系列)设置 GPIOx_AFRL/AFRH 选择具体 AF 编号。
配置外设自身寄存器(如 USART、SPI 等)。
示例:配置 PA9(USART1_TX)为复用功能:
// 开启时钟 RCC->APB2ENR |= RCC_APB2ENR_IOPAEN | RCC_APB2ENR_USART1EN; // 配置 PA9 为复用推挽输出,50MHz GPIOA->CRH &= ~(GPIO_CRH_CNF9 | GPIO_CRH_MODE9); GPIOA->CRH |= GPIO_CRH_CNF9_1 | GPIO_CRH_MODE9_0 | GPIO_CRH_MODE9_1;4.2 重映射配置步骤(以 USART1 重映射到 PB6/PB7 为例)
开启 GPIOB、AFIO 时钟(
RCC_APB2ENR_AFIOEN)。将 PB6/PB7 配置为复用功能输出。
修改
AFIO_MAPR寄存器中的对应位:AFIO_MAPR_USART1_REMAP置 1。
配置 USART1 外设(地址不变,引脚已改变)
// 开启时钟 RCC->APB2ENR |= RCC_APB2ENR_IOPBEN | RCC_APB2ENR_AFIOEN | RCC_APB2ENR_USART1EN; // 配置 PB6, PB7 为复用推挽输出 GPIOB->CRL &= ~(GPIO_CRL_CNF6 | GPIO_CRL_MODE6 | GPIO_CRL_CNF7 | GPIO_CRL_MODE7); GPIOB->CRL |= (GPIO_CRL_CNF6_1 | GPIO_CRL_MODE6_0 | GPIO_CRL_MODE6_1) | (GPIO_CRL_CNF7_1 | GPIO_CRL_MODE7_0 | GPIO_CRL_MODE7_1); // 开启重映射 AFIO->MAPR |= AFIO_MAPR_USART1_REMAP; // 然后配置 USART1 的波特率等4.3 F4 系列重映射说明
F4 系列没有
AFIO_MAPR,改为通过SYSCFG 寄存器实现重映射(较少用),多数外设直接通过GPIOx_AFRL/AFRH选择不同 AF 值来切换引脚组。示例:USART3 的 TX 可配置为 PB10(AF7)或 PC10(AF7)—— 选不同 GPIO 和 AF 即可,无需专门重映射寄存器。
五、调试与注意事项
5.1 常见错误
忘记开启 AFIO 时钟(F1 系列)。
重映射后外设时钟未重新使能。
F4 中误将
AFIO寄存器当作重映射使用。
5.2 验证方法
用示波器/逻辑分析仪观察引脚波形。
读取外设状态寄存器判断是否发送数据。