基于esp-idf的乐鑫 ESP USB Bridge 项目
介绍
ESP USB Bridge 是一个 ESP-IDF 项目,能够利用 ESP32-S2 或 ESP32-S3 在计算机 (PC) 和目标微控制器 (MCU) 之间建立桥接,从而替代 USB 转 UART /JTAG 桥接芯片(例如 CP210x)。
以下是 ESP USB Bridge 的概念框图:
ESP USB Bridge 创建了一个复合 USB 设备,可以通过 USB 电缆被计算机访问。以下是其主要应用场景:
串口桥接:
开发者可以运行 esptool 或其他串口终端程序连接到 ESP USB Bridge CDC 功能提供的串口上。通过它实现 PC 和目标 MCU 之间的双向通信。
JTAG 桥接:
可以在 PC 上运行 openocd-esp32,与 ESP USB Bridge JTAG 功能相连,作为 PC 和 MCU 之间的桥梁,实现两者之间的双向 JTAG 通信。
大容量存储设备:
可以通过 PC 的文件浏览器访问 ESP USB Bridge MSC 功能创建的磁盘,把 UF2 格式的二进制文件复制到这个磁盘后,将使用它们来烧录目标 MCU。目前,ESP USB Bridge 支持烧录各种乐鑫微控制器。
注意,官方 readme 文件仅使用 ESP32-S2 作为示例,ESP USB Bridge 也支持 ESP32-S3。
硬件材料
1.esp32s2或esp32s3
2.usb连接线
3.另一个esp32开发板
开发环境
vscode + wsl + esp-idf插件
步骤
一、烧录 ESP USB Bridge 项目
1.下载项目
git clone https://github.com/espressif/esp-usb-bridge.git
2.配置项目(可选)
打开一个终端
. export.sh #注意有个点和空格
idf.py menuconfig
在vscode中打开终端可直接输入idf.py menuconfig
3.修改usb接收缓存区
文件位置:项目目录/main/jtag.c
将USB_RCVBUF_SIZE 改大一些,我一到的很多bug都是这个引起的。
如果遇到TIME_OUT, IO_ERROR,多半是这个问题
#define USB_RCVBUF_SIZE 4096
我不知道具体需要多少就改成了这样,不会报错了
4.构建项目
idf.py build
或者直接在vscode中构建
5.烧录
idf.py -p PORT flash monitor #PORT改成实际端口
或者直接在vscode中烧录
二、串口桥
1.接线
ESP-USB-Bridge连接目标设备
ESP-USB-Bridge | Target ESP32 |
---|---|
GPIO5 | TXD0 |
GPIO6 | RXD0 |
GPIO7 | RST/EN |
GPIO4 | GPIO0/BOOT |
链接: 官方默认的连接在这
ESP-USB-Bridge连接电脑
2.使用
串口监视
直接连接串口助手
串口烧录
idf.py build
esptool.py write_flash 0x10000 build\blink.bin
如果使用idf.py build会报错,原因未知
Traceback (most recent call last):
File "C:/ProgramOne/espressif/esp-idf/components/esptool_py/esptool/esptool.py", line 5399, in <module>
_main()
File "C:/ProgramOne/espressif/esp-idf/components/esptool_py/esptool/esptool.py", line 5392, in _main
main()
File "C:/ProgramOne/espressif/esp-idf/components/esptool_py/esptool/esptool.py", line 4814, in main
esp.flash_set_parameters(flash_size_bytes(args.flash_size))
File "C:/ProgramOne/espressif/esp-idf/components/esptool_py/esptool/esptool.py", line 1056, in flash_set_parameters
self.check_command("set SPI params", ESP32ROM.ESP_SPI_SET_PARAMS,
File "C:/ProgramOne/espressif/esp-idf/components/esptool_py/esptool/esptool.py", line 495, in check_command
val, data = self.command(op, data, chk, timeout=timeout)
File "C:/ProgramOne/espressif/esp-idf/components/esptool_py/esptool/esptool.py", line 468, in command
p = self.read()
File "C:/ProgramOne/espressif/esp-idf/components/esptool_py/esptool/esptool.py", line 413, in read
return next(self._slip_reader)
StopIteration
CMake Error at run_serial_tool.cmake:56 (message):
C:/ProgramOne/espressif/python_env/idf4.4_py3.8_env/Scripts/python.exe
C:/ProgramOne/espressif/esp-idf/components/esptool_py/esptool/esptool.py
--chip esp32 failed
FAILED: CMakeFiles/flash C:/UserData/test/blink/build/CMakeFiles/flash
cmd.exe /C "cd /D C:\ProgramOne\espressif\esp-idf\components\esptool_py && C:\ProgramOne\espressif\tools\cmake\3.23.1\bin\cmake.exe -D IDF_PATH="C:/ProgramOne/espressif/esp-idf" -D SERIAL_TOOL="C:/ProgramOne/espressif/python_env/idf4.4_py3.8_env/Scripts/python.exe C:/ProgramOne/espressif/esp-idf/components/esptool_py/esptool/esptool.py --chip esp32" -D SERIAL_TOOL_ARGS="--before=default_reset --after=hard_reset write_flash @flash_args" -D WORKING_DIRECTORY="C:/UserData/test/blink/build" -P C:/ProgramOne/espressif/esp-idf/components/esptool_py/run_serial_tool.cmake"
ninja: build stopped: subcommand failed.
ninja failed with exit code 1
三、 jtag桥 调试
1.硬件连接
将esp32s2连接目标esp32设备,在将esp32s2连接电脑
参照下图连接
使用usbipd工具将esp32s2 jtag 连接到 wsl
以管理员身份打开cmd或者powershell
usbipd wsl list #查看设备busid
usbipd wsl attach --busid x-x #x-x改成实际busid
2.配置vscode
在项目目录下的.vscode里添加launch.json文件,内容如下:
{
"version": "0.2.0",
"configurations": [
{
"name": "ESPIDF GDB",
"type": "cppdbg",
"request": "launch",
"MIMode": "gdb",
"miDebuggerPath": "${command:espIdf.getXtensaGdb}",
"program": "${workspaceFolder}/build/${command:espIdf.getProjectName}.elf",
"windows": {
"program": "${workspaceFolder}\\build\\${command:espIdf.getProjectName}.elf"
},
"cwd": "${workspaceFolder}",
"environment": [{ "name": "PATH", "value": "${config:idf.customExtraPaths}" }],
"setupCommands": [
{ "text": "target remote :3333" },
{ "text": "set remote hardware-watchpoint-limit 2"},
{ "text": "mon reset halt" },
{ "text": "thb app_main" },
{ "text": "flushregs" }
],
"externalConsole": false,
"logging": {
"engineLogging": true
}
}
]
}
3.启动openocd
必须是安装espidf自带的openocd,不要直接安装openocd
先给自己提权
groups #看看有没有plugdev
usermod -a -G plugdev 你的用户名 #没有就执行这个
cp .espressif/tools/openocd-esp32/v0.11.0-esp32-20220411/openocd-esp32/share/openocd/contrib/60-openocd.rules /etc/udev/rules.d/ #第一个参数是你的esp的.espressif 文件夹里的
启动
openocd -f board/esp32-bridge.cfg
挂在后台,不要关了
4.开始调试
直接在vscode中添加断点按F5开始调试
5.其他
openocd 还可以下载程序
openocd -f board/esp32-bridge -c "program_esp filename.bin 0x10000 verify exit"
6.可能遇到的错误
问题1:
Error: libusb_open() failed with LIBUSB_ERROR_NOT_FOUND
Error: JTAG scan chain interrogation failed: all ones
解决办法:
检查硬件连线是否正确
检查 JTAG 调试的驱动是否正确
问题2:
Error: No symbols for FreeRTOS
原因
解决办法:
问题3:
** Error: couldn't bind tcl to socket on port 6666: Address already in use **
原因
端口被占用,杀掉占用的端口就行了
解决办法:
lsof -i:6666 #查看占用6666端口的进程pid
kill -9 pid #杀掉进程
openocd -f board/esp32-bridge.cfg #重新开始
问题4:
** libusb_open() failed with LIBUSB_ERROR_ACCESS
LIBUSB_ERROR_NOT_SUPPORTED **
原因
没有权限
解决办法:
usermod -a -G plugdev 你的用户名
cp .espressif/tools/openocd-esp32/v0.11.0-esp32-20220411/openocd-esp32/share/openocd/contrib/60-openocd.rules /etc/udev/rules.d/ #第一个参数是你的esp的.espressif 文件夹里的
问题5:
** Error: libusb_bulk_write error: LIBUSB_ERROR_TIMEOUT **
原因
解决办法:
1.参照上文调大usb接收缓存区
2.多次尝试
问题6:
** No matching distribution found for virtualenv
python WARNING: Retrying (Retry(total=4, connect=None, read=None, redirect=None, status=None)) **
原因
网络问题
解决办法:
换个网络,多试几次
问题7:
** 无限esp32.cpu0: Debug controller was reset
无限uart rx break **
原因不知
解决办法:
多试几次
四、 MSC大容量设备
1.构建
idf.py uf2
2.接线
ESP-USB-Bridge | Target ESP32 |
---|---|
GPIO5 | TXD0 |
GPIO6 | RXD0 |
GPIO7 | RST/EN |
GPIO4 | GPIO0/BOOT |
链接: 官方默认的连接在这
3.拖进u盘
直接复制到优盘里然后重启目标设备就行了
我这个esp32开发板没有引出GPIO0但是有个BOOT按键,我先按住再拖动成功烧录
五、说明
此文章大多数都是参考的其他人的文章,仅给自己做个记录,给其他想用这个项目的人提供一点参考
参考文章
链接: 乐鑫 ESP USB Bridge 项目介绍
链接: vscode 调试配置
链接: ESP USB Bridge 项目
链接: esp32 jtag引脚
链接: JTAG 调试
链接: 常见JTAG 调试错误
链接: libusb试错误