SWJ端口复用

SWJ调试端口脚

STM32F10xxx中所包含的SWJ调试端口脚如下表:(参考手册)

         其中PA13以及PA14的主功能为JIMS/SWDIO以及JTCK/SWCLK,即就是我们在使用ST-Link下载程序时的数据传输端口,这两个口的复用功能为本身的GPIO口。如果将这两个端口的主功能关闭那么ST-Link将无法下载程序到STM32,所以要慎重关闭。

PA15、PB3、PB4端口复用功能如下表:

 这三个引脚可以关闭主功能启用重映射功能。

keil 端口复用

STM32中控制端口复用的寄存器是AFIO,所以要先打开AFIO的时钟。

RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);

再调用复用端口的函数。(GPIO_PinRemapConfig())

GPIO_PinRemapConfig()参数

假设需要使用PA15、PB3、PB4的GPIO口,可查阅STM32中文参考手册调试端口映像。

若要保证PA13、PA14不关闭SW调试的条件下,由上表可得出我们仅需要关闭JTAG-DP、启用SW-DP,即就是将010写入SWJ_CEG[2:0]寄存器。若使用库函数控制即就是选用下面这个参数

 

代码 

GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE);

若要使用PA15、PB3、PB4中的定时器通道,如TIM2_CH1_ETR等则还需要配置定时器复用功能重映射,在此列举TIM2的复用功能重映射表(STM32中文参考手册)

由上表可看出若要使用PA15的TIM2_CH1_ETR复用功能则需选用部分重映像1或完全重映像。

部分重映像1

GPIO_PinRemapConfig(GPIO_PartialRemap1_TIM2,ENABLE);

完全重映像

GPIO_PinRemapConfig(GPIO_FullRemap_TIM2,ENABLE);

综上,使用SWJ端口复用的总体配置代码:

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
//初始化定时器、GPIO、AFIO


//GPIO_PinRemapConfig(GPIO_FullRemap_TIM2,ENABLE);
GPIO_PinRemapConfig(GPIO_PartialRemap1_TIM2,ENABLE);//若复用GPIO口则不需要这行代码。
GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE);
//关闭JTAG,启用SW,选中部分重映像1.

GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStructure);
//初始化PA15
TIM_InternalClockConfig(TIM2);//初始化定时器
	
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;
TIM_TimeBaseInitStruct.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInitStruct.TIM_Period = 100 - 1;   //ARR
TIM_TimeBaseInitStruct.TIM_Prescaler = 720 - 1; //PSC
TIM_TimeBaseInitStruct.TIM_RepetitionCounter = 0;
TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInitStruct);//初始化时基单元,在输出PWM时初始化,若仅使用GPIO口功能不会用到,与此无关。

TIM_OCInitTypeDef TIM_OCInitStruct;
TIM_OCStructInit(&TIM_OCInitStruct);
TIM_OCInitStruct.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInitStruct.TIM_OCPolarity =TIM_OCPolarity_High;
TIM_OCInitStruct.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStruct.TIM_Pulse = 0;       //CCR
TIM_OC1Init(TIM2,&TIM_OCInitStruct);	
//初始化定时器,此处为输出PWM时使用的参数。

TIM_Cmd(TIM2,ENABLE);

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值