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);