关于PinReMap的一些理解

为什么GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);

在 STM32 微控制器的开发中,GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE); 这行代码的作用是禁用 JTAG(Joint Test Action Group)接口,同时保留 SWD(Serial Wire Debug)接口,下面从背景、目的、影响和使用场景几个方面详细解释这样做的原因。

背景知识

  • JTAG 接口:是一种国际标准测试协议,主要用于芯片内部测试及对系统进行仿真、调试。在 STM32 中,JTAG 接口使用多个 GPIO 引脚来传输测试和调试信号,例如 TMS(测试模式选择)、TCK(测试时钟)、TDI(测试数据输入)、TDO(测试数据输出)等。
  • SWD 接口:是 ARM 公司开发的一种调试接口,它是一种串行调试协议,相比 JTAG,SWD 只需要两根线(SWDIO 和 SWCLK)就可以完成调试功能,占用的引脚资源更少。

使用这行代码的目的

1. 节省引脚资源

STM32 的引脚数量是有限的,而 JTAG 接口需要占用多个 GPIO 引脚。在一些对引脚资源要求较高的应用中,可能需要将原本用于 JTAG 接口的引脚释放出来,用于其他功能。通过调用 GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE); 可以禁用 JTAG 接口,使得这些引脚可以作为普通 GPIO 引脚或者其他复用功能引脚使用。

2. 简化硬件设计

SWD 接口只需要两根线,相比 JTAG 接口,硬件连接更加简单。在一些小型项目或者对硬件体积有严格要求的应用中,使用 SWD 接口可以减少电路板上的布线复杂度,降低硬件成本。同时,即使禁用了 JTAG 接口,仍然可以通过 SWD 接口对芯片进行调试和编程,不会影响开发和调试工作。

代码执行后的影响

当执行 GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE); 后,原本用于 JTAG 接口的引脚(如 PA13、PA14、PA15、PB3、PB4 等)将被释放,可以重新配置为其他功能。而 SWD 接口(通常使用 PA13 和 PA14 引脚)仍然可以正常使用,用于芯片的调试和编程。

使用场景举例

1. 引脚资源紧张的项目

例如在一些小型的嵌入式系统中,需要连接多个传感器、执行器等外部设备,引脚资源非常紧张。此时可以禁用 JTAG 接口,将相关引脚用于连接外部设备,以满足系统的功能需求。

2. 追求硬件简洁的设计

在一些对硬件体积和成本有严格要求的产品中,如智能手环、无线传感器节点等,希望尽可能简化硬件设计。使用 SWD 接口可以减少电路板上的布线和元器件数量,降低产品的体积和成本。

以下是一个简单的示例代码,展示了如何使用这行代码:

#include "stm32f10x.h"

int main(void)
{
    // 使能AFIO时钟
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);

    // 禁用JTAG接口,保留SWD接口
    GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);

    // 后续可以将释放的引脚配置为其他功能
    // ...

    while (1)
    {
        // 主循环
    }
}

需要注意的是,在调用 GPIO_PinRemapConfig 函数之前,需要先使能 AFIO(Alternate Function I/O)时钟,因为引脚重映射功能是由 AFIO 模块控制的。

GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3, ENABLE);

在 STM32 微控制器的开发中,GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3, ENABLE); 这行代码的作用是对定时器 3(TIM3)的引脚进行部分重映射操作,下面从引脚重映射概念、代码功能、使用原因、代码示例及注意事项几个方面详细解释。

引脚重映射概念

STM32 的很多外设功能可以通过不同的 GPIO 引脚来实现,这就是引脚重映射的概念。芯片为了提高引脚使用的灵活性和适用性,将一些常用外设的功能信号分配到了多个不同的引脚上。通过引脚重映射功能,开发者可以根据实际的硬件设计需求,选择合适的引脚来连接外设,避免引脚冲突。

代码功能

GPIO_PinRemapConfig 是 STM32 标准库中的一个函数,用于配置引脚的重映射功能。GPIO_PartialRemap_TIM3 是一个宏定义,表示对定时器 3 进行部分重映射。当调用 GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3, ENABLE); 时,就开启了定时器 3 的部分重映射功能,将定时器 3 的部分通道信号重新映射到其他引脚上。

以 STM32F1 系列为例,定时器 3 默认的通道引脚分配如下:

  • TIM3_CH1 -> PA6
  • TIM3_CH2 -> PA7
  • TIM3_CH3 -> PB0
  • TIM3_CH4 -> PB1

在进行 GPIO_PartialRemap_TIM3 部分重映射后,引脚分配会变为:

  • TIM3_CH1 -> PB4
  • TIM3_CH2 -> PB5
  • TIM3_CH3 -> PB0
  • TIM3_CH4 -> PB1

使用原因

1. 避免引脚冲突

在实际的硬件设计中,可能会出现某些默认的外设引脚已经被其他功能占用的情况。例如,PA6 和 PA7 引脚可能已经被用于连接其他传感器或者设备,此时就可以通过部分重映射功能,将定时器 3 的通道 1 和通道 2 重映射到 PB4 和 PB5 引脚上,从而避免引脚冲突。

2. 优化硬件布局

根据电路板的布线需求或者外设的连接位置,可能需要将定时器的引脚调整到更合适的位置。通过引脚重映射,可以使硬件布局更加合理,减少电路板上的布线复杂度。

代码示例

以下是一个简单的示例代码,展示了如何使用定时器 3 的部分重映射功能:

#include "stm32f10x.h"

void TIM3_PWM_Init(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;
    TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
    TIM_OCInitTypeDef TIM_OCInitStructure;

    // 使能相关时钟
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO, ENABLE);
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);

    // 开启定时器3的部分重映射
    GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3, ENABLE);

    // 配置重映射后的GPIO引脚为复用推挽输出
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOB, &GPIO_InitStructure);

    // 定时器3基本参数配置
    TIM_TimeBaseStructure.TIM_Period = 999;
    TIM_TimeBaseStructure.TIM_Prescaler = 71;
    TIM_TimeBaseStructure.TIM_ClockDivision = 0;
    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
    TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);

    // 定时器3通道1和通道2的PWM模式配置
    TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
    TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
    TIM_OCInitStructure.TIM_Pulse = 500;
    TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;

    TIM_OC1Init(TIM3, &TIM_OCInitStructure);
    TIM_OC2Init(TIM3, &TIM_OCInitStructure);

    // 使能定时器3
    TIM_Cmd(TIM3, ENABLE);
}

int main(void)
{
    TIM3_PWM_Init();

    while (1)
    {
        // 主循环
    }
}

注意事项

  • 使能 AFIO 时钟:在进行引脚重映射操作之前,必须先使能 AFIO(Alternate Function I/O)时钟,因为引脚重映射功能是由 AFIO 模块控制的。
  • 检查芯片手册:不同的 STM32 芯片系列,其引脚重映射的规则和可用的重映射选项可能会有所不同,在使用时需要仔细查阅芯片的数据手册。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值