0 缘起

  前段时间一直在用的ST-Link突然出问题了,想着不能随便浪费了,于是试图拆开设备看看内部是怎么实现的,以下是折腾记录。

1 记录

  仿真器可以说是开发STM32非常有用的工具之一了,之前我一直是在用那种十几块钱的STLink v2模块,如下图所示。
请添加图片描述
但是最近在使用它的时候,直接不能识别USB设备了。。。。在这里插入图片描述
说实话,看到这个我基本觉得这个STLink寄了,上网一搜,发现这种STLink是盗版的,稳定性不行,可能今天用着明天就坏了。。。但是,我还是本着好奇的想法,把这个STlink拆开了,直接拔掉它外表的套子就行。
请添加图片描述
然后意外发现其核心芯片竟然就是STMF103C8U6(和常见的C8T6不一样的地方只有封装,它的焊盘相对更短),而且还预留了四个引脚,(用万用表的通断档对照C8T6的引脚测了一下,发现就是VCC,SWIO,SWCLK,GND四个引脚)感觉和一般的单片机开发板没什么区别,于是就想着用另一个好的STLink来下载程序,于是,一晚上的折腾就开始了。。。
  首先是发现新买的STLink竟然显示无法连接!一开始以为是坏STlink导致的,然后插回好的C8T6的开发板,竟然还是无法连接!!!当时就觉得是不是这个新的STLink也有问题,然后照着报错信息(包括没有检测到目标板、内部指令错误等问题)在网上找了一通,各种教程都试了,都不好使,于是又试了一下另一个Jlink,发现可以检测到,但是无法下载程序,当时就懵逼了,以为这些仿真器都坏掉了。。。总之当时心情非常糟糕,也就没再研究了。第二天白天脑子清醒了再去试,这才基本搞懂了之前遇到的问题。

2 总结

  故事到此结束,一些感受和总结:

  • 如果实在解决不了问题,建议和朋友一起看或者等自己脑子清醒、心态平和的时候再仔细研究一下,这点很重要!
  • 网上买的那种便宜的STLink确实稳定性不好,(也不保证贵的一定好)很有可能突然就出现类似于我遇到的问题,所以最好有备件可用。

3 基本使用【重点】

3.1 基本概念

  在了解仿真器的基本使用前,首先要区分一些基本的概念。

  • 仿真调试的协议/端口
    尽管支持仿真的设备很多,但其实使用的协议大抵都是一样的。主要有两种:JTAGJoint Test Action Group,联合测试行动小组)是一种国际标准测试协议(IEEE 1149.1兼容),主要用于芯片内部测试;还有一种是SWDSerial Wire Debug,串行调试)。
    其中JTAG协议并没有确定的引脚和端口,目前网上流传的20pin的端口是SEGGER公司的jlink定义的JTAG接口。,如下图所示
    在这里插入图片描述
    可以看到,JTAG主要有这些信号:TDI,TMS,TCK,TDO,分别对应数据输入,模式选择,时钟,数据输出,复位管脚可不接。
      而SWD接口相对简洁一些,只需要两个信号:SWDIO,SWCLK,分别对应数据和时钟。

  • 仿真器型号
    基于以上协议,产生了很多支持这些协议的调试仿真设备。如ST-Link(ST官方出品),Jlink(SEGGER公司出品),ULink(ARM/KEIL公司出品)等,有些只支持一种协议,有些两种协议都支持,需要根据设备手册来判断。

  • 参考电平VTref
    从上面这张图可以看出,两种接口都有VTref引脚,这个引脚必须连接,目的是为了使芯片逻辑电平与调试器的逻辑电平一致,避免逻辑错误,甚至对设备造损坏。因此,这个引脚一般连接芯片的VCC,但不能靠VTref引脚来供电,而是需要额外的供电。
    在Jlink中,可以通过眺帽对这个参考电压的引脚进行设置,如下图所示。
    在这里插入图片描述

3.2 使用方法

  熟练掌握使用方法是避免很多问题和疑惑的最好途径。
  首先将仿真器连接到开发板,注意供电的问题,另外boot引脚记得设置好,一般是设置成从主闪存运行
在这里插入图片描述

然后打开一个Keil项目,点击魔法棒,在Debug页面中选择使用的仿真器型号,再点击旁边的settings按钮,如下图所示。
在这里插入图片描述
以STLink为例,如果你①插上了STLink;②安装了STLink的驱动;③STLink与目标板接线没有问题;④目标开发板上电了,那么在settings中就能看到检测到的目标板芯片的型号。如果没有的话,就按照上面的顺序依次检查吧。
在这里插入图片描述
另外,还需要注意的是下面的port选项,到底是选择SWD协议还是JTAG协议。

  • 仿真器下载完程序不执行?
    这是很多初学者可能会遇到的问题,其实也是仿真器的设置没弄好,参考以下设置即可解决。在这里插入图片描述在这里插入图片描述

    注意:这里两步都要设置!

  • 拓展:STLink上面的四个接口是什么?
      在使用那种白色的STLink时,突然好奇上面的四个引脚是什么?即下图的红色框中的引脚。
    在这里插入图片描述
    一开始猜测是类似于那种小型的STLink的四根线,但是通过查找资料发现并不是,它是SWIM协议,一般用于仿真调试STM8芯片。找资料的过程中,顺便找了一张引脚图,如下所示。
    在这里插入图片描述

4 高级使用——仿真【也是重点!】

  之前对仿真器的认识其实一直还停留在下载程序上面,但是最近才发现其实仿真调试功能才是最好用的。
  使用方法也很简单,以Keil为例,正常连接仿真器,然后直接点击右上角的红色debug按钮即可。
在这里插入图片描述
这个默认会从main函数开始仿真,然后一般点击左上角的几个按钮即可。
在这里插入图片描述
从左至右分别是步入(如果有函数调用,会进入到函数实现,“向内挖掘”),步进(当前跳过下一语句,“平级跳过”),步出(跳出当前域,如果进入到某个函数执行过程中,步出可以回到该函数调用的位置,“向外跳出”),运行到光标所在位置

  此外,右下角窗口是监视窗口,主要用于查看程序执行过程中的变量
在这里插入图片描述

如果右下角监视窗口看不到的变量,可以在编辑器上对应变量上面右键,将其添加到监视窗口,如下所示。
在这里插入图片描述

  除此之外,在debug进入到某些函数中时,所定义的局部变量在右下角显示<not in scope>,这是因为编译器把代码优化掉了,直接导致在仿真过程中变量根本没有分配内存,也就无法查看变量值
  解决办法很简单,就是在变量定义前加上volatile关键词,这样程序在读取该变量时一定会从内存中读取,而不是cpu的寄存器。

参考链接

5 遇到的问题和解决办法

5.1 使用JLink提示“the connected j-link is defective”

  这个问题也是那天测试JLink时遇到的,这个问题是Jlink固件和驱动不匹配,一般是固件版本低于驱动版本,因此解决这个问题也是两种方法:升级固件或者降低驱动等级。但是听说升级Jlink固件可能会造成不可逆的后果,而且操作也比较麻烦,所以一般是采用降低驱动等级的方法。参考这个教程可以下载到更低版本的驱动,然后替换掉Keil安装目录下(Keil_v5/ARM)的Segger文件夹即可。
  但是!需要注意!!! 在替换根目录下的文件夹时,一定一定一定要先备份,因为很有可能替换之后你的Keil就打不开了,或者是闪退,这样你就得重装一遍,非常麻烦!
  相比于自己一个一个版本去试,更方便的还是在网上下载那种已经确定可以用的文件夹,这里推荐一个资源。没有币的可以考虑一下某宝。

5.2 拓展:如何修复STLink或者自己自制一个STLink

  在遇到前文提到的那个USB设备无法识别的问题之后,我当时有点不甘心,想着有没有什么方法可以复原它,在网上找了很多资料,这里简单总结一下,有兴趣的朋友可以按照教程试一下。

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐