尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

Arduino ESP32 使用内置 USB(CDC / DFU)烧录固件完整指南

Arduino ESP32 使用内置 USB(CDC / DFU)烧录固件完整指南 Arduino ESP32 使用内置 USBCDC / DFU烧录固件完整指南【免费下载链接】arduino-esp32Arduino core for the ESP32 family of SoCs项目地址: https://gitcode.com/GitHub_Trending/ar/arduino-esp32导读本文基于 arduino-esp32 官方教程 cdc_dfu_flash.rst系统讲解如何利用 ESP32-S2 / ESP32-C3 / ESP32-S3 / ESP32-C6 / ESP32-H2 等 SoC 内嵌的 USB 外设在不依赖 FTDI、CP210x、CH340 等外部 USB 转串口芯片的前提下直接通过 USB 完成固件烧录与串口监视。读完本文你将掌握 USB DFU 与 USB CDC 两种模式在 Arduino IDE 中的完整配置步骤、各 SoC 的差异与限制以及这些菜单选项在源码与编译层面的底层工作原理并能在自研硬件上移除外部 USB 转串口芯片。一、为什么需要嵌入式 USB 烧录自 ESP32-S2 发布以来Espressif 持续为旗下 SoC 家族完善 USB 外设支持包括 ESP32-C3 与 ESP32-S3。这一新增外设带来了大量新能力其中最直接的价值是无需任何外部 USB 转串口转换器即可直接把固件烧录进 SoC。在传统方案中开发板需要通过 FTDI、CP210x、CH340 等 USB 转 UART 芯片与电脑通信而采用内置 USB 后开发板只需将 SoC 的 USB 引脚D/D-接到 USB 连接器即可。本文教程即围绕这一内嵌 USB 烧录流程展开。当前支持的内嵌 USB 外设 SoC 清单如下见 cdc_dfu_flash.rstSoCUSB 外设支持ESP32-S2CDC 和 DFUESP32-C3仅 CDCESP32-S3CDC 和 DFUESP32-C6仅 CDCESP32-H2仅 CDC重要前提你的开发板必须把 USB 连接器接到 SoC 的嵌入式 USB 引脚上。如果板子上没有 USB 连接器也可以自行把外部 USB 连接器接到 USB 引脚D/D-。本教程仅在上述支持内置 USB 外设的设备上有效使用外部 USB 转串口芯片FTDI、CP210x、CH340 等的开发板不适用。Arduino IDE 中完整的「工具」菜单说明可参考 Tools Menus 参考指南。二、USB DFU设备固件升级协议与烧录方法2.1 什么是 USB DFUUSB DFUDevice Firmware Upgrade设备固件升级是 USB 标准中的一类规范它赋予了设备通过 USB 接口升级固件的能力。在 Arduino ESP32 项目中DFU 被用于将编译好的固件镜像直接烧录进芯片。注意DFU 仅受 ESP32-S2 和 ESP32-S3 支持请对照上文支持的 SoC 表格确认你的芯片。2.2 通过 DFU 烧录固件的三步配置第 1 步手动进入下载模式此步骤仅在首次以该模式烧录固件时需要执行。进入下载模式的方法按住BOOT按钮不放短按并松开RESET按钮松开BOOT按钮。操作成功后系统端口列表里会出现一个新的 USB 设备。在 Arduino IDE 的Port选项中选中这个新设备。第 2 步配置 USB DFU进入 Arduino IDE 的Tools工具菜单将 USB DFU 设置为开机默认模式并用于烧录。ESP32-S2 的配置项USB DFU On Boot→EnableUpload Mode→Internal USBESP32-S3 的配置项USB Mode→USB-OTG (TinyUSB)USB DFU On Boot→Enabled这些菜单选项在 boards.txt 中均有明确的定义与默认值。例如 ESP32-S2 的默认配置为 DFU 关闭esp32s2.menu.DFUOnBoot.defaultDisabled对应build.dfu_on_boot0开启后为esp32s2.menu.DFUOnBoot.dfu.build.dfu_on_boot1而 ESP32-S3 的 DFU 选项描述为Enabled (Requires USB-OTG Mode)见 boards.txt即必须先切换到 USB-OTG (TinyUSB) 模式这与教程第 2 步要求先设USB Mode的步骤完全一致。第 3 步烧录固件现在你可以正常上传 sketch 到设备。烧录完成后需要手动复位设备一次。两点重要提醒在 USB DFU 模式下USB 端口不能用于串口日志输出它只负责烧录。若要使用串口输出请改用 CDC 方案。如果你只想用 USB DFU 配合手动下载模式偶尔升级固件完全没有问题但如果进行日常开发调试建议优先使用 USB CDC。三、USB CDC串口通信、烧录与监视一体方案3.1 什么是 USB CDCUSB CDCCommunications Device Class通信设备类允许设备像普通串口接口一样与主机通信。在受支持的芯片上这一模式既能烧录固件也能像使用外部串口接口那样监视设备输出是日常开发的首选。3.2 通过 CDC 烧录与监视的配置步骤第 1 步手动进入下载模式与 DFU 模式类似首次使用需要手动进入下载模式按住BOOT按钮不放短按并松开RESET按钮然后松开BOOT。操作成功后在系统端口列表中选择新出现的 USB 设备即 Arduino IDE 的Port选项。第 2 步配置 USB CDC在 Arduino IDE 的Tools工具菜单中完成以下设置ESP32-S2USB CDC On Boot→EnabledUpload Mode→Internal USBESP32-C3USB CDC On Boot→EnabledESP32-S3USB CDC On Boot→EnabledUpload Mode→UART0 / Hardware CDC第 3 步烧录并监视上传你的 sketch。首次烧录完成后需要手动复位一次设备之后每次烧录和监视都不再需要手动进入下载模式也不需要手动复位。监视设备时选中 USB 端口打开Serial Monitor串口监视器工具并按代码中Serial.begin()设置的波特率选择通常为115200。关于 CDC 在「工具」菜单中的官方说明见 tools_menu.rst当USB CDC On Boot为Enabled时设备一经 USB 连接系统串口列表中就会出现一个新的串口端口应使用该新端口进行烧录同时该端口也可用于Serial Monitor调试。CDC 模式下Serial.print(Hello World!)通过 USB CDC 输出若想走 UART0 输出可使用Serial0.print(Hello World!)。四、各 SoC 配置差异速查与菜单背后的编译原理4.1 菜单选项 → 编译宏的映射在 Arduino IDE 中勾选的菜单选项最终会由 platform.txt 中的build.extra_flags转换为编译期宏交给源码处理。各目标芯片的映射关系如下SoCextra_flags 定义ESP32-S3-DARDUINO_USB_MODE{build.usb_mode} -DARDUINO_USB_CDC_ON_BOOT{build.cdc_on_boot} -DARDUINO_USB_MSC_ON_BOOT{build.msc_on_boot} -DARDUINO_USB_DFU_ON_BOOT{build.dfu_on_boot}ESP32-S2-DARDUINO_USB_MODE0 -DARDUINO_USB_CDC_ON_BOOT{build.cdc_on_boot} -DARDUINO_USB_MSC_ON_BOOT{build.msc_on_boot} -DARDUINO_USB_DFU_ON_BOOT{build.dfu_on_boot}ESP32-C3 / C6 / H2 / C5 / C61-DARDUINO_USB_MODE1 -DARDUINO_USB_CDC_ON_BOOT{build.cdc_on_boot}无 DFU 选项ESP32-P4与 ESP32-S3 类似含usb_mode、cdc_on_boot、msc_on_boot、dfu_on_boot这正是不同 SoC 菜单选项数量不同的根源只有具备 USB-OTGTinyUSB能力的芯片ESP32-S2/S3/P4才会暴露Upload Mode、USB Mode、USB DFU On Boot等选项而 ESP32-C3/C6/H2 等仅暴露USB CDC On Boot。4.2 关键菜单项的 boards.txt 证据ESP32-S2 的Upload Modeboards.txt默认UART0use_1200bps_touchfalse切换为Internal USBcdc后启用use_1200bps_touchtrue与wait_for_upload_porttrue即通过 1200bps 触摸touch信号触发芯片进入下载模式并等待上传端口出现这正是「Internal USB 上传无需手动进入下载模式」的实现机制。ESP32-S3 的USB Modeboards.txt默认USB-OTG (TinyUSB)usb_mode0另有Hardware CDC and JTAGusb_mode1选项其Upload Mode默认值为UART0 / Hardware CDC另有USB-OTG CDC (TinyUSB)同样启用use_1200bps_touchtrue。ESP32-C3 的USB CDC On Bootboards.txt默认Disabledcdc_on_boot0可切换为Enabledcdc_on_boot1。注意部分开发板厂商如 weact_studio_esp32c3会将默认值改为Enabled具体以所选开发板菜单为准。4.3 源码层app_main 如何响应这些宏这些编译宏在 main.cpp 的app_main()中被实际消费启动流程为#if ARDUINO_USB_CDC_ON_BOOT !ARDUINO_USB_MODE Serial.begin(); // USB CDC 串口初始化TinyUSB 模式 #endif #if ARDUINO_USB_MSC_ON_BOOT !ARDUINO_USB_MODE MSC_Update.begin(); // USB MSC 固件升级初始化 #endif #if ARDUINO_USB_DFU_ON_BOOT !ARDUINO_USB_MODE USB.enableDFU(); // 使能 USB DFU 升级能力 #endif #if ARDUINO_USB_ON_BOOT !ARDUINO_USB_MODE USB.begin(); // USB 外设整体初始化 #endif可见USB DFU On Boot Enabled最终会调用USB.enableDFU()使设备呈现为 DFU 升级设备USB CDC On Boot Enabled则直接执行Serial.begin()这也是为什么 CDC 模式下Serial对象即对应 USB 虚拟串口。4.4 硬件 CDCHardware CDC的另一实现路径ESP32-S3 的Upload Mode中还有Hardware CDC选项对应 ESP32-S3 内置的 USB Serial/JTAG 控制器。其底层实现在 HWCDC.cpp 中通过usb_serial_jtag_ll_*系列 HAL 函数直接操作USB_SERIAL_JTAG外设寄存器如usb_serial_jtag_ll_write_txfifo写入发送 FIFO、usb_serial_jtag_ll_read_rxfifo读取接收 FIFO并在中断服务程序中处理发送空、接收包与总线复位事件。该路径不依赖 TinyUSB 协议栈适合只需要简单 CDC 串口与 JTAG 功能的场景。五、硬件设计去掉外部 USB 转串口芯片如果你正在基于兼容 SoC 开发自定义硬件并希望省掉外部 USB 转串口芯片那么上述嵌入式 USB 功能可以完全替代外部芯片的需求。设计要点将 SoC 的 USB D/D- 引脚具体引脚号请查阅对应 SoC 数据手册直接连接到标准 USB 连接器确保硬件上保留BOOT与RESET按钮以便首次进入下载模式依据所用 SoC 的 USB 外设能力见第一节表格选择 DFU 或 CDC 方案关于该 USB 外设的电气细节与引脚定义请参阅对应 SoC 数据手册datasheet。以 esp32s3 等官方 variant 定义为基础参考不同开发板的 USB 引脚映射可在 variants 目录下对应板型配置中查到。六、总结与选型建议使用场景推荐模式说明日常开发、调试串口日志USB CDC可烧录 串口监视一体支持 1200bps 自动下载无需手动复位仅需升级固件、空间紧张的发布版USB DFU仅 S2/S3只用于烧录无串口输出自研硬件、去掉外部转串口芯片USB CDC首选/ DFU需要 BOOT/RESET 按钮与正确的 USB 引脚连接一句话总结开发期用 USB CDC 最省心发布期可用 USB DFU 做最小化固件升级。所有菜单配置均可在 Arduino IDE 的 Tools 菜单中完成其背后由 boards.txt、platform.txt 与 main.cpp 共同驱动理解这条链路有助于你在自定义硬件上灵活取舍。如需了解其他 USB 功能如 USB MSC 固件拖拽升级可继续阅读 Tools Menus 参考指南 中的 USB Options 章节MSC 相关实现可参考 FirmwareMSC.cpp。【免费下载链接】arduino-esp32Arduino core for the ESP32 family of SoCs项目地址: https://gitcode.com/GitHub_Trending/ar/arduino-esp32创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表