相关链接:
https://docs.espressif.com/projects/esp-idf/zh_CN/latest/esp32s2/index.html。
https://github.com/espressif/esp-idf。
手动安装:
准备git,python需要3.8.x。假设这里准备一个C:\xiaguangbo\software\espidf文件夹来放库和工具。库的路径不能有中文和空格,库里的任何一个文件路径都不能超过90个字符。
在\espidf下用powershell执行:git config --global http.postBuffer 524288000,git clone --recursive https://github.com.cnpmjs.org/espressif/esp-idf.git。http.postBuffer小了会出问题,不行就再改大点。git clone用github.com.cnpmjs.org替代github.com快很多。完成后,espidf\esp-idf就是库的文件夹。
python的模块要自己安装。在espidf\esp-idf下用powershell执行pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple。
设置环境变量IDF_TOOLS_PATH:C:\xiaguangbo\software\espidf\.espressif。这样install脚本才能找到位置。运行install脚本。如果使用install脚本安装工具时,下载慢,直接把输出的信息里的下载地址放到浏览器里去下载,把下载下来的包放到espidf\.espressif\dist里。
现在工具都准备好了。
编译下载等:
在项目文件夹下执行export.ps1脚本,比如C:\xiaguangbo\software\espidf\esp-idf\export.ps1,export脚本会临时导入工具的路径,就可以执行idf.py命令了。命令行每次启动都要执行该脚本。
比如使用示例项目:把espidf\esp-idf\examples\get-started\sample_project复制一份,在复制的sample_project下执行export.ps1脚本,并依次执行:选择目标芯片型号:idf.py set-target esp32s2(有esp32、esp32s2、esp32c3等)。编译、下载、打印监控组合:idf.py -p COM3 build flash monitor(COM3是根据自己电脑上显示的串口号来的,monitor用”ctrl ]”退出)。
非必须命令:配置(比如设置spiFlash大小,cpu主频):idf.py menuconfig。
更新idf:
在\espidf下用powershell执行git pull,git submodule update --init --recursive。更新库后执行install脚本,更新工具。
问题:
如果下载失败,检查目标芯片设置的对不对,COM口选择的对不对,下载串口有没有受到干扰等。我把esp32s2核心板插面包板上就大概率下载失败。
项目编译有问题时,比如有些文件去掉了但还是会编译,就需要执行fullclean,将缓存文件全部删掉,回到未编译前的情况。
任务必须有延时,让IDLE任务去重置看门狗。
如果出现很多都未定义什么的,应该是没有相应的宏定义导致定义没有开放出来,不同的版本的库用的宏定义不一定相同。
工程目录和CMakeLists.txt的文件使用方法:
工程目录:
project/ > components/ > sdkCfg/ > sdkCfg.h
CMakeLists.txt
> tinyusb/ > additions/ > ...
src/ > ...
CMakeLists.txt
main/ > main.c
usbTask.c
CMakeLists.txt
CMakeLists.txt
...
需要写成这样,自己的各类库文件夹就放在project/components下。如果都放在project/main里,那project/main/CMakeLists.txt里不知道要写多少呢,所以要分开管理。
components目录的名字是有特殊意义的,会做特殊处理,该目录下的一级目录会作为“组件”,这里的组件有sdkCfg、tinyusb,main文件夹固定为组件。这里的组件如果和idf库里的components同名则会屏蔽库里的,使用这里的。
尽量防止组件的相互引用,否则会产生“循环依赖”问题,虽然可以解决,但会增加复杂性。
这里本想把sdkCfg.h移到project/main/下,但是这样tinyusb就要引用main组件,而main也引用了tinyusb组件,就会形成循环依赖,所以这里就把sdkCfg.h单独提出来了。
CMakeLists.txt内容:
project/CMakeLists.txt是固定的:
cmake_minimum_required(VERSION 3.5)
include($ENV{IDF_PATH}/tools/cmake/project.cmake)
project(main)
project/components/sdkCfg/CMakeLists.txt,只有.h文件,没有.c文件,且sdkCfg.h不引用其他文件:
idf_component_register(...
INCLUDE_DIRS ".")
project/components/tinyusb/CMakeLists.txt,引用了sdkCfg.h,所以要把sdkCfg组件加进来:
idf_component_register(SRC_DIRS
"additions/src"
"tinyusb/src"
"tinyusb/src/class/cdc"
"tinyusb/src/common"
"tinyusb/src/device"
"tinyusb/src/portable/espressif/esp32sx"
INCLUDE_DIRS
"."
"additions/include"
"additions/include_private"
"tinyusb/src"
"tinyusb/src/class/cdc"
"tinyusb/src/common"
"tinyusb/src/device"
"tinyusb/src/osal"
REQUIRES sdkCfg)
project/main/CMakeLists.txt,引用了sdkCfg.h和tinyusb的一些文件,所以要把这两个组件都加进来:
idf_component_register(SRC_DIRS "."
INCLUDE_DIRS "."
REQUIRES sdkCfg tinyusb)
|