# ESP32-S3-DevKitC-1.1 上傳程式選項
ESP32-S3 的開發板通常會有兩個 USB 插孔, 這是因為 ESP32-S3 本身具備有 USB 介面, 所以其中一個插孔是與 ESP32-S3 內建的 USB 介面連接, 通常標示為 USB, 這個 USB 介面可以當序列傳輸或是讓 ESP32 扮演鍵盤、滑鼠、隨身碟等 USB 裝置, 同時也提供硬體除錯功能;另一個插孔是連接開發板自己的 USB 轉 UART 晶片, 方便上傳程式碼與當作序列傳輸介面使用, 通常這個插孔會標示為 UART 或是 COM。
## Windows 上錯誤的驅動程式
在 Windows 上如果兩個 USB 插孔都街上傳輸線, 會看到共有 3 個連接埠:

這是因為 Winodws 錯用了驅動程式, 所以把用來除錯的介面, 也就是名稱為 USB JTAG/serial debug unit(interface 2) 的介面當成序列傳輸的裝置。為了之後能夠順利使用硬體除錯功能, 必須使用 [Zadig](https://zadig.akeo.ie/) 工具強制更換驅動程式。
直接[下載該工具](https://github.com/pbatard/libwdi/releases/download/v1.5.0/zadig-2.8.exe)執行後, 選取『**Options/List All Devices**』功能表指令後依照剛剛看到的連接埠名稱選取 **USB JTAG/serial debug unit(interface 2)**, 可以看到目前的驅動程式是 usbser(v1.0.0), 表示幫成 serial 序列傳輸用:

在右側選取 libusbk(v3.1.0.0) 按下方的 **Replace Driver** 即可更換驅動程式, libusbk 是可以讓電腦可以和裝置透過 USB 進行低階操做的驅動程式:

這個更換動作需要一點時間, 更換完成後在左側確認無誤, 在**裝置管理員**中就會看到只剩下兩個連接埠裝置了:

另外一個原本錯用驅動程式的裝置現在會出現在 **libusbK USB Devices** 項目下:

有關硬體除錯的功能, 可以參考[ESP32 S3 硬體除錯](/H6KdGVeqSi245tGAdQWzYQ)。
## 設定程式碼如何使用 USB
ESP32-S3 內建的 USB 可以用來傳輸資料、也可以用來上傳程式, 不過一開始使用的時候, 如果沒有弄清楚 Arduino IDE 中『**工具**』功能表中的選項, 可能會覺得莫名其妙。主要要設定的就是以下三個選項:

- [**USB CDC on Boot**](https://docs.espressif.com/projects/arduino-esp32/en/latest/tutorials/cdc_dfu_flash.html#usb-cdc):指的是你的程式要不要使用內建的 USB, 不論是要當序列輸出入或是 USB 裝置都要開啟這個選項, 這樣編譯出來的結果才會在模組啟動時啟用內建的 USB。
- **USB Mode**:模組啟用 USB 時要當哪一種用途:
- **UART0/Hardware CDC**:當成序列輸出入, 這時程式中 Serial 就是這個連接埠, 開發板上用 USB 轉 UART 晶片的連接埠會從 Serial 變成 Serial0。
- **USB-OTG(TinyUSB)**:當成 USB 裝置, 如果要讓開發板扮演鍵盤、滑鼠等 USB 裝置, 就要設為這個選項。這個選項也可以當序列輸出入用, 在 Windows 上它的連接埠編號會和上個選項的結果不一樣, 但程式碼中序列傳輸的物件名稱與上個選項一樣。
- [**USB DFU on Boot**](https://docs.espressif.com/projects/arduino-esp32/en/latest/tutorials/cdc_dfu_flash.html#usb-dfu):這個選項只有在 **USB Mode** 設為 **USB-OTG(TinyUSB)** 時才能啟用, 但必須在啟用 **USB CDC on Boot** 時才能停用。啟用時會讓模組在啟動時把內建的 USB 設為可上傳韌體到裝置的模式。
要注意的是, 啟用這個選項就無法使用內建的 USB 當序列輸出入。
## 使用內建 USB 上傳程式
簡單來說, 如果想要透過內建的 USB 上傳程式, 可以有兩種作法:
1. 只要按住 Boot 然後按 reset 再放開, 最後放開 Boot, 就可以進入上傳程式的模式, 這時就可以透過內建的 USB 上傳程式。但要記得上傳完後要手動按 reset 才會脫離上傳模式, 執行上傳的程式。
2. 如果想要隨時都可以透過內建的 USB 上傳程式, 不需要先進入上傳程式的模式, 只要先設定這兩個選項再上傳程式:
- **USB Mode** -> **USB-OTG (TinyUSB)**
- **USB DFU On Boot** -> **Enabled**
之後都可以透過內建的 USB 上傳程式, 不過這會讓內建的 USB 無法進行序列傳輸。
如果想要取消 DFU 功能, 只要設定以下選項上傳程式:
- **USB CDC On Boot** -> **Enabled**
- **USB DFU On Boot** -> **Disabled**
之後就只能夠過外部的 USB 轉 UART 上傳程式, 或是透過剛剛解說的方法手動進入上傳模式, 才能從內建的 USB 上傳程式。
## 使用內建的 USB 進行序列傳輸
如果要使用內建 USB 進行序列傳輸, 必須設定以下選項:
- **CDC on Boot** -> **Enable**
- **USB DFU On Boot** -> **Disable**
但要記得 **USB mode** 的設定會讓序列埠編號不一樣。也就是說, 如果要從內建的 USB 進行序列傳輸, 就無法使用 DFU 功能。
## Flash 選項
我自己手邊有兩種 ESP32-S3 的開發板, 一個是樂鑫自己的 [ESP32-S3-DevKitC1 N32R8](https://docs.espressif.com/projects/esp-idf/en/stable/esp32s3/hw-reference/esp32s3/user-guide-devkitc-1.html), 一個是源地工作室的 [YD-ESP32-S3 N16R8](https://github.com/vcc-gnd/YD-ESP32-S3/tree/main) 相容板, 其中:
- ESP32-S3-DevKitC1 N32R8 使用八線 SPI FLASH, 所以 **Flash Mode** 要選 **OPI 80MHz**。
- YD-ESP32-S3 N16R8 使用雙線 SPI FLASH, 所以 **Flash Mode** 要選 **DIO 80MHz**
如果沒有選對, 程式就無法正常執行。