# 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)