Foreword
好久没弄ESP32,又要捡起来折腾一下,记录一下相关内容。
环境
ESP32 IDF没有IDE,所以还是依赖VS code来完成,直接搜索esp32,安装对应插件
在下一步前,建议先把代理开起来,不然下载速度感人
根据教程,F1,输入Select where to save configuration settings
设置一下工程路径,然后下载对应的IDF
需要注意的是这里插件其实已经把整个虚拟环境安装好了,包括各种编译需要的工具链。
所以官方教程中的编译第一个项目,需要安装的各种都可以跳过,直接进入编译调试环节就行了。
最后安装环境可能会出错
第一种是这样的错,可能是网络有问题,这种需要删掉之前的.espressif
和esp
路径的内容,挂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方式
- 通过USB-JTAG-BUILDin,简单说平常ESP32的USB接口直接就内置了一个JTAG调试和串口,既能用来烧写又能用来串口输出或者是烧写,缺点就是由于是内置的,所以如果程序本身休眠或者跑死了,是无法再JTAG调试的,只能调试硬件正常的情况。
- 通过PROG,这种就是官方给的调试接口了,需要对应的ESP-PROG调试器
- 通过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