news 2026/6/8 7:05:13

STM32寄存器开发:深入理解GPIO复用功能与引脚重映射

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
STM32寄存器开发:深入理解GPIO复用功能与引脚重映射

一、引言

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]:选择用于输出CortexEVENTOUT信号的端口:

  • 000:选择PA
  • 001:选择PB
  • 010:选择PC
  • 011:选择PD
  • 100:选择PE
PIN[3:0]同PORT[2:0]。

三、引脚重映射概念

3.1 为什么需要重映射

  • 芯片引脚数量有限,同一个外设功能可能对应多个引脚位置。

  • 例如 USART1 的 TX/RX 默认在 PA9/PA10,可以重映射到 PB6/PB7。

3.2 重映射的分类

  • 部分重映射:只移动部分信号(如定时器通道)。

  • 完全重映射:所有信号移到另一组引脚。

  • 是否支持重映射需查看芯片数据手册。

复用重映射和调试I/O配置寄存器(AFIO_MAPR)

该寄存器是 STM32F1 系列实现引脚重映射的核心控制单元。详细地描述了STM32各复用功能和引脚重映射(图中仅列出位26~15),通过对寄存器的不同位的配置实现重映射不同组之间的灵活切换。

四、寄存器配置以及代码示例

4.1 复用功能配置步骤(无重映射)

  1. 开启 GPIO 和外设时钟(RCC 相关寄存器)。

  2. 配置 GPIOx_CRL/CRH 为复用推挽输出(或复用开漏)。

  3. (F4 系列)设置 GPIOx_AFRL/AFRH 选择具体 AF 编号。

  4. 配置外设自身寄存器(如 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 为例)

  1. 开启 GPIOB、AFIO 时钟(RCC_APB2ENR_AFIOEN)。

  2. 将 PB6/PB7 配置为复用功能输出。

  3. 修改AFIO_MAPR寄存器中的对应位:

    • AFIO_MAPR_USART1_REMAP置 1。

  4. 配置 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 验证方法

  • 用示波器/逻辑分析仪观察引脚波形。

  • 读取外设状态寄存器判断是否发送数据。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/8 7:00:30

2026山东大学项目实训个人记录(五)

一、本阶段任务背景 本阶段继续进行前后端的联调工作,并修复上次联调之后,前后端都发生了修改导致的新问题。 二、具体工作 1.问题现象 点击登录/注册按钮,浏览器 Network 无任何请求,后端终端也没有任何日志。前端页面看起来一切…

作者头像 李华
网站建设 2026/6/8 6:58:56

GTX 1660 SUPER炼丹炉搭建记:保姆级CUDA 11.5.1 + cuDNN 8.3.0配置避坑指南

GTX 1660 SUPER深度学习环境配置实战:从驱动匹配到模型验证第一次接触深度学习训练的朋友,往往会被GPU环境配置的复杂性劝退。本文将手把手带你用GTX 1660 SUPER这张性价比显卡,搭建一个稳定高效的"炼丹炉"。不同于简单的安装步骤罗…

作者头像 李华
网站建设 2026/6/8 6:56:11

C++面向对象程序设计之继承与封装

封装与继承概述 1.封装和继承是面向对象程序设计的两个主要特征 2.封装:隐藏对象内部状态 继承:允许子类继承父类的特性 继承的定义和语法 1.继承允许子类继承父类的成员变量和成员函数 2.子类可以访问父类的数据成员和函数 3.语法层面,子类通…

作者头像 李华