ESP32开发环境折腾记录

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

Views:  times Updated on November 13, 2022 Posted by elmagnifico on August 16, 2022

Foreword

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

环境

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

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

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

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

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

最后安装环境可能会出错

第一种是这样的错,可能是网络有问题,这种需要删掉之前的.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,就能正常安装完成了

Example

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

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

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

Ctrl+E+B编译工程

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

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

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

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

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即可,单步执行什么的都是没问题的

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

[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,那这个驱动肯定就不对

更换USB驱动

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

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

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

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

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

主要是这个驱动有问题,右侧三角选择替换驱动而不是安装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

选择对应的芯片

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

Develop烧写固件界面

由于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);,就会出现精度受影响的情况。

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

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

NVS

好像遇到了一点问题,NVS设置的不正确,导致存储出问题了

默认设置里一般用的是Single factory app,no OTA,偏移是0x8000

找到他的具体设置,可以看到应该是由CSV文件决定的

csv中的内容如下:

实际这个芯片是4M大小,给了APP 1MB,给了nvs 24KB

但是实际可用大小,还需要考虑到实际存储头等消耗,所以具体应该只有20567大小

但是,还不止这些。其实nvs里面可能还存储了很多wifi或者bt的相关设置,然后就实际可用大小其实只有7020左右。

所以如果要更大,需要手动修改csv,并且要注意:

大部分情况下,修改以后固件的起始地址会变,可能平常是0x10000,改大以后会变成0x20000或者更大,固件的地址是0x10000对齐的

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

https://blog.csdn.net/toopoo/article/details/107327828