资讯动态

stm32GPIO复用功能与重映射

发布时间:2026/8/14 17:12:26 来源:尧图企业网站定制
本文系统讲解 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

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价