关于STM32的JTAG复用

借CSDN这个平台记录自己遇到和解决的一些问题,与大家一起分享,本人纯属小白,大神无视即可哟。

拿到一块电路板,原理图如下图1所示,JTAG功能口被用作普通IO口,即发生了复用。


                                                                                 图1


如上图1所示,箭头所指部分。LED02使用了JTDO/PB3  ,作为输出口。3.3V连接LED ,电阻分压后连接PB3。

在实际调试中发现,LED无法点亮,PB3拉低失败,MCU的PB3引脚始终有2.2V以上电压存在。

排查硬件故障确认LED以及电阻正常后,怀疑是复用功能导致IO引脚配置失败。仔细检查配置后发现,并无配置错误,观察到IO口的JTDO/PB3复用问题后,查找相关资料。通过添加JTAG复用控制代码,解决存在问题。


	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOD|RCC_APB2Periph_AFIO, ENABLE);  //GPIO B D AFIO 复用

 	GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable , ENABLE);//禁用JTAG, 但是SWD可以正常使用。

完整LED配置代码如下


void LED_Init(void)
{
  //使能时钟
 GPIO_InitTypeDef  GPIO_InitStructure;                  //定义结构体
 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOD|RCC_APB2Periph_AFIO, ENABLE);  //GPIO B D AFIO 复用时钟使能

 GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable , ENABLE);//禁用JTAG,SWD功能正常使用


//PD2
 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;		//引脚pin
 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; 	//推挽输出
 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;	//速度50MHz
 GPIO_Init(GPIOD, &GPIO_InitStructure);			//初始化GPIO D
 
 GPIO_SetBits(GPIOD,GPIO_Pin_2);//PD2 初始状态设置为高电平,LED不被点亮
 
//PB2 PB3 PB4
 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5; 
 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; 	   
 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;	
 GPIO_Init(GPIOB, &GPIO_InitStructure);		
 
 GPIO_SetBits(GPIOB,GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5); 
  
}

//笔记
/*由于在系统硬件设计中,第一功能为JTAG的IO口(JDIO/PB3)被LED占用*/
/*程序初始化IO口后,LED不受开关控制。禁用JTAG 不禁用SWD即可复用PB3*/
/*RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); //第一步,时钟使能*/
/*GPIO_PinRemapConfig(GPIO_Remap_SWJ_Disable, ENABLE);//第二步,禁用SWJ  */
/*GPIO_Remap_SWJ_Disable则是完全禁止SWJ功能,JTAG和SWD都禁止了*/
/*GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable , ENABLE);//禁用JTAG  但是SWD可以使用**/







展开阅读全文

没有更多推荐了,返回首页