仿真器与调试器的区别
Last updated
Last updated
所谓的仿真就是模拟程序的运行,观察程序运行情况和调试BUG,分为硬件仿真和软件仿真
软件仿真:通过KEIL等IDE进行纯虚拟化的仿真,无需硬件,带来的弊端是仿真结果不直观。
硬件仿真:通过一款实际硬件仿真器完成仿真,例如51的仿真器,结果直观,弊端是通常一款仿真器只能仿真对应的一款芯片,因此成本高昂。
为什么需要仿真器?
答: 为了调试BUG,但嵌入式芯片又没法像在PC端调试PC端程序那样单步执行,因此出现了仿真器。
前面说了,仿真器是由于无法实现嵌入式芯片的调试而出现的,但由于价格等原因,终究不是一个好的解决方法,因此为了实现真正的调试,调试器随之出现。 欲实现嵌入式芯片的调试,单步执行,需满足两个条件:
一是芯片支持单步执行等调试功能;
二是需要通过某些硬件实现PC端与被调试芯片的联系,以便在PC端完成对芯片的调试控制以及调试结果的反馈。
现如今很多芯片都支持调试,现在很多情况下说的仿真其实就是调试,只有向51那样比较老旧的芯片不支持调试(实际现在的51有的芯片也有了)
不用的芯片支持调试接口不同,配套的调试器也因此不同,常见的有以下两种,也是STM32支持的两种调试接口:
JTAG: 几乎所有的芯片都支持该接口,是半导体行业通用的调试接口标准,功能完善,标准的JTAG接口是4线:TMS、TCK、TDI、TDO,分别为模式选择、时钟、数据输入和数据输出线,可选连接TRST、RESET复位信号和RTCK(同步时钟)信号。
SWD: 串行调试(Serial Wire Debug),是ARM内核调试器的一种通信协议SWD模式比JTAG在高速模式下面更加可靠,而SWD用到的接口数比较少,除了gnd,vcc只需要SWDIO,SWCLK,占用的资源更少。
不同的调试器支持的调试接口不同,根据需求选择。
ST-Link仿真器
ST(意法半导体)官方出版了3种仿真器:ST-LINK、ST-LINK/V2,STLINK-V3SET。针对于意法半导体STM8和STM32系列芯片。支持SWIM / JTAG / SWD下载。(SWIM协议是一种用于STM8微控制器的调试/编程协议。)
JLink仿真器
J-Link是德国 SEGGER 公司的仿真器,得到所有主流的 IDE 的支持。支持SWIM / JTAG / SWD下载。
J-Link OB
(The On-Board Debug Probe),通常被设计到各大公司的评估板上(“on-board”),J-Link- OB的下载调试器具备 USB 通信功能可以与 PC 通信,另一端通过 JTAG 或 SWD 方式与可支持器件通信,完成调试下载任务。
J-Link- OB 改造版
实际上这就是淘宝上常见的J-Link- OB,价格低廉。 J-Link-OB改造版与原J-Link-OB版少了JTAG通信方式,只保留SWD模式。
CMSIS-DAP
软硬件开源,支持JTAG模式和SWD模式,学习的最佳对象!ARM官方推出,这两三年,含量在火箭式起飞官方版本采用的芯片是lpc系列的,现在所使用的基于stm32的实现,基本都是基于国外一个叫做X893的大神移植到F103C8T6的版本, 自制参考
优点:开源、虚拟串口、免驱。大爱的虚拟串口,很爽、很爽, (有些下载器也有虚拟串口),更爱它开源没心病~~。
缺点:真没啥缺点,能拼JLink的稳定, 也能拼ST-Link的便宜,还没版权问题! 109K代码烧录实测10秒,也算杠杠的吧。
DAP-Link
CMSIS-DAP的升级版。优点:拖拽烧录、升级固件。包括了CMSIS-DAP的优点:开源+虚拟串口+免驱。
链接好硬件线路后,安装仿真器驱动Setup_JLinkARM_V468.exe,驱动安装之后,桌面出现两个软件,分别是 J-Link 控制检测程序和 J-Flash 下载程序。SEGGER 公司提供的 J-Flash 软件可以通过 J-Link 下载(烧写,烧录,编程)数据文件 HEX。(貌似安装MDK时就安装了,我并没有安装也可以使用) 点击上方菜单栏的小锤子,选择Debug界面,打开以下窗口,选择好对应调试器--J-LINK/J-TRACE Cortex
点击setting打开窗口,选择调试接口为SW,如果出现下面这种情况,SWD框没有出现ID是不正常的,通常是线接错了。
正常情况如下所示,就可以进行调试与下载了。
下载完成后,在想要插入的断点处按下快捷键F9,插入断点,点击以下按钮或CTRL+F9快捷键打开调试(调试使用的是编译生成的二进制文件axf)
之所以有可能需要禁用调试器,是因为调试器会占用一些IO接口,有时候这些IO不得不需要作为其他外设的IO使用,因此需要去禁用它。以F103ZET6为例,参考手册第29章
SWD调试接口: PA13、PA14共两个引脚。 JTAG调试接口: PA13、PA14、PA15、PB3、PB4共五个引脚。
我们需要去操作复用重映射和调试I/O配置寄存器(AFIO_MAPR)的SWJ_CFG位去完成调试接口的开启与禁用,
该位复位状态下全0,开启两种调试接口,我们无需在启动时手动打开调试接口。
在HAL库下欲禁用两个调试接口,使用以下代码,先开启AFIO时钟,这样才可以读写AFIO寄存器,然后操作AFIO_MAPR)的SWJ_CFG位禁用全部调试接口
那如果我们需要去禁用JTAG而开启SW怎么办呢?可以使用其他的函数,可选如下
__HAL_AFIO_REMAP_SWJ_ENABLE()
宏定义用于启用SWJ调试接口,配置SWJ_CFG位为RESET。在启用SWJ调试接口时,可以同时使用JTAG-DP和SW-DP。
__HAL_AFIO_REMAP_SWJ_NONJTRST()
宏定义用于启用SWJ调试接口,但不使用NJTRST信号。配置SWJ_CFG位为NOJNTRST。在启用SWJ调试接口时,可以同时使用JTAG-DP和SW-DP,但NJTRST信号被禁用。
__HAL_AFIO_REMAP_SWJ_NOJTAG()
宏定义用于启用SW-DP调试接口,禁用JTAG-DP调试接口。配置SWJ_CFG位为JTAGDISABLE。在启用SW-DP调试接口时,可以使用SW-DP进行调试和编程,但无法使用JTAG-DP。
__HAL_AFIO_REMAP_SWJ_DISABLE()
宏定义用于禁用SWJ调试接口。配置SWJ_CFG位为DISABLE。在禁用SWJ调试接口时,无法使用JTAG-DP和SW-DP进行调试和编程。