# 仿真器与调试器的区别

### 仿真器

所谓的仿真就是模拟程序的运行，观察程序运行情况和调试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，占用的资源更少。

  ![](https://s2.loli.net/2023/02/19/mb62eHyCrYNzAvD.png)

#### 常用的调试器

不同的调试器支持的调试接口不同，根据需求选择。

**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](https://github.com/x893/CMSIS-DAP)的大神移植到F103C8T6的版本， [自制参考](https://blog.csdn.net/weixin_34006872/article/details/113714947)

* 优点：开源、虚拟串口、免驱。大爱的虚拟串口，很爽、很爽, (有些下载器也有虚拟串口)，更爱它开源没心病\~\~。
* 缺点：真没啥缺点，能拼JLink的稳定, 也能拼ST-Link的便宜，还没版权问题！ 109K代码烧录实测10秒，也算杠杠的吧。

**DAP-Link**

CMSIS-DAP的升级版。优点：拖拽烧录、升级固件。包括了CMSIS-DAP的优点：开源+虚拟串口+免驱。

#### Keil5下J-Link OB改造版的使用

链接好硬件线路后，安装仿真器驱动Setup\_JLinkARM\_V468.exe，驱动安装之后，桌面出现两个软件，分别是 J-Link 控制检测程序和 J-Flash 下载程序。SEGGER 公司提供的 J-Flash 软件可以通过 J-Link 下载（烧写，烧录，编程）数据文件 HEX。（貌似安装MDK时就安装了，我并没有安装也可以使用） 点击上方菜单栏的小锤子，选择Debug界面，打开以下窗口，选择好对应调试器--J-LINK/J-TRACE Cortex

![](https://s2.loli.net/2023/02/19/Vub395TsqLGoAHF.png)

点击setting打开窗口，选择调试接口为SW，如果出现下面这种情况，SWD框没有出现ID是不正常的，通常是线接错了。

![](https://s2.loli.net/2023/02/19/wcpIV6sF32ix9hk.png)

正常情况如下所示，就可以进行调试与下载了。

![](https://s2.loli.net/2023/02/19/t48FD2aHgObTVJE.png)

下载完成后，在想要插入的断点处按下快捷键F9，插入断点，点击以下按钮或CTRL+F9快捷键打开调试（**调试使用的是编译生成的二进制文件axf**）

![](https://s2.loli.net/2023/02/19/6HZOSq9zgJsbTMU.png)

### 禁用调试器

> 之所以有可能需要禁用调试器，是因为调试器会占用一些IO接口，有时候这些IO不得不需要作为其他外设的IO使用，因此需要去禁用它。以F103ZET6为例，参考手册第29章
>
> **SWD调试接口：** PA13、PA14共两个引脚。\
> **JTAG调试接口：** PA13、PA14、PA15、PB3、PB4共五个引脚。
>
> <img src="https://s2.loli.net/2023/03/13/hzuDvE1ogPrHp27.png" alt="" data-size="original">
>
> 我们需要去操作复用重映射和调试I/O配置寄存器(AFIO\_MAPR）的SWJ\_CFG位去完成调试接口的开启与禁用，
>
> <img src="https://s2.loli.net/2023/03/13/owsNnAIzTkvmfWc.png" alt="" data-size="original">
>
> 该位复位状态下全0，开启两种调试接口，我们无需在启动时手动打开调试接口。
>
> 在HAL库下欲禁用两个调试接口，使用以下代码，先开启AFIO时钟，这样才可以读写AFIO寄存器，然后操作AFIO\_MAPR）的SWJ\_CFG位禁用全部调试接口
>
> ```
>    __HAL_RCC_AFIO_CLK_ENABLE();
>   __HAL_AFIO_REMAP_SWJ_NOJTAG(); 
> ```
>
> 那如果我们需要去禁用JTAG而开启SW怎么办呢？可以使用其他的函数，可选如下
>
> 1. `__HAL_AFIO_REMAP_SWJ_ENABLE()`宏定义用于启用SWJ调试接口，配置SWJ\_CFG位为RESET。在启用SWJ调试接口时，可以同时使用JTAG-DP和SW-DP。
> 2. `__HAL_AFIO_REMAP_SWJ_NONJTRST()`宏定义用于启用SWJ调试接口，但不使用NJTRST信号。配置SWJ\_CFG位为NOJNTRST。在启用SWJ调试接口时，可以同时使用JTAG-DP和SW-DP，但NJTRST信号被禁用。
> 3. `__HAL_AFIO_REMAP_SWJ_NOJTAG()`宏定义用于启用SW-DP调试接口，禁用JTAG-DP调试接口。配置SWJ\_CFG位为JTAGDISABLE。在启用SW-DP调试接口时，可以使用SW-DP进行调试和编程，但无法使用JTAG-DP。
> 4. `__HAL_AFIO_REMAP_SWJ_DISABLE()`宏定义用于禁用SWJ调试接口。配置SWJ\_CFG位为DISABLE。在禁用SWJ调试接口时，无法使用JTAG-DP和SW-DP进行调试和编程。


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://oceanaparts.gitbook.io/halnote/fang-zhen-qi-yu-tiao-shi-qi-de-qu-bie.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
