stm32GPIO复用功能与重映射

发布时间:2026/10/5 0:16:14

stm32GPIO复用功能与重映射 本文系统讲解 STM32 的 AFIO 复用功能与重映射机制覆盖术语、数据手册 8.3/8.4 节解读、寄存器位域详解及六步配置流程。目录1. 术语解释2.参考数据手册8.3节复用功能I/O和调试配置8.3 开篇总览8.3.1 把 OSC32_IN/OSC32_OUT 作为 GPIO 端口 PC14/PC158.3.2 把 OSC_IN/OSC_OUT 引脚作为 GPIO 端口 PD0/PD18.3.3 CAN1 复用功能重映射8.3.4 CAN2 复用功能重映射仅互联型产品8.3.5 JTAG/SWD 复用功能重映射8.3.6 ADC 复用功能重映射8.3.7 定时器复用功能重映射8.3.8 USART 复用功能重映射8.3.9 I²C1 复用功能重映射8.3.10 SPI1 复用功能重映射8.3.11 SPI3 复用功能重映射仅互联型8.3.12 以太网复用功能重映射仅互联型STM32F1073. 参考数据手册8.4节AFIO寄存器描述8.4.1 事件控制寄存器 (AFIO_EVCR)8.4.2 复用重映射和调试I/O配置寄存器 (AFIO_MAPR)8.4.3 ~ 8.4.6 外部中断配置寄存器 (AFIO_EXTICR1~4)4. 使用步骤 —— 手打代码4.1 骨架步骤 1步骤 2步骤 3释放调试引脚如目标为 PA15 / PB3 / PB4步骤 4配置 GPIO 复用模式步骤 5执行重映射 / 选择外部中断引脚步骤 6初始化外设 / 中断1. 术语解释在进入正文之前请务必先理解下面这些词的意思否则后面的内容你会越看越懵。术语通俗解释重点GPIO芯片的引脚可以当输入或输出用普通数字IO电平由寄存器控制AFIO引脚功能“调度中心”负责换引脚和选外部中断引脚用之前必须先开 AFIO 时钟否则配置无效复用功能AF让引脚去干外设的活比如串口发送、SPI时钟信号直接连到外设不经过 GPIO 数据寄存器重映射Remap把外设的引脚从默认位置“搬”到备用位置查AFIO_MAPR寄存器每个外设有对应开关位调试端口JTAG/SWD默认占用 PA13、PA14、PA15、PB3、PB4 用于调试想释放这些脚设置SWJ_CFG010只保留 SWD千万别设 100寄存器芯片内部的控制开关每个位管一件事所有配置最终都是读写寄存器外部中断线EXTI Line16 根中断线每根线同一时刻只能接一个引脚选引脚查AFIO_EXTICR每 4 位选一个端口2.参考数据手册8.3节复用功能I/O和调试配置8.3节就是一张功能迁移表它告诉你哪些外设USART、SPI、I2C、CAN、TIM、ADC、ETH可以换脚以及可以换到哪一组新引脚上。你不需要背下每个外设的映射组合但你需要知道当你的默认引脚被占用时可以来这里查表看看有没有替代方案。8.3 开篇总览“为了优化64脚或100脚封装的外设数目可以把一些复用功能重新映射到其他引脚上。设置复用重映射和调试I/O配置寄存器(AFIO_MAPR)实现引脚的重新映射。这时复用功能就不再映射到它们的原始分配上了。”解释芯片设计者知道很多引脚不够用或者布线不方便。所以他们在硬件上留了后门——允许你把某些外设的默认引脚换成另一组空闲引脚。怎么换就是通过设置AFIO_MAPR这个寄存器。一旦换了原来的默认引脚就不再承担这个外设的功能了。8.3.1 把 OSC32_IN/OSC32_OUT 作为 GPIO 端口 PC14/PC15“当LSE振荡器关闭时LSE振荡器引脚OSC32_IN/OSC32_OUT可以分别用做GPIO的PC14/PC15LSE功能始终优先于通用I/O口的功能。”解释PC14和PC15这两个引脚默认是接外部32.768kHz晶振给RTC用的的。如果你不用外部晶振改用内部LSI你就可以把这两个脚解放出来当普通IO口用。手册后面备注当1.8V核心电压关闭进入待机模式或者后备区域由VBAT供电而VDD断电时PC14/PC15不能当GPIO用。另外这两个脚输出能力很弱最大驱动电流只有3mA不能用来推LED速度也必须限制在2MHz以下。8.3.2 把 OSC_IN/OSC_OUT 引脚作为 GPIO 端口 PD0/PD1“外部振荡器引脚OSC_IN/OSC_OUT可以用做GPIO的PD0/PD1通过设置复用重映射和调试I/O配置寄存器(AFIO_MAPR)实现。这个重映射只适用于36、48和64脚的封装100脚和144脚的封装上有单独的PD0和PD1的引脚不必重映射”解释PD0和PD1默认是接外部高速晶振HSE的。如果你用内部RC振荡器HSI不需要外部晶振那么你就可以把这两个脚当普通IO口。但注意大封装100脚以上本身就自带PD0/PD1不需要重映射直接就能用。只有小封装才需要通过设置AFIO_MAPR来启用。手册后面备注外部中断功能不会被重映射也就是说在36/48/64脚封装上你无法用PD0/PD1产生外部中断。8.3.3 CAN1 复用功能重映射CAN信号可以被映射到端口A、端口B或端口D上如下表所示。…CAN_REMAP[1:0]“00”CAN1_RX/PA11, CAN1_TX/PA12“10”CAN1_RX/PB8, CAN1_TX/PB9“11”CAN1_RX/PD0, CAN1_TX/PD1。解释CAN1这个外设默认在PA11和PA12上。如果你不想用这两个脚可以改成PB8/PB9或者PD0/PD1。通过设置AFIO_MAPR寄存器的位[14:13]即CAN_REMAP来选择。注意重映射到PD0/PD1只适用于100脚和144脚的大封装因为只有这些封装才有独立的PD0/PD1引脚不会被当作晶振脚。8.3.4 CAN2 复用功能重映射仅互联型产品在互联型产品中还有CAN2接口它的外部信号可以按下表重映射CAN2_REMAP“0” - CAN2_RX/PB12, CAN2_TX/PB13CAN2_REMAP“1” - CAN2_RX/PB5, CAN2_TX/PB6。解释只有STM32F105/107互联型才有CAN2。默认在PB12/PB13也可以通过设置重映射位把它们搬到PB5/PB6去。8.3.5 JTAG/SWD 复用功能重映射为了在调试期间可以使用更多GPIOs通过设置复用重映射和调试I/O配置寄存器(AFIO_MAPR)的SWJ_CFG[2:0]位可以改变上述重映像配置。背景默认情况下PA13JTMS/SWDIO、PA14JTCK/SWCLK、PA15JTDI、PB3JTDO、PB4JNTRST都被用作调试接口。如果你想把这些脚省出来做普通IO就要修改SWJ_CFG位。表35 调试端口映像SWJ_CFG[2:0]效果可用调试口被释放的引脚000复位默认全部引脚用作JTAGSWDJTAG SWD无001全部引脚用作JTAGSWD但PB4JNTRST被释放JTAG SWD无复位PB4010关闭JTAG只保留SWD仅SWDPA13/PA14PA15、PB3、PB4100彻底关闭所有调试口无再也烧不进程序全部释放重点除非你确定以后永远不用调试器烧录了否则绝不要设置100。一旦设了你的芯片就再也连接不上调试器只能通过串口ISP擦除后才能恢复新手很容易以为是芯片坏了。日常开发请使用010只释放PA15/PB3/PB4保留最常用的SWDPA13/PA14。8.3.6 ADC 复用功能重映射ADC1外部触发注入转换…ADC1_ETRGIN_REMAP0与EXTI15相连1与TIM8_CH4相连。ADC1外部触发规则转换…ADC1_ETRGEI_REMAP0与EXTI11相连1与TIM8_TRGO相连。解释ADC的规则转换和注入转换原本可以用外部中断线EXTI11/EXTI15来触发。通过重映射可以把触发源改成高级定时器TIM8的某些信号TIM8_CH4或TIM8_TRGO。这样你就可以用定时器来精确控制ADC采样的时刻。这个功能只在大容量产品256KB~512KB Flash上才有。8.3.7 定时器复用功能重映射这一节列出了多个定时器TIM1~TIM5的通道映射选项。我挑几个典型的来解释TIM4_REMAP默认 TIM4_CH1~CH4 在 PB6~PB9设为1后可以搬到 PD12~PD15仅100/144脚封装。TIM3_REMAP[1:0]00PA6、PA7、PB0、PB110PB4、PB5、PB0、PB1部分重映射11PC6、PC7、PC8、PC9完全重映射仅64/100/144脚封装TIM2_REMAP[1:0]可以选择把CH1_ETR从PA0换到PA15把CH2从PA1换到PB3把CH3/CH4换到PB10/PB11等等。TIM1_REMAP[1:0]可以重映射刹车输入BKIN、外部触发ETR以及互补输出通道CHxN例如把BKIN从PB12搬到PA6或PE15。实战意义比如你做电机控制TIM1的互补PWM输出默认在PA8~PA15等脚如果这些脚被其他外设占用你可以把它们整体搬到PE大封装或者用部分重映射搬到其他位置。8.3.8 USART 复用功能重映射USART1_REMAP0 - TX/PA9, RX/PA101 - TX/PB6, RX/PB7。USART2_REMAP0 - PA0~PA41 - PD3~PD7仅100/144脚。USART3_REMAP[1:0]00PB10/PB11/PB12/PB13/PB14TX/RX/CK/CTS/RTS01PC10/PC11/PC12 PB13/PB14部分重映射64/100/144脚11PD8/PD9/PD10/PD11/PD12完全重映射100/144脚使用场景画PCB时发现串口默认引脚走线太绕就可以查这张表换到更顺的引脚上去。8.3.9 I²C1 复用功能重映射I2C1_REMAP0SCL/PB6, SDA/PB7I2C1_REMAP1SCL/PB8, SDA/PB9不适用于36脚封装8.3.10 SPI1 复用功能重映射SPI1_REMAP0NSS/PA4, SCK/PA5, MISO/PA6, MOSI/PA7SPI1_REMAP1NSS/PA15, SCK/PB3, MISO/PB4, MOSI/PB58.3.11 SPI3 复用功能重映射仅互联型SPI3_REMAP0NSS/PA15, SCK/PB3, MISO/PB4, MOSI/PB5和SPI1重映射后的引脚冲突小心SPI3_REMAP1NSS/PA4, SCK/PC10, MISO/PC11, MOSI/PC12注意SPI3_NSS和JTDI共享PA15SPI3_SCK和JTDO共享PB3所以如果你要用SPI3通常要先关掉JTAG设置SWJ_CFG010释放PA15和PB3。8.3.12 以太网复用功能重映射仅互联型STM32F107ETH_REMAP0RX_DV/PA7, RXD0/PC4, RXD1/PC5, RXD2/PB0, RXD3/PB1ETH_REMAP1RX_DV/PB8, RXD0/PB9, RXD1/PB10, RXD2/PB11, RXD3/PB12用于以太网MAC的接收数据线重映射方便PCB走线。3. 参考数据手册8.4节AFIO寄存器描述8.4节告诉你“怎么用代码操作寄存器来实现8.3里的重映射。它详细列出了几个寄存器的每一位分别控制什么。超级重要的前提“对寄存器AFIO_EVCRAFIO_MAPR和AFIO_EXTICRX进行读写操作前应当首先打开AFIO的时钟。”标准库写法RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);寄存器写法RCC-APB2ENR | (10);因为AFIOEN在RCC_APB2ENR的第0位8.4.1 事件控制寄存器 (AFIO_EVCR)这个寄存器控制一个非常冷门的功能把Cortex‑M3内部的EVENTOUT信号输出到某个外部GPIO引脚上。寄存器位详解EVOE位7使能事件输出。为1时允许把EVENTOUT连接到选定的IO口。PORT[2:0]位6:4选择输出到哪个端口000PA, 001PB, 010PC, 011PD, 100PE。PIN[3:0]位3:0选择输出到该端口的哪个引脚0000Px0……1111Px15。实际应用绝大多数应用根本用不到这个寄存器99%的代码里都不会出现。你可以直接忽略它只需要知道它是用来把一个内部调试/同步信号引出来而已。8.4.2 复用重映射和调试I/O配置寄存器 (AFIO_MAPR)这是本节的核心它包含了8.3节里提到的所有重映射开关。整个寄存器共32位每个位或位域控制一个外设的重映射。我会把每个位域都列出来解释不跳过一个。位域名称功能取值含义位0SPI1_REMAPSPI1重映射0默认PA4PA71重映射PA15,PB3PB5位1I2C1_REMAPI2C1重映射0默认PB6,PB71重映射PB8,PB9位2USART1_REMAPUSART1重映射0默认PA9,PA101重映射PB6,PB7位3USART2_REMAPUSART2重映射0默认PA0PA41重映射PD3PD7位5:4USART3_REMAP[1:0]USART3重映射00默认PB10PB1401部分重映射PC10PC1211完全重映射PD8~PD12位7:6TIM1_REMAP[1:0]TIM1重映射00默认PA8~PA12, PB12PB1501部分重映射PA6/PA7/PB0/PB111完全重映射PE7PE15位9:8TIM2_REMAP[1:0]TIM2重映射00默认PA0~PA301部分1PA15,PB310部分2PB10,PB1111完全PA15,PB3,PB10,PB11位11:10TIM3_REMAP[1:0]TIM3重映射00默认PA6,PA7,PB0,PB110部分PB4,PB511完全PC6~PC9位12TIM4_REMAPTIM4重映射0默认PB6PB91重映射PD12PD15位14:13CAN_REMAP[1:0]CAN重映射00默认PA11,PA1210PB8,PB911PD0,PD1位15PD01_REMAPPD0/PD1映射到晶振脚0不映射1PD0→OSC_IN, PD1→OSC_OUT仅小封装位16TIM5CH4_IREMAPTIM5_CH4内部重映射0连接到PA31连接到LSI用于校准LSI频率位21ETH_REMAP以太网重映射0默认PA7,PC4,PC5,PB0,PB11重映射PB8~PB12位22CAN2_REMAPCAN2重映射互联型0PB12,PB131PB5,PB6位23MII_RMII_SELMII/RMII接口选择0MII1RMII以太网PHY接口位26:24SWJ_CFG[2:0]调试接口配置000全开001关JNTRST010只保留SWD100全关危险位28SPI3_REMAPSPI3重映射互联型0默认PA15,PB3,PB4,PB51重映射PA4,PC10,PC11,PC12位29TIM2ITR1_REMAPTIM2内部触发1重映射0连接以太网PTP1连接USB OTG SOF用于时钟校准位30PTP_PPS_REMAP以太网PPS输出重映射0不输出1输出到PB5秒脉冲信号特别注意位26:24SWJ_CFG是重中之重。请牢记设置010只保留SWD既能调试又能释放PA15/PB3/PB4还不会锁死芯片。绝对不要设置100。8.4.3 ~ 8.4.6 外部中断配置寄存器 (AFIO_EXTICR1~4)这四个寄存器EXTICR1~4 负责把GPIO引脚映射到外部中断线EXTI0~EXTI15。每个寄存器控制4条中断线例如EXTICR1控制EXTI0~EXTI3 EXTICR2控制EXTI4~EXTI7以此类推。每条中断线需要4个位来选择引脚来源4位值选择0000PAx0001PBx0010PCx0011PDx0100PEx0101PFx仅大容量/互联型0110PGx仅大容量/互联型举例要把PB0接到EXTI0就需要在AFIO_EXTICR1的低4位即EXTI0[3:0]写入0001。注意只有相应的GPIO端口时钟已经使能RCC_APB2ENR里打开IOPxEN并且该引脚被配置为输入模式外部中断才能正常工作。4. 使用步骤 —— 手打代码这一部分我把从“拿到一个项目”到“完成重映射或外部中断配置”的全过程拆解成 6个步骤4.1 骨架开始 │ ├─ 步骤1查阅手册/数据手册确认我的芯片封装支持这个重映射吗 │ ├─ 步骤2开启RCC时钟外设时钟 AFIO时钟缺一不可 │ ├─ 步骤3处理调试端口如果目标引脚被JTAG/SWD占了先释放 │ ├─ 步骤4配置GPIO底层属性速度、模式、上拉/下拉 │ ├─ 步骤5写入AFIO寄存器执行重映射 或 选择外部中断引脚 │ ├─ 步骤6初始化外设本身初始化USART/SPI/TIM 或 配置NVIC中断 │ └─ 结束步骤 1查阅参考手册 8.3 节确认目标外设支持的重映射选项、封装限制及引脚冲突。步骤 2// USART1 重映射至 PB6/PB7开 GPIOB、USART1、AFIO 时钟RCC-APB2ENR|(10)// AFIOEN|(13)// IOPBEN|(114);// USART1EN步骤 3释放调试引脚如目标为 PA15 / PB3 / PB4// SWJ_CFG 010关闭 JTAG保留 SWDAFIO-MAPR(AFIO-MAPR~(0x724))|(0x224);步骤 4配置 GPIO 复用模式// PB6复用推挽输出50MHzPB7浮空输入GPIOB-CRL~(0xFF24);GPIOB-CRL|(0x0B24)// PB6: CNF10, MODE11|(0x0428);// PB7: CNF01, MODE00步骤 5执行重映射 / 选择外部中断引脚// 场景 AUSART1 重映射至 PB6/PB7AFIO-MAPR|(12);// USART1_REMAP// 场景 BPB0 映射至 EXTI0AFIO-EXTICR[0](AFIO-EXTICR[0]~0x000F)|0x0001;// EXTI0 PB0步骤 6初始化外设 / 中断// USART172MHz PCLK2115200-8-N-1USART1-BRR(6254);// 72MHz / 115200 625USART1-CR20;// 1 停止位USART1-CR1(113)// UE|(13)// TE|(12);// RE若配置外部中断PB0 下降沿触发EXTI-FTSR|(10);// 下降沿触发EXTI-IMR|(10);// 使能 EXTI0NVIC-ISER[0](16);// EXTI0_IRQn 6
延伸阅读

更多相关文章

2026/10/5 0:15:46

用 ASP.NET 搭一个地方特产商城:54125 大理特色产品销售平台实战梳理

项目概览项目项内容开发语言C#开发框架ASP.NET数据库SQL Server系统模式B/S 架构核心业务产品展示、购物车、订单、配送、售后、公共信息管理项目定位:把地方特色产品搬到线上大理具有普洱茶、手工艺品、旅游纪念品等特色产品资源,但传统线下销售渠道受地…

2026/9/25 12:11:20

AI 诊断工具普及,普通维修师傅还有饭吃吗?

这段时间刷短视频,天天刷到那种AI电路板诊断仪,什么一键定位短路、拍个照就识别芯片型号、热成像秒找故障点,评论区一堆人跟着瞎嚷嚷,说再过两年维修师傅都得失业。同行群里也吵得厉害,不少干了十来年的老伙计都发慌&a…

2026/10/4 15:17:31

ACTH (1-39) (rat);SYSMEHFRWGKPVGKKRRPVKVYPNVAENESAEAFPLEF

一、基础信息中文名称:大鼠促肾上腺皮质激素 (1-39)三字母序列:Ser-Tyr-Ser-Met-Glu-His-Phe-Arg-Trp-Gly-Lys-Pro-Val-Gly-Lys-Lys-Arg-Arg-Pro-Val-Lys-Val-Tyr-Pro-Asn-Val-Ala-Glu-Asn-Glu-Ser-Ala-Glu-Ala-Phe-Pro-Leu-Glu-Phe单字母序列&#xff1…

2026/10/5 0:12:09

计算机网络实验报告:网络命令、路由交换与IIS配置全解析

简介:河北工业大学计算机网络实验报告以Word文档形式整理,聚焦网络基础技能实操,面向高校计算机网络课程学习者与需要备考CCNA等认证的读者。内容覆盖实验一基本网络命令与实验二路由器配置两大模块:系统讲解ping、ipconfig、trac…

2026/10/5 0:12:09

Java汽车租赁系统:状态机+事务锁解决并发下单

简介:这是一套基于Java Web技术栈开发的汽车租赁管理系统完整源码,面向Java初学者与Web开发入门者,适用于课程设计、毕业设计及中小型企业租赁业务原型开发。系统采用Servlet架构,后端对接Oracle数据库,涵盖用户管理、…

2026/10/5 0:12:09

vm_operations_struct深度解析:VMA虚拟内存操作核心机制

做过嵌入式Linux驱动或者仔细读过内核源码的朋友,一定见过vm_operations_struct这个结构体,但很多人对它的理解停留在“mmap的VMA操作集”这个层面。说实在的,这个结构体是用户态与内核态虚拟内存交互的命门,搞懂它,你…

2026/10/5 0:12:09

K8s存储实战:理清PV/PVC/StorageClass与NFS动态供给

刚接触 Kubernetes 存储这块的人,十个里有八个会被 PV、PVC、StorageClass 这一串名词绕晕。我最早学的时候也是,看了好几篇博客,例子跑通了,但换个场景立刻又不会了。后来在生产环境里给有状态服务配过存储、排查过 Pod 一直Cont…

2026/10/5 0:12:09

vSphere Client任务刷屏?Query container volume async根因排查解析

最近后台有朋友截图给我,vSphere Client 的“最近任务”列表被一条叫Query container volume async的任务刷屏了:进度条跑不完,隔十几秒又冒一条,有时候还直接从“正在运行”变成失败重试。第一反应可能是中毒、磁盘坏了&#xff…

2026/10/5 0:07:09

插件机制解析:从架构原理到failed to load plugins排查实战

写这篇东西的起因挺简单:前阵子帮朋友排查一个工具链启动就报错的问题,控制台翻来覆去就一句话——failed to load plugins,后面还跟着 web boot、entries did not activate 之类的提示。折腾了大半天,最后发现根因就是某个插件包…

2026/10/4 0:01:02

Jev+Agent接管浏览器:browser-use实战与jev-ultrafast性能优化

1. 从“Jev”说起:为什么我要把Agent接进浏览器“Jev”这个词最近在圈子里出现的频率越来越高,很多人第一次听到会以为是某个新模型的名字,其实它更像是一种思路——把Jev模型的能力当作底座,通过Agent的方式去接管浏览器&#xf…

2026/10/4 0:01:02

多智能体集群实战:DeepAgents编排、MCP与A2A协议及Skills体系

1. 从"单兵作战"到"集群协同":多智能体编排到底在解决什么问题如果你最近在折腾 Agent 相关的东西,大概率会有一种感觉:单个 Agent 能做的事情,其实很快就摸到天花板了。你给它一个提示词,挂几个工…

2026/10/4 1:01:05

无源低通滤波器设计实战:从RC到LC,手把手教你避开那些坑

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑