🔬 实验07:端口复用与仿真

📌 实验目标
  • 理解 GPIO 复用功能(AFIO)的概念
  • 掌握使用 Keil 软件仿真调试的方法
  • 学会用逻辑分析仪观察引脚波形
  • 掌握 USART 的端口复用配置

一、实验内容

  1. 学习 GPIO 端口复用功能(如 USART1_TX 映射到 PA9)
  2. 使用 Keil 的软件仿真功能调试程序
  3. 通过仿真逻辑分析仪观察 GPIO 输出波形
  4. 配置 USART 的端口复用并验证

二、端口复用配置

STM32 的很多 GPIO 引脚具有第二功能(复用功能)。使用复用时需将 GPIO 配置为复用模式(AF_PP 或 AF_OD),并开启对应外设的时钟。

复用功能引脚GPIO 模式
USART1_TXPA9复用推挽输出 AF_PP
USART1_RXPA10浮空输入 IN_FLOATING
I2C1_SCLPB6复用开漏输出 AF_OD
SPI1_SCKPA5复用推挽输出 AF_PP

端口复用三步走(以串口1为例)

  1. 使能 GPIO 时钟
  2. 使能复用外设时钟(如 USART1)
  3. 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);
}
💡 这段代码怎么用?
  1. 仿真/上板前先在 USART1_GPIO_Config()USART1_Remap_GPIO_Config() 中任选其一调用
  2. 方案一是串口1 默认引脚,直接可用;方案二演示「重映射」,用于把串口放到 PB6/PB7
  3. 「端口复用」让同一个 GPIO 干两件事(既是 IO 又是串口脚),最大化利用引脚资源;「重映射」负责改引脚位置,方便 PCB 布线
⚠️ 注意事项
  • 重映射必须开启 AFIO 时钟,否则重映射配置不生效
  • 仿真逻辑分析仪观察 GPIO 波形时,要先在 Target 里把晶振频率设为 8MHz(与板载晶振一致)
  • 部分重映射会同时移动多个引脚(如 GPIO_PartialRemap_TIM3 把 CH1 也移到 PB4),使用前查数据手册确认

三、参考资料

资料文件
端口复用与仿真 PPT端口复用和仿真.pptx
实验指导文档端口复用和仿真.docx
USART 示例代码7USART.rar