🔬 实验07:端口复用与仿真
📌 实验目标
- 理解 GPIO 复用功能(AFIO)的概念
- 掌握使用 Keil 软件仿真调试的方法
- 学会用逻辑分析仪观察引脚波形
- 掌握 USART 的端口复用配置
一、实验内容
- 学习 GPIO 端口复用功能(如 USART1_TX 映射到 PA9)
- 使用 Keil 的软件仿真功能调试程序
- 通过仿真逻辑分析仪观察 GPIO 输出波形
- 配置 USART 的端口复用并验证
二、端口复用配置
STM32 的很多 GPIO 引脚具有第二功能(复用功能)。使用复用时需将 GPIO 配置为复用模式(AF_PP 或 AF_OD),并开启对应外设的时钟。
| 复用功能 | 引脚 | GPIO 模式 |
|---|---|---|
| USART1_TX | PA9 | 复用推挽输出 AF_PP |
| USART1_RX | PA10 | 浮空输入 IN_FLOATING |
| I2C1_SCL | PB6 | 复用开漏输出 AF_OD |
| SPI1_SCK | PA5 | 复用推挽输出 AF_PP |
端口复用三步走(以串口1为例)
- 使能 GPIO 时钟
- 使能复用外设时钟(如 USART1)
- 用
GPIO_Init()把引脚设为对应模式(TX→AF_PP,RX→IN_FLOATING)
端口重映射(把串口1 移到 PB6/PB7)
重映射用于把外设引脚换到其它 GPIO,方便布线。与复用的区别是:还要再使能 AFIO 时钟并调用重映射函数。
USART1 端口复用 + 重映射配置
#include "stm32f10x.h"
void USART1_GPIO_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
// ===== 方案一:使用默认引脚 PA9(TX)、PA10(RX) —— 端口复用 =====
// ① GPIO 时钟使能
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
// ② 复用外设时钟使能
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
// ③ 端口模式配置
// TX(PA9) 复用推挽输出
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(GPIOA, &GPIO_InitStructure);
// RX(PA10) 浮空输入
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA, &GPIO_InitStructure);
}
void USART1_Remap_GPIO_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
// ===== 方案二:重映射到 PB6(TX)、PB7(RX) =====
// ① 使能重映射后的 GPIO 时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
// ② 使能功能外设时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
// ③ 使能 AFIO 时钟(重映射必须!)
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
// ④ 开启重映射:USART1 从 PA9/PA10 移到 PB6/PB7
GPIO_PinRemapConfig(GPIO_Remap_USART1, ENABLE);
// ⑤ 端口模式配置(改为 PB6 / PB7)
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
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);
}💡 这段代码怎么用?
- 仿真/上板前先在
USART1_GPIO_Config()与USART1_Remap_GPIO_Config()中任选其一调用 - 方案一是串口1 默认引脚,直接可用;方案二演示「重映射」,用于把串口放到 PB6/PB7
- 「端口复用」让同一个 GPIO 干两件事(既是 IO 又是串口脚),最大化利用引脚资源;「重映射」负责改引脚位置,方便 PCB 布线
⚠️ 注意事项
- 重映射必须开启 AFIO 时钟,否则重映射配置不生效
- 仿真逻辑分析仪观察 GPIO 波形时,要先在 Target 里把晶振频率设为 8MHz(与板载晶振一致)
- 部分重映射会同时移动多个引脚(如
GPIO_PartialRemap_TIM3把 CH1 也移到 PB4),使用前查数据手册确认
三、参考资料
| 资料 | 文件 |
|---|---|
| 端口复用与仿真 PPT | 端口复用和仿真.pptx |
| 实验指导文档 | 端口复用和仿真.docx |
| USART 示例代码 | 7USART.rar |