# 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 個連接埠: ![image](https://hackmd.io/_uploads/SySWW84mR.png) 這是因為 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 序列傳輸用: ![image](https://hackmd.io/_uploads/HyA7WLV70.png) 在右側選取 libusbk(v3.1.0.0) 按下方的 **Replace Driver** 即可更換驅動程式, libusbk 是可以讓電腦可以和裝置透過 USB 進行低階操做的驅動程式: ![image](https://hackmd.io/_uploads/Skgw-U47R.png) 這個更換動作需要一點時間, 更換完成後在左側確認無誤, 在**裝置管理員**中就會看到只剩下兩個連接埠裝置了: ![image](https://hackmd.io/_uploads/Hkfub8NmR.png) 另外一個原本錯用驅動程式的裝置現在會出現在 **libusbK USB Devices** 項目下: ![image](https://hackmd.io/_uploads/BkW9Z84XR.png) 有關硬體除錯的功能, 可以參考[ESP32 S3 硬體除錯](/H6KdGVeqSi245tGAdQWzYQ)。 ## 設定程式碼如何使用 USB ESP32-S3 內建的 USB 可以用來傳輸資料、也可以用來上傳程式, 不過一開始使用的時候, 如果沒有弄清楚 Arduino IDE 中『**工具**』功能表中的選項, 可能會覺得莫名其妙。主要要設定的就是以下三個選項: ![image](https://hackmd.io/_uploads/BJCBYdE7C.png) - [**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** 如果沒有選對, 程式就無法正常執行。