基于esp-idf的乐鑫 ESP USB Bridge 项目试用研究笔记

基于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的概念框图

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_OUTIO_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-BridgeTarget ESP32
GPIO5TXD0
GPIO6RXD0
GPIO7RST/EN
GPIO4GPIO0/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连接电脑

参照下图连接

ESp32jtag引脚
使用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-BridgeTarget ESP32
GPIO5TXD0
GPIO6RXD0
GPIO7RST/EN
GPIO4GPIO0/BOOT

链接: 官方默认的连接在这

3.拖进u盘

直接复制到优盘里然后重启目标设备就行了

我这个esp32开发板没有引出GPIO0但是有个BOOT按键,我先按住再拖动成功烧录

五、说明

此文章大多数都是参考的其他人的文章,仅给自己做个记录,给其他想用这个项目的人提供一点参考

参考文章

链接: 乐鑫 ESP USB Bridge 项目介绍
链接: vscode 调试配置
链接: ESP USB Bridge 项目
链接: esp32 jtag引脚
链接: JTAG 调试
链接: 常见JTAG 调试错误

链接: libusb试错误

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值