ESP32开发环境折腾记录

USB-JTAG-BUILDin,OpenOCD,YD-ESP32-C3,zadig,libwdi

Updated on August 21, 2022 Posted by elmagnifico on August 16, 2022

Forward

好久没弄ESP32,又要捡起来折腾一下,记录一下相关内容。

环境

ESP32 IDF没有IDE,所以还是依赖VS code来完成,直接搜索esp32,安装对应插件

image-20220816004715027

在下一步前,建议先把代理开起来,不然下载速度感人

image-20220816012240491

根据教程,F1,输入Select where to save configuration settings 设置一下工程路径,然后下载对应的IDF

image-20220816011718561

image-20220816005131804

需要注意的是这里插件其实已经把整个虚拟环境安装好了,包括各种编译需要的工具链。

所以官方教程中的编译第一个项目,需要安装的各种都可以跳过,直接进入编译调试环节就行了。

最后安装环境可能会出错

第一种是这样的错,可能是网络有问题,这种需要删掉之前的.espressifesp路径的内容,挂vpn以后,重新安装

Command failed: "E:\switch\esp32\.espressif\tools\idf-python\3.8.7\python.exe" "E:\switch\esp32\esp\esp-idf\tools\idf_tools.py" install-python-env
    ERROR: Command errored out with exit status 1:
    ....
      File "E:\switch\esp32\.espressif\python_env\idf4.4_py3.8_env\lib\site-packages\pkg_resources\__init__.py", line 2456, in resolve
        module = __import__(self.module_name, fromlist=['__name__'], level=0)
    ModuleNotFoundError: No module named 'setuptools.command.build'
    ----------------------------------------
ERROR: Command errored out with exit status 1: python setup.py egg_info Check the logs for full command output.
WARNING: You are using pip version 20.3.3; however, version 22.2.2 is available.
You should consider upgrading via the 'E:\switch\esp32\.espressif\python_env\idf4.4_py3.8_env\Scripts\python.exe -m pip install --upgrade pip' command.
Traceback (most recent call last):
  File "E:\switch\esp32\esp\esp-idf\tools\idf_tools.py", line 1860, in <module>
    main(sys.argv[1:])
  File "E:\switch\esp32\esp\esp-idf\tools\idf_tools.py", line 1856, in main
    action_func(args)
  File "E:\switch\esp32\esp\esp-idf\tools\idf_tools.py", line 1577, in action_install_python_env
    subprocess.check_call(run_args, stdout=sys.stdout, stderr=sys.stderr, env=env_copy)
  File "subprocess.py", line 364, in check_call
subprocess.CalledProcessError: Command '['E:\\switch\\esp32\\.espressif\\python_env\\idf4.4_py3.8_env\\Scripts\\python.exe', '-m', 'pip', 'install', '--no-warn-script-location', '-r', 'E:\\switch\\esp32\\esp\\esp-idf\\requirements.txt', '--extra-index-url', 'https://dl.espressif.com/pypi']' returned non-zero exit status 1.

可能还会遇到出错的情况下,会提示你pip版本太低,可以手动升级一下,再重新安装

WARNING: You are using pip version 20.3.3; however, version 22.2.2 is available.
You should consider upgrading via the 'e:\esp32\.espressif\python_env\idf4.4_py3.8_env\Scripts\python.exe -m pip install --upgrade pip' command.

e:\switch\esp32\.espressif\python_env\idf4.4_py3.8_env\Scripts\python.exe -m pip install --upgrade pip

还有一种情况,如果出现了这个错,这个错不会直接报错,而且报错了也会提示在中间,不影响后续流程,但是实际上出现了以后,后续流程一定是会出错的,如果不解决这个问题,那么后面的报错是解不了的

error launching git: 

出现这个错,是因为你设置的esp.espressif路径过长了,比如我设置的e:\switch\esp32\.espressif这就算过长路径了,后续的很多python的包或者git,他们对路径的长度有限制,可是他们安装的路径又特别深,这就会导致后续各种报错,要解决这个问题就需要将前面的路径清理掉,直接变成e:\esp32\.espressif,就能正常安装完成了

image-20220819005334582

Example

Ctrl+Shift+p 然后Show Example Projects,就能看到各种例程了,选择一个编译一下

image-20220821204453239

然后选择路径,对应的示例工程就创建好了

image-20220821204557031

然后选择芯片,设置调试方式,Set Espressif device target ,选择对应的芯片,然后选择调试的接口,可以是JTAG或者是USB或者是Uart,建议先用Uart,这里不会出错

Ctrl+E+B编译工程

image-20220821205245758

Ctrl+E+S查看编译后的固件信息,比如大小,sram使用情况什么的

image-20220821205307365

烧写时需要指定串口Ctrl+E+P选择烧写串口

Ctrl+E+F烧写,需要选择烧写的方式,这里是通过串口烧写,先不选择Jtag或者USB什么的

image-20220821205605584

Ctrl+E+M连接串口输出的控制台,就能看到例程中的串口输出了

image-20220821205723409

Debug

一般来说ESP32有3种Debug方式

  1. 通过USB-JTAG-BUILDin,简单说平常ESP32的USB接口直接就内置了一个JTAG调试和串口,既能用来烧写又能用来串口输出或者是烧写,缺点就是由于是内置的,所以如果程序本身休眠或者跑死了,是无法再JTAG调试的,只能调试硬件正常的情况。
  2. 通过PROG,这种就是官方给的调试接口了,需要对应的ESP-PROG调试器
  3. 通过J-Link,相当是使用第三方的调试器来调试,有个J-Link就行了

VS code这里使用1和2比较简单,使用三需要单独配置

ESP-IDF: Select OpenOCD Board Configuration首先设置一下Debug的选项

直接对着工程F5即可,单步执行什么的都是没问题的

image-20220821225417163

但是可能会出现无法调试,报错的情况

[OpenOCD]
❌ Info : Listening on port 4444 for telnet connections
Error: libusb_open() failed with LIBUSB_ERROR_NOT_FOUND
[OpenOCD]
❌ Error: esp_usb_jtag: could not find or open device!

出现这个情况非常正常,因为ESP32的USB被默认安装了windows的驱动,这个驱动无法支持调试,需要手动更换

还有一种简单的方法判断驱动是否正常,如果这里的驱动提供商是Microsoft而不是libwdi,那这个驱动肯定就不对

image

image-20220821230553232

更换USB驱动

首先下载一个zadig-2.7.exe,他其实是一个windows下usb驱动安装程序,可以很容易替换当前正在使用的usb驱动

https://github.com/pbatard/libwdi/wiki/Zadig

勾选List All Devices,显示所有usb设备

image-20220821225942452

然后就能看到,列出来了很多设备

image-20220821230041639

这里有问题的就是这个USB JTAG/serial debug unit(interface 2),一般情况,如果下面WCID这里✔了,那么就是他,另外一个Interface 0 是串口,这个一般没啥问题。

image-20220821230229831

主要是这个驱动有问题,右侧三角选择替换驱动而不是安装WCID驱动,然后提示重启,重启以后再进入VS code调试,就发现一切正常了。

还有一种方法就是重装整个环境,用ESP官方安装包,但是如果这么做的话就没必要用VS code了,一个环境安装了2遍,太过多余了

https://docs.espressif.com/projects/esp-idf/en/latest/esp32c3/get-started/windows-setup.html#esp-idf-tools-installer

烧写

当没有编译环境的时候如何烧写,下载官方的烧写工具

https://www.espressif.com.cn/zh-hans/support/download/other-tools

选择对应的芯片

SMMS

Develop是给一般人用的,如果是工厂可能需要批量烧写,那么可以选择,对应会出现支持很多个串口烧写的UI,平常完全没必要。

Develop烧写固件界面

image-20220909165659188

由于ESP32比较复杂,所以可能有好几个固件需要烧写,并且要指定对应的地址。

一般来说就是三个地址,boot、partition和app

0x0000 bootloader.bin
0x8000 partition-table.bin
0x10000 app.bin

设置好了以后就可以进行烧写了

还有一种整合的方法,点击CombineBin,将需要烧写的固件整合在一起,就可以每次直接从0x0000地址烧写了,不用额外填那么多其他地址。

Watchdog

用ESP32,一旦任务执行频率过高,就会造成BackTrack,疯狂干扰正常运行

可以通过config直接关闭整个watchdog,不在监控Idel task无法运行

CONFIG_ESP_TASK_WDT = n

关闭整个watchdog可能太过激进了,一般情况下可以选择关闭cpu1的,而cpu0是协议核,一般都给他开着。

CONFIG_ESP_TASK_WDT_CHECK_IDLE_TASK_CPU0 = n
CONFIG_ESP_TASK_WDT_CHECK_IDLE_TASK_CPU1 = n

Log

非运行时可以直接通过config关闭log

#
# Log output
#
CONFIG_LOG_DEFAULT_LEVEL_NONE=y
# CONFIG_LOG_DEFAULT_LEVEL_ERROR is not set
# CONFIG_LOG_DEFAULT_LEVEL_WARN is not set
# CONFIG_LOG_DEFAULT_LEVEL_INFO=y
# CONFIG_LOG_DEFAULT_LEVEL_DEBUG is not set
# CONFIG_LOG_DEFAULT_LEVEL_VERBOSE is not set
CONFIG_LOG_DEFAULT_LEVEL=0
CONFIG_LOG_MAXIMUM_EQUALS_DEFAULT=y
# CONFIG_LOG_MAXIMUM_LEVEL_DEBUG is not set
# CONFIG_LOG_MAXIMUM_LEVEL_VERBOSE is not set
CONFIG_LOG_MAXIMUM_LEVEL=0
CONFIG_LOG_COLORS=y
CONFIG_LOG_TIMESTAMP_SOURCE_RTOS=y
# CONFIG_LOG_TIMESTAMP_SOURCE_SYSTEM is not set
# end of Log output

运行时关闭log,基本可以关闭大部分非强制log的输出

esp_log_level_set("*", ESP_LOG_NONE);

而bootload的log也可以关闭,其他的设置注释

CONFIG_BOOTLOADER_LOG_LEVEL_NONE=y
CONFIG_BOOTLOADER_LOG_LEVEL=0
CONFIG_LOG_BOOTLOADER_LEVEL_NONE=y
CONFIG_LOG_BOOTLOADER_LEVEL=0

FreeRTOS

ESP32使用的是FreeRTOS,但是他的FreeRTOS用的不是systick,这就导致操作系统的时钟精度是不够的,默认情况下工程创建的是100Hz的Tick,这就导致实际如果执行vTaskDelay(4 / portTICK_PERIOD_MS);,就会出现精度受影响的情况。

image-20220912200209819

如果一个循环中,没有什么可能阻塞的业务,那么vTaskDelay由于精度不够,会直接就跳过了,等于vTaskDelay(0);

要修复这个问题,必须把Tick设置到1000Hz,这样短延迟才能正常发挥作用。

Summary

暂时就这么多,日后还有遇到问题再补充。

Quote

https://github.com/espressif/esp-idf

https://docs.espressif.com/projects/esp-idf/zh_CN/latest/esp32c3/get-started/index.html

https://github.com/espressif/vscode-esp-idf-extension/blob/master/docs/tutorial/install.md

https://github.com/espressif/vscode-esp-idf-extension/blob/master/docs/tutorial/basic_use.md

https://github.com/espressif/vscode-esp-idf-extension/blob/master/docs/tutorial/debugging.md

https://github.com/espressif/esp-idf/tree/2761ad4865919693fcd02f4096711ba0fd0f6271/examples/bluetooth/bluedroid/classic_bt/bt_hid_mouse_device

https://www.codenong.com/54731054/

https://github.com/espressif/idf-installer/issues/133

https://www.esp32.com/viewtopic.php?t=21799

https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-reference/system/wdts.html