ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Win7下ESP32 USB JTAG串口驱动安装指南

Win7下ESP32 USB JTAG串口驱动安装指南 前几天一位做温湿度采集项目的朋友发来消息说他把一块 ESP32-S3 开发板插到一台还跑着 Win7 旗舰版的老笔记本上设备管理器里立刻冒出一条带黄色感叹号的记录——USB JTAG/serial debug unit (Interface 0)右键点更新驱动系统找了一圈回一句没有找到适用于该设备的驱动程序换了好几个所谓万能驱动包也没用。他的烧录工具读不到 COM 口工程从下午卡到晚上。这个场景我太熟了过去几年里凡是拿 Win7 当主力开发机、又买了带内置 USB 的新款 ESP32 的人几乎都要在这件事上栽一次跟头。这篇内容就围绕ESP32 在 WIN7 下 USB 调试串口驱动安装这个具体问题展开把 USB JTAG/serial debug unit 装不上驱动的成因、判断方法、四条可落地的解决路线、INF 文件写法、签名处理、以及一堆踩过的坑全部摊开讲。不管你是刚拿到开发板的新手还是手上有 ICC 老机器不想换系统的老工程师看完应该都能找到一条走得通的路。涉及 ESP32 各型号的 USB 通道差异、Win7 驱动模型的老毛病、CH340 与 CP2102 的版本选择、以及 Zadig 配合 OpenOCD 的备用方案都会一并说清楚。1. 先搞清楚USB JTAG/serial debug unit到底是什么设备1.1 两类完全不同的 USB 通道在动手装驱动之前必须先分清楚你手上这块板子的 USB 走的是哪条路因为这两条路的解决难度差了一个数量级。第一类是外置桥接芯片方案。经典 ESP32、ESP32-WROOM-32、ESP32-WROVER 这些基于 Xtensa LX6 的芯片内部并没有 USB 控制器所以开发板上一定要焊一颗 USB 转串口桥接芯片常见的有沁恒 CH340/CH341、芯科 CP2102/CP2104、FTDI FT232RL近两年还有 CH9102、CH343 这类新片。这颗芯片对 Windows 来说是标准的外设厂商提供成熟驱动装上之后设备管理器里直接出现USB-SERIAL CH340 (COM5)这样的条目烧录、串口监视一切正常。这类方案在 Win7 上从来不是问题因为它跟 ESP32 本身没关系纯粹是桥接芯片的驱动。第二类是芯片内置 USB 方案。ESP32-S2、ESP32-S3、ESP32-C3、ESP32-C6、ESP32-C61、ESP32-C5 这些新芯片内部集成了 USB 外设。其中 ESP32-S3 有两套一套是 USB-OTG全速可以做成自定义设备、UVC 摄像头、MSC 存储另一套是 USB Serial/JTAG专门用来当串口和调试器用ESP32-C3、C6 一般只有 USB Serial/JTAG。当你把板子上的 USB 口接到内置 USB 引脚S3 是 GPIO19/GPIO20C3 是 GPIO18/GPIO19时Windows 枚举出来的名字就是USB JTAG/serial debug unit。1.2 为什么 Win7 偏偏认不出 Interface 0这个设备是个复合设备内部用 Interface Association DescriptorIAD把几个接口绑在一起。典型描述符大致是这样设备级 bDeviceClass0xEF、bDeviceSubClass0x02、bDeviceProtocol0x01然后 Interface 0 是 CDC 控制接口Class 0x02Interface 1 是 CDC 数据接口Class 0x0AInterface 2 是 JTAG 接口Class 0xFF。Windows 只要把 Interface 0 和 Interface 1 配对再挂上 CDC 驱动 usbser.sys就能生成一个虚拟串口。问题就出在配对这一步。Win7 的 USB 复合设备支持是不完整的它对 IAD 的解析远不如 Win8 以后的系统。在 Win10/11 上系统一看描述符就知道这几个接口是一伙的自动把 CDC 那对装好而在 Win7 上它倾向于把 Interface 0、Interface 1、Interface 2 当成三个互不相干的独立设备于是 Interface 0 单独被拎出来找不到归属就出现了标题里那个USB JTAG/serial debug unit (Interface 0) 无法安装驱动。你在设备管理器里刷新一下经常能看到同一时刻冒出两三个同名的感叹号设备这就是被拆散的接口。1.3 一分钟判断你的板子属于哪一类不用去翻原理图那么麻烦用三个动作就能判断看板子上有几个 USB 口。如果只有一个 Type-C 或 Micro-USB八成是内置 USB如果有两个一般标着 UART 和 USB或者 COM 和 OTG那就两条路都有。看板子上有没有一颗 8 脚或 16 脚的小芯片紧挨着 USB 座。有就是外置桥接没有且 USB 数据线直接通到模组就是内置。直接插上看设备管理器。出现USB-SERIAL CH340Silicon Labs CP210x这类名字是外置出现USB JTAG/serial debug unit或未知设备是内置。判断清楚之后后面的路线选择就简单了。内置 USB 在 Win7 上是要费点劲的外置桥接基本零折腾所以如果你的板子两个口都有第一优先永远是走外置那个口这是我这些年最省时间的做法。2. 动手前的准备硬件 ID 采集与驱动来源确认2.1 把硬件 ID 抄下来这是后面所有操作的钥匙无论走哪条路线第一步都是在设备管理器里把设备的硬件 ID 读出来因为后面写 INF、找驱动、判断匹配关系全靠它。操作路径是右键计算机进管理打开设备管理器找到那个带感叹号的设备右键属性切到详细信息选项卡在属性下拉框里选硬件 ID。你会看到一堆字符串形如USB\VID_303APID_1001REV_0101 USB\VID_303APID_1001如果这个设备是某个复合设备拆出来的接口还会多出带MI_00、MI_02后缀的条目比如USB\VID_303APID_1001MI_00。这里的 VID 是厂商编号0x303A 是乐鑫注册的PID 因芯片和固件而异ESP32-S2 常见 0x0002S3、C3、C6 常见 0x1001但具体值以你机器上读到的为准不要照抄别人的。MI 后面的数字就是接口号MI_00 对应 Interface 0。这一步千万别跳过。我见过太多人直接去网上抓一个别人改好的 INF 装上结果因为 PID 或 MI 号对不上系统提示该 INF 不包含适用于你设备的驱动程序白白浪费半小时。2.2 外置桥接芯片的驱动版本怎么选如果判断下来你的板子是外置桥接方案那么选对驱动版本比什么都重要尤其是 Win7 这种老系统。芯片型号推荐驱动Win7 兼容性说明CH340 / CH341CH341SER.EXE 3.5 版3.5 版对 Win7 x86/x64 支持最稳新版驱动在部分老系统上安装程序会闪退CH9102 / CH343对应型号的 VCP 驱动需要在安装包里选对型号选错就装不上CP2102 / CP2104CP210x Universal Windows Driver选版本时注意官网标注的操作系统范围Win7 需要较早期的分支FT232RLCDM 驱动包官方老版本对 Win7 友好新版本可能只保留 Win10 支持安装 CH340 驱动有一个新手容易忽略的点必须用管理员权限运行安装程序右键选以管理员身份运行然后点 INSTALL。装完之后拔插一次开发板设备管理器里应该出现端口COM 和 LPT分类下的新条目。如果还是显示在其他设备里带感叹号就手动更新驱动把路径指向安装程序解压出来的目录。2.3 Win7 的驱动签名机制绕不开的一关Win7 x64 强制要求内核模式驱动必须有数字签名未签名的驱动装不上或者装上了也会在设备管理器里报代码 52Windows 无法验证此设备所需的驱动程序的数字签名。这一点在自建 INF 的时候一定会撞上。应对方式有三种按侵入性从低到高用有正规签名的官方驱动。外置桥接芯片的厂商驱动都是签过名的装了不会有任何问题这是首选。临时禁用签名强制。开机时按 F8进高级启动选项选禁用驱动程序签名强制。这个设置只对本次开机有效重启就恢复比较安全。开启测试模式。在管理员命令行里执行bcdedit /set testsigning on重启后系统允许加载自签名驱动桌面右下角会出现测试模式水印。装完驱动再执行bcdedit /set testsigning off关掉即可。需要提醒一句测试模式会降低系统对驱动来源的校验强度日常使用的机器不建议长期开着。装完驱动确认能用立刻关掉。3. 四条可落地路线按难度从低到高排3.1 路线 A直接改走外置 USB-UART 口如果你的开发板同时有 UART 口和内置 USB 口那这条路五分钟就能解决我强烈建议先试它。具体操作就是把数据线从内置 USB 口拔下来插到标着 UART 或者 COM 的那个接口上。插上之后设备管理器里应该识别出外置桥接芯片按 2.2 节的驱动装好得到 COM 口剩下来的事情和内置 USB 完全没关系。ESP-IDF 的idf.py -p COM5 flash monitor、Arduino IDE 的端口选择、esptool 的命令行烧录全都是标准流程不需要任何特殊处理。这里有个细节要注意有些板子的两个 USB 口都是 Type-C外形一模一样很容易插错。我一般在板子背面用记号笔标一下或者记住离模组远的那个通常是 UART这种经验规律。另外有些低成本的板子虽然有两个口但 UART 口只引出了 TX/RX/GND没有接 DTR/RTS 的自动复位电路那就需要手动按住 BOOT 键再点烧录这个也不算大问题只是多一个动作。外置方案的另一个好处是串口监视和烧录互不干扰。内置 USB Serial/JTAG 是串口和 JTAG 共用一个物理通道的在调试的时候偶尔会出现日志输出和调试器的握手指令抢带宽的情况外置口就完全没这个问题。3.2 路线 B用厂商提供的 Win7 专用驱动包如果板子只有内置 USB 口那就只能正面硬刚了。第一件事是去乐鑫官方文档里找 USB Serial/JTAG 相关的章节官方针对 Windows 7 单独提供过驱动包里面是一个 INF 文件加配套的 sys 文件。下载解压之后的安装流程是设备管理器里右键那个带感叹号的USB JTAG/serial debug unit (Interface 0)。选更新驱动程序软件再选浏览计算机以查找驱动程序软件。点让我从计算机上的设备驱动程序列表中选取然后点右下角的从磁盘安装。浏览到解压目录选中里面的 INF 文件确定。如果弹出未签名警告选始终安装此驱动程序软件。装完如果出现 COM 口那就成了。如果提示该 INF 不包含适用于你设备的驱动程序说明厂商 INF 里的硬件 ID 和你的设备对不上这种情况在固件版本比较新的板子上很常见直接跳到路线 C。3.3 路线 C自建 INF让 Win7 自带的 usbser.sys 认这个设备这是最实用也最能一劳永逸的办法。核心思路是Win7 系统自带C:\Windows\System32\drivers\usbser.sys只是没有一份能匹配 ESP32 复合设备接口的 INF 把它激活。我们自己写一份 INF通过Include引用系统的mdmcpq.inf把 CDC 那对接口绑到 usbser.sys 上就行。实际用到的 INF 大概长这样注意里面的硬件 ID 要替换成你在 2.1 节读到的真实值; esp32s3cdc.inf —— 让 Win7 认内置 USB 的 CDC 接口 [Version] Signature $Windows NT$ Class Ports ClassGuid {4D36E978-E325-11CE-BFC1-08002BE10318} Provider %ProviderName% CatalogFile esp32s3cdc.cat DriverVer 03/01/2024,1.0.0.1 [DestinationDirs] DefaultDestDir 12 [Manufacturer] %ProviderName% Espressif, NTamd64, NTx86 [Espressif.NTamd64] %DeviceName% EspressifInstall, USB\VID_303APID_1001MI_00 %DeviceName% EspressifInstall, USB\VID_303APID_1001MI_01 [Espressif.NTx86] %DeviceName% EspressifInstall, USB\VID_303APID_1001MI_00 %DeviceName% EspressifInstall, USB\VID_303APID_1001MI_01 [EspressifInstall.NTamd64] Include mdmcpq.inf Needs MDMUSBSERIAL.NT [EspressifInstall.NTx86] Include mdmcpq.inf Needs MDMUSBSERIAL.NT [Strings] ProviderName Espressif Systems DeviceName ESP32 USB Serial/JTAG (CDC)几个关键点必须说清楚。第一[Manufacturer]下面的段必须按平台加装饰后缀64 位系统是.NTamd6432 位是.NTx86写错一个字符系统就报INF 无效。第二Includemdmcpq.inf加NeedsMDMUSBSERIAL.NT这两个组合是 Win7 上复用 usbser.sys 的标准手法很多安卓手机 CDC 驱动也是这么做的。第三接口映射要成对写只绑 Interface 0 不绑 Interface 1会出现COM 口在设备管理器里能看到但打不开的诡异现象因为数据传输走的是 Interface 1。安装时同样是设备管理器手动从磁盘安装指向这份 INF。因为文件没有签名系统一定会拦按 2.3 节的方法处理签名。3.4 路线 DZadig 装 WinUSB转而用 OpenOCD 烧录前三条路走不通的时候可以换一个思路不要 COM 口了直接用 JTAG 通道干活。做法是用 Zadig 这个工具把 ESP32 的 JTAG 接口绑定成 WinUSB 驱动。Zadig 里选中USB JTAG/serial debug unit (Interface 2)一般 JTAG 是最后一个接口驱动选 WinUSB点 Replace Driver。装完之后设备管理器里那个设备就正常了黄叹号消失代价是它不再提供串口。然后拿 ESP-IDF 自带的 OpenOCD 通过 USB-JTAG 烧录大致命令是openocd -f board/esp32s3-builtin.cfg \ -c program_esp build/bootloader/bootloader.bin 0x0 verify \ -c program_esp build/partition_table/partition-table.bin 0x8000 verify \ -c program_esp build/app.bin 0x10000 verify exit这条路的好处是不依赖 CDC 驱动不受 Win7 复合设备解析缺陷的影响坏处也很明显没有串口监视器可用调试日志只能通过 JTAG 读日常开发体验打了折扣。所以我的定位是把它当备用方案主方案还是路线 A 或 C。顺带说一句网上有些所谓的ESP32 万能驱动包来路不明的压缩包我劝你别直接装。内核驱动是运行在系统最高权限上的装错东西轻则蓝屏重则系统被搞坏尤其是那种让你先关掉杀毒软件再安装的直接扔掉。需要驱动就去芯片厂商官网或开发板厂商官网找。4. INF 落地细节与 OpenOCD 参数说明4.1 INF 修改后不生效的几种典型原因很多人把 INF 写完了手动指定路径安装却依然报错。根据我的经验问题基本集中在下面几个地方。第一是平台装饰段不匹配。Win7 64 位认的是.NTamd64有些教程里写的是.NTx86装上去系统直接忽略你写的条目自然会提示找不到驱动。确认方法是看系统属性里的系统类型或者命令行执行wmic os get osarchitecture。第二是硬件 ID 抄错了。带MI_00和不带是两个不同的匹配项如果你写的是USB\VID_303APID_1001而设备实际报告的是USB\VID_303APID_1001MI_00就匹配不上。稳妥的做法是把带 MI 和不带 MI 的都写进去让系统自己挑。第三是**Include引用的系统文件路径问题**。mdmcpq.inf位于C:\Windows\inf\如果系统精简过比如某些 Ghost 版 Win7这个文件可能被删掉了那NeedsMDMUSBSERIAL.NT就会失败。这种情况下需要从完整版系统里拷一份回来或者干脆放弃路线 C 走路线 D。第四是旧驱动残留。之前装过别的驱动、或者手动指定过错误的 INF设备上会留下已安装记录的缓存。这时候要做的不是继续更新驱动而是在设备管理器里右键卸载设备勾选删除此设备的驱动程序软件拔掉板子重启再插上重装。4.2 自签名驱动的完整流程如果不想每次都开测试模式可以给 INF 配一份自签名证书走正规签名流程。步骤大致是先用系统自带的 makecert 生成一张测试证书makecert -r -pe -ss PrivateCertStore -n CNMyLocalDriver MyLocalDriver.cer然后把证书导入到受信任的根证书颁发机构和受信任的发布者两个存储区这一步用 certmgr.msc 图形界面操作比较直观。接着用 WDK 里的 inf2cat 生成目录文件注意操作系统参数要和目标系统对应inf2cat /driver:C:\driver\esp32 /os:7_X64最后用 signtool 签名signtool sign /v /s PrivateCertStore /n MyLocalDriver /fd sha256 esp32s3cdc.cat签名完成后再把 INF 装一次系统就不会再提示无法验证发布者了。这里有两点要注意证书必须导入到受信任的根证书颁发机构只导入个人存储区是没用的/fd sha256这个参数在部分老版本 signtool 上不支持报错的话换成/fd sha1试试。4.3 OpenOCD 配置文件的选型路线 D 里用的 OpenOCD 配置文件不同芯片对应不同文件。ESP32-S3 用board/esp32s3-builtin.cfgESP32-C3 用board/esp32c3-builtin.cfgESP32-S2 用board/esp32s2-kaluga-1.cfg之类的板级配置。拿不准的时候可以直接去 ESP-IDF 安装目录下的components/openocd-esp32/share/openocd/scripts/board/里翻文件名都是自解释的。如果配置文件选错最典型的表现是 OpenOCD 启动后卡在Info : Listening on port 3333 for gdb connections之前或者报Error: JTAG scan chain interrogation failed。遇到这种情况先确认芯片型号再确认openocd -f后面跟的文件名对不对。5. 常见问题速查与避坑经验5.1 现象对照表现象大概率原因处理办法设备管理器显示代码 52驱动无有效签名装官方签名驱动或临时禁用签名强制设备管理器显示代码 10设备无法启动通常枚举失败换 USB 口、换数据线避免经过劣质 Hub设备管理器显示代码 28驱动根本没装上手动指定 INF 安装提示INF 不包含适用驱动硬件 ID 或平台装饰段不匹配回设备管理器重新抄硬件 IDCOM 口出现但打不开只绑了 Interface 0没绑 Interface 1在 INF 里补上数据接口插上后设备反复消失又出现供电不足或线材问题换一根确认能传数据的线直插主板后置 USB 口esptool 报 Failed to connect芯片没进下载模式按住 BOOT 再点复位或检查 DTR/RTS 接线esptool 报 Could not open portCOM 口被别的程序占用关掉串口监视器、Arduino 串口窗口等串口输出全是乱码波特率不匹配确认监视器波特率与固件配置一致CH340 驱动装完仍感叹号旧版驱动残留冲突卸载设备并勾选删除驱动重启后重装 3.5 版5.2 几个被反复验证的实操心得先说线材。这条听着像废话但我统计过求助插上没反应的案例里超过三成是线的问题。很多 Type-C 线是充电线内部只有电源针脚没有数据针脚插上之后设备管理器连刷新都不刷新。判断方法很简单换一根确定能传数据的线比如移动硬盘配的那根如果立刻识别那就是线的锅。再说 USB 口。老机器上前置 USB 口和经过廉价 Hub 的口供电和信号质量都差Win7 的 USB 栈对枚举失败的容忍度又低很容易出现设备一闪而过。解决办法是直插机箱后面板上的 USB 2.0 口。这一点在装内置 USB 驱动的时候尤其明显因为复合设备枚举需要连续完成多个描述符请求中途被打断就会留下一堆半死不活的设备节点。第三折腾超过两小时就换环境。我给自己的规矩是如果 Win7 上驱动搞了两小时还没通就不要再死磕了。可以在一台 Win10 机器上先把固件烧好或者用虚拟机跑一个较新的系统做烧录。Win7 的 USB 驱动模型是十几年前的产物对复合设备的支持缺陷是系统级的天花板不是你手艺不行。把精力花在项目本身比花在驱动上划算得多。第四把成功的配置记下来。我习惯在项目目录下放一个notes.md把开发板型号、芯片型号、USB 通道、硬件 ID、用的哪个驱动版本、COM 口号都记一行。换了机器或者换了板子直接照抄比重新摸索快十倍。这个习惯在带团队的时候尤其有用新同事来了直接给文档不用重复踩坑。6. 我在实际项目里的一些体会这些年从经典 ESP32 一路用到 ESP32-S3、C6我最大的感受是新芯片的内置 USB 是真好用但它对宿主系统的要求也真的高。内置 USB Serial/JTAG 省掉了桥接芯片的物料成本一块板子能同时提供串口和调试器插一根线就能烧录加单步调试体验比外置方案清爽太多。可这套便利是建立在操作系统对 USB 复合设备有完整支持的前提上的Win7 恰好就卡在这条线上。所以对于还在用 Win7 做开发机的朋友我的建议是按优先级来有外置 UART 口就坚决走外置一步到位只有内置口就优先找官方 Win7 驱动包找不到再自己写 INF实在不行就用 Zadig 转 WinUSB用 OpenOCD 完成烧录和调试。三条路都能通只是花的力气不一样。最后再分享一个我最近发现的小技巧。如果你手头有几台不同年代的机器可以把烧录这件事单独交给一台开发还是在原来的 Win7 上做两台机器通过共享目录交换编译产物用 esptool 的write_flash命令直接烧二进制。这样开发环境和烧录环境解耦Win7 上的驱动问题一次性绕过去而且和芯片型号无关换板子也不用重新配驱动。项目做到后面能少一个变量就少一个变量这是我从一堆驱动折腾里换来的最实在的一条经验。
返回列表