---
# System prepended metadata

title: ESP32 S3 硬體除錯
tags: [ESP32]

---

# ESP32 S3 硬體除錯

ESP32 S3 因為有內建 USB JTAG 硬體除錯介面, 所以不需要額外的硬體就可以啟用除錯功能, 不過目前的 Arduino IDE 2.X 版還無法完美支援除錯功能, 必須使用 VSCode 搭配 PlatformIO 才能啟用硬體除錯功能。在 Windows 平台上, 還需要額外的步驟, 替換驅動程式才能使用。以下以我手邊的 [YD-ESP32-S3](https://github.com/vcc-gnd/YD-ESP32-S3/blob/main/IMG/img11.jpg) 為例示範。

## 在 Windows 平台上啟用 ESP32 S3 硬體除錯

首先, 要啟用硬體除錯的專案, 必須在 `platformio.ini` 中加入以下的描述：

```ini
monitor_speed = 115200    ; 除錯介面的傳輸速度
build_type = debug        ; 將專案建置乘除錯用
debug_tool = esp-builtin  ; 使用 ESP32 內建的除錯介面
```

個別接上控制板的兩個 USB, 你會看到總共有三個連接埠的裝置：

![image](https://hackmd.io/_uploads/SySWW84mR.png)

其中標示 "USB JTAG/serial debug unit(interface 2)" 的這個裝置是錯的, 它應該除錯介面, 但是 Windows 把它當成序列傳輸裝置了。我們需要幫它替換驅動程式, 這可以使用 [Zadig](https://zadig.akeo.ie/) 工具軟體完成, 下載後直接開啟：

1. 執行『**Options/List All Devices**』功能表指令：

    ![圖片](https://hackmd.io/_uploads/S1lzDAITp.png)

2. 先在上方選取剛剛看到的 **USB JTAG/serial debug unit (Interface 2)**：

    ![圖片](https://hackmd.io/_uploads/ryi8u0U6a.png)

4. 我參考了[這篇文章](https://mydicedevice.com/?p=514), 在綠色箭頭右邊選 **libusbk**：

    ![圖片](https://hackmd.io/_uploads/Bk2td0Lpa.png)

    但我自己測試選 **libusb-win32** 也可以：
    
    ![圖片](https://hackmd.io/_uploads/S1GuO0L66.png)

    理論上, 選取 **WinUSB** 應該也可以, 這三個驅動程式都是讓你的程式可以直接和 USB 裝置溝通, 不過在我自己的測試中, 選用 **WinUSB** 驅動程式無法正常啟動除錯功能。
    
4. 最後按下 **Replace Driver** 即可：

    ![圖片](https://hackmd.io/_uploads/SJlMtAUpa.png)

5. 置換驅動程式需要一點時間：
    
    ![圖片](https://hackmd.io/_uploads/BJ7DtRITp.png)

    完成後會看到通知：

    ![圖片](https://hackmd.io/_uploads/BkyOKCLa6.png)

6. 你的裝置管理員應該會看到這樣的硬體配置：

    ![圖片](https://hackmd.io/_uploads/Sk5itC8Ta.png)

    最上方就是 USB JTAG 硬體除錯介面, 底下有兩個連接埠, 名字有 Serial 的就是控制板的傳輸介面, 另一個則是除錯介面的傳輸介面。
    
置換完驅動程式後, 就可以在 VSCode 中進入除錯功能:

![圖片](https://hackmd.io/_uploads/HJwoqR8pa.png)

預設它會停在 ESP32 Arduino 框架的主進入點, 也就是 ％homepath%\\.platformio\packages\framework-arduinoespressif32\cores\esp32\main.cpp 檔案中的 app_main 函式：

![圖片](https://hackmd.io/_uploads/ryyhhALpT.png)

你可以在這個時候到你的主程式設定中斷點即可讓程式繼續執行。

如果你在 platformio.ini 檔中設定初始的中斷點, 例如：

```ini
debug_init_break = tbreak setup
```

我自己的測試中啟動除錯功能後, 並不會停在這裡, 程式會直接執行：

![圖片](https://hackmd.io/_uploads/SyVERRUpp.png)

你一樣可以在這個時候設定中斷點, 然後按一下**暫停**鈕, 再按一下**繼續**鈕, 就會停在你設定的中斷點了。不過這個解法不法停在 setup 內, 而且我測試時一定要在除錯後再設定中斷點才能正常運作, 不仍先設定好中斷點, 再啟動除錯。

:::info
網路上看到其它人也遇到[類似的狀況](https://github.com/platformio/platform-espressif32/issues/828#issuecomment-1356873153)。
:::

## 在 Windows 平台上啟用 ESP32 除錯功能

舊的 ESP32 並沒有內建 USB JTAG 硬體除錯功能, 若要使用硬體除錯, 必須仰賴 [ESP-PROG 板](https://docs.espressif.com/projects/espressif-esp-iot-solution/en/latest/hw-reference/ESP-Prog_guide.html), 板子的針腳如下：

![](https://docs.espressif.com/projects/espressif-esp-iot-solution/en/latest/_images/JTAG_pin.png)

ESP32 對應的[腳位](https://docs.espressif.com/projects/esp-idf/en/stable/esp32/api-guides/jtag-debugging/configure-other-jtag.html#configure-hardware)如下：

|ESP-PROG|ESP32|
|---|---|
|TMS|14|
|TCK|13|
|TDO|15|
|TDI|12|
|GND|GND|

同時接上 ESP32 開發板與 ESP-PROG 的 USB 後, 一樣要替換驅動程式, 這次要替換的裝置是 **Dual RS232-HS (Interface 0)**：

![圖片](https://hackmd.io/_uploads/Syk_SkPaa.png)

我手邊的 LOLIN D32 開發板不論置換成 libusb-win32 或是 WinUSB, libusbk 驅動程式都可以正常啟動除錯功能, 而且也可以設定預設的中斷點, 像是：

```ini
debug_init_break = tbreak setup
```

就可以正確地停在 setup 中：

![圖片](https://hackmd.io/_uploads/S1fXLywpT.png)




