说实话关于复用功能和重映射这两个我是经常搞混,我给大家进行一个总结,希望大家不要重走我的苦
复用功能:
复用功能;也总说成复用引脚,他就是可以实现同一个引脚可以干很多事情,给大家举个例子,大家可以翻开“stm32f10x中文参考手册”的第118页、120页,在PA9这个引脚上,不仅可以是定时器1通道2还可以是USART1_Tx
如果出现了这个复用引脚,那么我们在配置GPIO结构体的时候,就要选择AF,例如:GPIO_Mode_AF_PP。大家能明白为什么要有复用推挽复用开漏的功能了吧?
STM32 的每个 GPIO 引脚默认是普通 IO,也就是能输出或读取高低电平(比如控制一个 LED 或检测一个按键)。
但当这个引脚要去参与外设通信(比如 SPI、USART、TIM 等),它就不再只是“普通电平”那么简单,而是要承担更高级的功能,比如:
-
SPI 的 MOSI 要按时钟同步发送数据
-
USART 的 Tx 要按波特率发字节流
-
TIM 的输出通道要输出 PWM 波形
所以这时,就必须启用 GPIO 的复用功能,把引脚从“普通 GPIO”切换成“某个外设的功能口”。
在代码中,我们就需要把这个引脚的模式配置为:
GPIO_Mode_AF_PP // 复用推挽输出
GPIO_Mode_AF_OD // 复用开漏输出(如 I2C)
重映射:
接下来讲重映射:
重映射是将外设的某个功能换个引脚来使用。
你原本以为串口只能走 PA9/PA10,结果它说:“不,我还能走 PB6/PB7,只要你设置一下重映射就行!”
这样不就能解决引脚冲突,让资源分配更灵活了嘛。
REMAP=0是默认,REMAP=1是重映射到对应的引脚。一旦要有重映射我们就要在代码中配置一个复用时钟函数,如下图:
重映射中还有部分重映射、完全重映射,给大家总结好表格,大家自行阅读。
类型 | 说明 |
---|---|
默认映射 | 比如 USART1 默认映射在 PA9 / PA10 |
部分重映射 | 比如 TIM2 可以从 PA0/PA1 映射成 PA15/PB3(只改部分) |
完全重映射 | 所有引脚全部换一组,比如 TIM3 从 PA6/PA7/PC6 映射成 PC8/PC9/PB0 |
同时,如果我们要用重映射的话,我们还需要打开AFIO时钟,且要调用gpio.h中的这个函数,从而设置成重映射的状态
void GPIO_PinRemapConfig(uint32_t GPIO_Remap, FunctionalState NewState);
✅ 总结
(1)复用功能 vs 重映射:一套搞清楚的方法论
概念 | 作用 | 关键词 | 配置重点 | 是否需开启 AFIO 时钟 |
---|---|---|---|---|
复用功能 | 让一个引脚干多种事(由芯片内部预设) | “一个引脚有多个角色” | GPIO 模式要用 AF_PP 或 AF_OD | ❌ 不需要 |
重映射功能 | 让一个外设换条引脚走(解决冲突) | “一个功能可以换地方” | 要调用 GPIO_PinRemapConfig() 设置 | ✅ 需要开启 RCC_APB2Periph_AFIO |
(2)如何判断你遇到的是“复用功能”还是“重映射”?
✅ 判断 1:同一个引脚能用在多个外设上?
👉 那你遇到的是 复用功能
📌 举个例子:
STM32 的 GPIO 默认是普通高低电平输出/输入,但当引脚要用于像 SPI、USART、PWM 这类外设通信时,就必须启用 复用功能,让引脚切换成外设的“功能口”。这就是为什么我们在配置 SPI 时常见 GPIO_Mode_AF_PP
—— 它就是告诉 STM32:“这根引脚要去干外设的活了”。
✅ 判断 2:同一个外设功能可以映射到多个引脚上?
👉 那你遇到的是 重映射功能
📌 举个例子:
SPI1 默认用的是 PA5(SCK)、PA6(MISO)、PA7(MOSI)
但你也可以通过重映射,把它挪到 PB3、PB4、PB5。
也就是说 —— “一个功能可以换地方用”。