使用GPIO_Remap_SWJ_JTAGDisable后依然无法使用SWD进行调试解决办法

本文记录了一位工程师在使用STM32F103RCT6主控板时遇到的问题,即需要关闭JTAG功能但保留SWD调试接口。常规配置不起作用,通过检查硬件、查阅资料和直接操作寄存器,最终发现需要先开启全功能JTAG,再禁用JTAG复用,使得SWD能够正常使用。问题解决过程中强调了硬件检查、库函数理解及直接寄存器操作的重要性。
摘要由CSDN通过智能技术生成

背景故事

STM32主控板(STM32F103RCT6)预留了SWD接口用于调试,但JTAG的其他引脚PA15 PB3、PB4又有了其他用途,需要关闭JTAG部分功能,但保留SWD功能,按照常规方式配置后,依然SWD无法使用。

常规方式

先附上正常配置方式如下:

GPIO_InitTypeDef GPIO_InitStructure;
 
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
 
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); //打开复用时钟,注意此处时钟要先与从映射开启
GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE); //调用重映射函数
 
 // 释放普通IO
GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed   = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_15 ;
GPIO_Init(GPIOA, &GPIO_InitStructure);
 
GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed   = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_3 ;
GPIO_Init(GPIOB, &GPIO_InitStructure);
 
GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed   = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_4 ;
GPIO_Init(GPIOB, &GPIO_InitStructure);

问题描述

按照上述配置,我的主控板,依然出现无法使用SWD的情况,查了很多资料依然无法解决。

问题解决

  1. 首先想办法排除硬件问题,这个主要靠经验,我这边用万用表测了swd接口电压,Jlink的地与主控的地的连通性,单片机SWDIO和CLK引脚与jlink的连通性,并且检查了MDK软件读取jlink是否正常;
  2. 然后查资料排除自己软件的问题;
  3. 后来只能怀疑到库函数上。考虑直接用寄存器操作;说干就干,翻出STM32F103中文参考手册,
    在这里插入图片描述
    由上述可查询到 GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE) 该功能的寄存器实现方式为 AFIO->MAPR |= 0x02000000
    修改代码如下:
GPIO_InitTypeDef GPIO_InitStructure;
 
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
 
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); //打开复用时钟,注意此处时钟要先与从映射开启
// GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE); //调用重映射函数
GPIO_PinRemapConfig(GPIO_Remap_SWJ_NoJTRST, ENABLE);			// 先使能全功能的JTAG,再复用其他引脚
AFIO->MAPR |= 0x02000000 //调用重映射函数
 
 // 释放普通IO
GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed   = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_15 ;
GPIO_Init(GPIOA, &GPIO_InitStructure);
 
GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed   = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_3 ;
GPIO_Init(GPIOB, &GPIO_InitStructure);
 
GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed   = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_4 ;
GPIO_Init(GPIOB, &GPIO_InitStructure);

最终测试通过。

注意事项

  1. 在上述代码中遇到一个容易忽略的坑点:
    在这里插入图片描述
    所以要注意 AFIO时钟需要先打开,再进行引脚从映射才能生效。
  2. 单单使用AFIO->MAPR |= 0x02000000 还不够,需要先开启全功能的JTAG功能,GPIO_PinRemapConfig(GPIO_Remap_SWJ_NoJTRST, ENABLE);具体原因暂时不知道,这个是经验试出来的。

总结

不能全信库函数,硬件还是容易遇到问题,可能是我的库没有更新到最新,也有可能是个库函数的bug,暂时没时间研究,就先这样吧。
对于该功能我研究的也不深,希望懂的朋友能进一步解惑。

·
·
·

欢迎各位老铁一键三连,本号后续会不断更新树莓派、人工智能、STM32、ROS小车相关文章和知识。

大家对感兴趣的知识点可以在文章下面留言,我可以优先帮大家讲解哦

欢迎大家光临我的淘宝小店,会定期推出教程中使用的物美价优的硬件,你的光临就是对我的支持

原创不易,转载请说明出处。

  • 11
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

玩转智能机器人

但行好事,莫问前程,日拱一卒

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值