STM32F103重映射实战:GPIO_Remap1_CAN1和GPIO_Remap2_CAN1到底怎么选?
2026/6/13 12:10:00 网站建设 项目流程

STM32F103重映射实战:GPIO_Remap1_CAN1和GPIO_Remap2_CAN1到底怎么选?

在嵌入式开发中,STM32F103系列因其高性价比和丰富的外设资源,成为许多工程师的首选。然而,面对复杂的引脚复用和重映射功能,不少开发者尤其是初学者常常感到困惑。本文将深入探讨STM32F103中CAN1接口的两种重映射配置方式,帮助您在项目中做出明智选择。

1. 理解STM32F103的引脚复用与重映射机制

STM32F103的每个GPIO引脚都不仅仅是简单的输入输出端口,它们往往承载着多种功能。这种设计极大地提高了芯片的灵活性和资源利用率,但也带来了配置上的复杂性。

引脚复用的本质可以比作多功能工具:就像一把瑞士军刀,同一个物理接口可以根据需要切换不同的功能模式。例如,一个GPIO引脚可以:

  • 作为普通数字输入/输出
  • 配置为ADC输入通道
  • 用作USART的TX/RX线
  • 作为I2C或SPI接口的一部分

重映射功能则更进一步,它允许将某些外设的默认引脚位置重新分配到其他GPIO端口上。这种机制在PCB布局和信号完整性优化中尤为重要。

注意:并非所有外设都支持重映射功能,且不同型号的STM32F103芯片支持的重映射选项可能有所不同,请务必查阅对应型号的参考手册。

2. CAN1接口的两种重映射模式详解

STM32F103的CAN1控制器支持两种不同的引脚重映射配置,分别对应GPIO_Remap1_CAN1GPIO_Remap2_CAN1。理解这两种模式的差异是正确配置的关键。

2.1 默认引脚配置与重映射选项

在默认情况下,CAN1接口使用以下引脚:

  • CAN_RX: PA11
  • CAN_TX: PA12

当启用重映射功能时,我们有两种选择:

重映射模式CAN_RX引脚CAN_TX引脚适用场景
GPIO_Remap1_CAN1PB8PB9需要释放PA11/PA12时使用
GPIO_Remap2_CAN1PD0PD1需要更灵活布局时使用

2.2 寄存器级配置解析

重映射功能通过AFIO_MAPR寄存器(复用重映射和调试I/O配置寄存器)控制。对于CAN1重映射,关键位是第13和14位:

AFIO_MAPR寄存器CAN1重映射位: 位14-13: CAN_REMAP[1:0] 00: 无重映射(CAN_RX/PA11, CAN_TX/PA12) 01: 重映射1(CAN_RX/PB8, CAN_TX/PB9) 11: 重映射2(CAN_RX/PD0, CAN_TX/PD1)

在标准外设库中,这两个重映射模式对应的宏定义为:

#define GPIO_Remap1_CAN1 ((uint32_t)0x001D4000) #define GPIO_Remap2_CAN1 ((uint32_t)0x001D6000)

这些值看起来复杂,但实际上它们包含了AFIO_MAPR寄存器中多个外设重映射配置的组合。我们只需要关注第13和14位即可。

3. 实际配置步骤与代码实现

3.1 硬件准备与初始化流程

无论选择哪种重映射模式,基本的配置流程都包含以下步骤:

  1. 时钟使能

    • 使能GPIO端口时钟
    • 使能AFIO时钟(重映射必需)
    • 使能CAN1时钟
  2. GPIO配置

    • 设置对应引脚为复用推挽输出模式
  3. 重映射配置

    • 选择并应用适当的重映射模式
  4. CAN初始化

    • 配置CAN工作模式和过滤器等参数

3.2 具体代码实现

以下是使用GPIO_Remap2_CAN1将CAN1重映射到PD0和PD1的完整示例:

// 1. 时钟配置 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD | RCC_APB2Periph_AFIO, ENABLE); RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1, ENABLE); // 2. GPIO配置 GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1; // PD0和PD1 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; // 复用推挽输出 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOD, &GPIO_InitStructure); // 3. 重映射配置 GPIO_PinRemapConfig(GPIO_Remap2_CAN1, ENABLE); // 4. CAN初始化 CAN_InitTypeDef CAN_InitStructure; CAN_InitStructure.CAN_TTCM = DISABLE; CAN_InitStructure.CAN_ABOM = ENABLE; CAN_InitStructure.CAN_AWUM = ENABLE; CAN_InitStructure.CAN_NART = DISABLE; CAN_InitStructure.CAN_RFLM = DISABLE; CAN_InitStructure.CAN_TXFP = DISABLE; CAN_InitStructure.CAN_Mode = CAN_Mode_Normal; CAN_InitStructure.CAN_SJW = CAN_SJW_1tq; CAN_InitStructure.CAN_BS1 = CAN_BS1_8tq; CAN_InitStructure.CAN_BS2 = CAN_BS2_7tq; CAN_InitStructure.CAN_Prescaler = 4; CAN_Init(CAN1, &CAN_InitStructure);

提示:如果选择GPIO_Remap1_CAN1模式,只需将上述代码中的GPIO_Remap2_CAN1替换为GPIO_Remap1_CAN1,并将GPIO配置改为针对PB8和PB9即可。

4. 两种重映射模式的选择策略

在实际项目中,选择哪种重映射模式需要考虑多方面因素。以下是关键决策点:

4.1 硬件设计约束

  • PCB布局:评估哪种引脚分配更有利于布线优化和信号完整性
  • 引脚冲突:检查其他外设是否已经占用了默认或重映射的引脚
  • 连接器位置:考虑目标引脚在板上的物理位置是否便于连接

4.2 软件兼容性考量

  • 代码可移植性:如果项目可能迁移到其他STM32型号,需确认目标芯片是否支持相同的重映射选项
  • 库版本兼容:不同版本的STM32标准外设库或HAL库可能在重映射实现上有细微差异

4.3 性能与稳定性因素

虽然两种重映射模式在功能上是等效的,但在某些特殊情况下可能存在差异:

  • GPIO端口负载:如果某个GPIO端口已经承载了大量外设,添加CAN可能会影响信号质量
  • 中断优先级:不同GPIO端口的中断线分配可能影响系统实时性

5. 常见问题与调试技巧

即使按照规范配置,实际开发中仍可能遇到各种问题。以下是一些典型问题及其解决方案:

5.1 无法正常通信的排查步骤

  1. 检查物理连接

    • 确认CAN收发器正确连接
    • 测量CANH和CANL之间的终端电阻(通常应为60Ω)
  2. 验证配置

    • 使用示波器检查CAN_TX引脚是否有信号输出
    • 确认CAN控制器和收发器的供电电压正常
  3. 软件调试

    • 检查CAN初始化返回值
    • 验证波特率设置与网络中其他节点匹配

5.2 特殊情况的处理

同时使用USB和CAN:在STM32F103中,USB和CAN1共享相同的时钟源。如果同时使用这两个外设,需要注意:

  • USB优先级高于CAN,可能导致CAN通信不稳定
  • 解决方案是确保USBDP(PA12)不被其他功能占用

低功耗模式下的CAN:当芯片进入停止模式时,CAN控制器会自动关闭。唤醒后需要重新初始化CAN外设,包括重映射配置。

// 唤醒后重新初始化CAN的示例 void CAN_Wakeup_Init(void) { // 1. 恢复时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD | RCC_APB2Periph_AFIO, ENABLE); RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1, ENABLE); // 2. 重新应用重映射 GPIO_PinRemapConfig(GPIO_Remap2_CAN1, ENABLE); // 3. 重新初始化CAN CAN_Init(CAN1, &CAN_InitStructure); }

在实际项目中,我遇到过因忽视重映射配置而导致的难以排查的通信故障。特别是在使用现成开发板进行原型设计后,转移到自定义硬件时,引脚分配的变化常常被忽略。一个实用的建议是:在项目文档中明确记录所有外设的引脚分配和重映射配置,并在代码中添加详细的注释说明。这样不仅能避免后续开发中的困惑,也便于团队协作和后期维护。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询