本文章 来自原创专栏《ESP32教学专栏 (基于ESP-IDF)》,讲解如何使用 ESP-IDF 构建 ESP32 程序,发布文章并会持续为已发布文章添加新内容! 每篇文章都经过了精打细磨!
↓↓↓通过下方对话框进入专栏主页↓↓↓
CSDN 请求进入专栏 _ O x
是否进入ESP32教学专栏(基于ESP-IDF)?
确定
ESP-IDF 是由乐鑫Espressif官方提供的一套ESP32系列SoC的物联网开发套件(Espressif IoT Development framework)提供了从工程创建,编译,烧录,调试,量产等的完整解决方案。本文将介绍如何在Windows下搭建ESP-IDF开发环境。
敬告:
① 如果你想使用Arduino来开发ESP32,目前可参考的资料较多,请读者自行查阅。
② 使用Arduino开发ESP32,很难发挥ESP32的全部实力,强烈推荐相关专业人士或技术爱好者转为 ESP-IDF 开发。
③ ESP-IDF是乐鑫官方推荐的SDK。
注意:
文章目录下文的 “开发环境” 和 “编程环境” 的含义并非相同
编程环境:指代码编写的人机交互环境,例如使Clion IDE或者VS Code等工具对开发环境的耦合和优化。
开发环境:指ESP-IDF工程的建立,配置,编译,调试,量产等基础操作的环境。开发环境不包含编程环境
- (一)开发环境搭建
- 一、安装相关依赖
- 二、获取ESP-IDF
- 三、安装所需工具
- 1. 直接安装
- 2. 使用 Espressif 的 Github 下载服务器加速下载
- 四、检查前边工作是否成功
- (二)idf.py 基本操作使用
- (三)【全网独家】对开发环境的优化,使其更好与IDE耦合
- 一、锁定Python路径
- 二、锁定交叉编译工具链路径
- (四)【全网独家】Clion IDE For Windows 下 ESP-IDF 编程环境搭建
在文章开始之前,先感受一下Clion带来的流畅丝滑的变成体验吧!
① 丝滑头文件
② 丝滑结构体
③ 丝滑提示
ESP-IDF 及其工具等需要依赖以下组件
- 如果你的操作系统是Debian系(如Debian、Ubuntu、Deepin、Raspberry Pi OS等)
sudo apt-get install git wget flex bison gperf python3 python3-pip python3-setuptools cmake ninja-build ccache libffi-dev libssl-dev dfu-util libusb-1.0-0
- 如果你的操作系统是CentOS 7 & 8
(目前仍然支持CentOS 7,但是强烈建议使用CentOS 8)
sudo yum -y update && sudo yum install git wget flex bison gperf python3 python3-pip python3-setuptools cmake ninja-build ccache dfu-util libusbx
- 如果你的操作系统是Arch系(如Arch Linux、Manjaro等)
sudo pacman -S --needed gcc git make flex bison gperf python-pip cmake ninja ccache dfu-util libusb
二、获取ESP-IDF使用 ESP-IDF 需要 CMake 3.5 或以上版本。较早的 Linux 发行版可能需要升级自身的软件源仓库,或开启 backports 套件库,或安装 “cmake3” 软件包(不是安装 “cmake”)。
如果上述列表中,并没有您使用的系统,请参考您所用系统的相关文档,查看安装软件包所用的命令。
进入你想放置ESP-IDF文件夹的目录。然后执行以下命令获取esp-idf(git会自动创建esp-idf文件夹)
默认情况下,建议安装到~/esp/下
mkdir -p ~/esp cd ~/esp
① 例如,获取4.3.2版本发行版。(在此文章发布时,此为最新的稳定版,可能将来会成为旧版)
git clone -b v4.3.2 --recursive https://github.com/espressif/esp-idf.git esp-idf-v4.3.2
git会自动创建esp-idf-v4.3.2文件夹
② 再如,获取master分支(通常不是发行版,也可能不是稳定版,如果你并不确定自己要使用哪个版本,而是仅仅是想要入门ESP32开发,建议使用此命令克隆master分支)
git clone --recursive https://github.com/espressif/esp-idf.git
git会自动创建esp-idf文件夹
如果你想要获取其他版本,请从ESP-IDF官方github或者gitee查看最新发行版,并使用提供的对应版本的命令行
Github 发行版页 :https://github.com/espressif/esp-idf/tags
Gitee 发行版页:https://gitee.com/EspressifSystems/esp-idf/releases
接下来将会安装以下组建:
① 内置的 Python 虚拟环境(多数脚本由python编写,需要使用python执行。为防止干扰到其他的python,安装器会提供一个内置的python)
② 交叉编译器(这是在电脑上编译ESP32可执行文件必要的编译器,由于为在一种平台上编译出另一平台上的可执行文件,故称“交叉编译器”)
③ OpenOCD(针对高级用户。这是ESP32进行JTAG调试必要的组件,同样也支持STlink对stm32进行在线调试)
④ CMake 和 Ninja 编译工具 (这是连接源文件和交叉编译器的桥梁工具)
使用cd命令,切换到ESP-IDF的目录,并执行此目录下的install.sh
cd ~/esp/esp-idf ./install.sh
或
cd ~/esp/esp-idf-v4.3.2 ./install.sh2. 使用 Espressif 的 Github 下载服务器加速下载
若下载缓慢,或中途有无法连接服务器的情况,请使用乐鑫 Espressif 官方提供的 Github 下载服务器加速下载。只需要临时加一个环境变量IDF_GITHUB_ASSETS,内容为dl.espressif.com/github_assets即可。
cd ~/esp/esp-idf export IDF_GITHUB_ASSETS="dl.espressif.com/github_assets" ./install.sh
该设置只影响从 Github 发布版本中下载的单个工具,它并不会改变访问任何 Git 仓库的 URL。
上述两种方法都会默认在$HOME/.espressif/内下载所需的工具链,这个目录可以更改,但是不建议更改。更改方法见官网https://docs.espressif.com/projects/esp-idf/zh_CN/latest/esp32/get-started/index.html#id17
四、检查前边工作是否成功cd到ESP-IDF路径,执行其中的export.sh。
cd ~/esp/esp-idf . ./export.sh
. $HOME/esp/esp-idf/export.sh
注意,命令开始的 “.” 与路径之间应有一个空格!
如果出现如下输出,即前边的工作成功!我们就可以在命令行中使用idf.py工具了,详见下一节。
Done! You can now compile ESP-IDF projects. Go to the project directory and run: idf.py build(二)idf.py 基本操作使用
ESP-IDF的idf.py是最重要的工具之一,可以创建工程、编译、烧录、监视等。还能管理 ESP32 系列的 flash 等。
使用idf.py之前,要与上文 检查前边工作是否成功 一样执行export.sh。但是每次输入export.sh的路径很麻烦。我们可以给执行export.sh的命令起一个别名alias。
方法是在~下的.profile、.bashrc、.zprofile、.zshrc文件中加入一句
alias get-idf='. $HOME/esp/esp-idf/export.sh'
并保存,重新打开终端。输入get-idf即可执行export.sh,之后就可以使用idf.py工具了。
甚至,如果你不想要输入idf.py后边的.py,也可以给idf.py起一个别名,方法同上,也是在.profile、.bashrc、.zprofile、.zshrc文件中加入一句
alias idf='idf.py'
这样,我们输入idf即可。
例如,我们
get-idf idf menuconfig
如果你没有像上边那样给idf.py起别名为idf,则下方的idf要写原名idf.py。如idf menuconfig要写成idf.py menuconfig
① 创建一个名为NAME的工程
idf.py create-project NAME
② 打开menuconfig 工程配置菜单
idf menuconfig
③ 编译
idf build
④ 烧录
#指定烧录端口,以COM3为例 idf -p COM3 flash #自动检测端口(从最大的开始检测) idf flash
⑤ 监视器(使用Ctrl+]退出监视器)
#指定监视端口,以COM3为例 idf -p COM3 monitor #自动检测端口(从最大的开始检测) idf monitor
⑥ 使用组合命令(同样使用Ctrl+]退出监视器)
idf.py的命令可以组合使用
如:编译+烧录+监视
#指定烧录 & 监视的端口,以COM3为例 idf -p COM3 build flash monitor #自动检测端口(从最大的开始检测) idf build flash monitor
(三)【全网独家】对开发环境的优化,使其更好与IDE耦合对于其他的功能,请使用--help打开帮助idf.py --help。如下
Commands:行之后即为idf.py所有命令。本文不再赘述$ idf.py --help Usage: idf.py [OPTIONS] COMMAND1 [ARGS]... [COMMAND2 [ARGS]...]... ESP-IDF CLI build management tool. For commands that are not known to idf.py an attempt to execute it as a build system target will be made. Options: --version Show IDF version and exit. --list-targets Print list of supported targets and exit. -C, --project-dir PATH Project directory. -B, --build-dir PATH Build directory. -w, --cmake-warn-uninitialized / -n, --no-warnings Enable CMake uninitialized variable warnings for CMake files inside the project directory. (--no-warnings is now the default, and does not need to be specified.) The default value can be set with the IDF_CMAKE_WARN_UNINITIALIZED environment variable. -v, --verbose Verbose build output. --preview Enable IDF features that are still in preview. --ccache / --no-ccache Use ccache in build. Disabled by default. The default value can be set with the IDF_CCACHE_ENABLE environment variable. -G, --generator [Ninja|MinGW Makefiles] CMake generator. -D, --define-cache-entry TEXT Create a cmake cache entry. This option can be used at most once either globally, or for one subcommand. -b, --baud INTEGER Baud rate for flashing. The default value can be set with the ESPBAUD environment variable. This option can be used at most once either globally, or for one subcommand. -p, --port TEXT Serial port. The default value can be set with the ESPPORT environment variable. This option can be used at most once either globally, or for one subcommand. --help Show this message and exit. Commands: all Aliases: build. Build the project. app Build only the app. app-flash Flash the app only. bootloader Build only bootloader. bootloader-flash Flash bootloader only. build-system-targets Print list of build system targets. clean Delete build output files from the build directory. confserver Run JSON configuration server. create-component Create a new component. create-project Create a new project. efuse_common_table Generate C-source for IDF’s eFuse fields. efuse_custom_table Generate C-source for user's eFuse fields. encrypted-app-flash Flash the encrypted app only. encrypted-flash Flash the encrypted project. erase_flash Erase entire flash chip. erase_otadata Erase otadata partition. flash Flash the project. fullclean Delete the entire build directory contents. gdb Run the GDB. gdbgui GDB UI in default browser. gdbtui GDB TUI mode. menuconfig Run "menuconfig" project configuration tool. monitor Display serial output. openocd Run openocd from current path partition_table Build only partition table. partition_table-flash Flash partition table only. post_debug Utility target to read the output of async debug action and stop them. python-clean Delete generated Python byte code from the IDF directory read_otadata Read otadata partition. reconfigure Re-run CMake. set-target Set the chip target to build. show_efuse_table Print eFuse table. size Print basic size information about the app. size-components Print per-component size information. size-files Print per-source-file size information. uf2 Generate the UF2 binary with all the binaries included uf2-app Generate an UF2 binary for the application only
我们知道,在之前我们使用idf.py之前都执行了一个export.sh。实际上,这个sh文件本质上是在扩充环境变量,扩充之后,才能正常使用idf.py工具。
不幸的是,export.sh对环境变量的扩充并非永久的,这是乐鑫官方防止因为此扩充而影响到原本的环境变量。因此,乐鑫要求每次手动执行export.sh来临时扩充环境变量,这个扩充只能影响当前命令行窗口,窗口一旦关闭,下次使用又要执行export.sh来手动扩充。
这样做虽然有好处,但是由于此方案只对当前命令行窗口生效,因此,这不利于在IDE中使用ESP-IDF,因为IDE并没有命令行窗口这个概念。(即使你在IDE自带的终端中执行了export.sh,但IDE的其他服务如加载CMake项目等操作并不在你手动执行扩充的终端里执行。因此这套方案对IDE的支持并不现实)你可能曾经尝试在IDE中加载ESP-IDF工程,但是以失败告终,原因就在于此
网上的其他方法比如在 Linux 系统环境变量,如/etc/environment里加入export.sh扩充的那些路径,但是这样做缺点很明显。这样做是永久设置环境变量,因此会影响到其他地方。例如,你的电脑里有自己的Python环境,再将ESP-IDF内置的Python环境加入环境变量会冲突(系统只会使用相对靠前的路径)因此,这方法虽然可行,但是影响过大。
博主花费了一段时间,阅读esp-idf的cmake脚本源代码之后,分析出了一种更好的方法。
下面介绍这种全网首创的方法,锁定相关路径。
一、锁定Python路径打开esp-idf下的toolscmake文件夹。
例如/home/用户名/esp/esp-idf-v4.3.1/tools/cmake
分别打开build.cmake和project.cmake,搜索set_default,找到 set_default(python "python") 或 set_default(PYTHON "python") 。并把后边引号中的python改成esp-idf内置的python的 绝对路径。
内置python的绝对路径在.espressif文件夹内
注意:不同版本的esp-idf中这句话的位置可能不同,甚至可能只在一个文件中出现。但是不用担心,只要保证把所有的地方找到并按下文操作即可
例如python的可知性文件在
/home/augtons/.espressif/python_env/idf4.3_py3.8_env/bin
目录内,则改成如下这样
set_default(python "python") ↓改为 set_default(python "/home/augtons/.espressif/python_env/idf4.3_py3.8_env/bin/python") set_default(PYTHON "python") ↓改为 set_default(PYTHON "/home/augtons/.espressif/python_env/idf4.3_py3.8_env/bin/python")
请按照自己的实际情况来。
如果你的电脑里有vscode,可以直接用vscode打开esp-idf下的toolscmake目录,直接搜索set_default再逐个点开检查即可。
参考上文 “(一) - 三 安装所需工具”
二、锁定交叉编译工具链路径打开esp-idf下的toolscmake文件夹。
例如/home/用户名/esp/esp-idf-v4.3.1/tools/cmake
找到所有形如toolchain-esp**.cmake的文件,打开
以toolchain-esp32.cmake举例,文件很短,有如下几行
set(CMAKE_C_COMPILER xtensa-esp32-elf-gcc) set(CMAKE_CXX_COMPILER xtensa-esp32-elf-g++) set(CMAKE_ASM_COMPILER xtensa-esp32-elf-gcc)
我们也要将xtensa-esp32-elf-gcc等替换成其绝对路径,例如这个工具链可能在
/home/augtons/.espressif/tools/xtensa-esp32-elf/esp-2021r1-8.4.0/xtensa-esp32-elf/bin目录下
因此
set(CMAKE_C_COMPILER /home/augtons/.espressif/tools/xtensa-esp32-elf/esp-2021r1-8.4.0/xtensa-esp32-elf/bin/xtensa-esp32-elf-gcc) set(CMAKE_CXX_COMPILER /home/augtons/.espressif/tools/xtensa-esp32-elf/esp-2021r1-8.4.0/xtensa-esp32-elf/bin/xtensa-esp32-elf-g++) set(CMAKE_ASM_COMPILER /home/augtons/.espressif/tools/xtensa-esp32-elf/esp-2021r1-8.4.0/xtensa-esp32-elf/bin/xtensa-esp32-elf-gcc)
改好保存即可
其余的以此类推,其余的所有工具链都在/home/用户名/.espressif/tools下,按照文件名找即可,本文不在赘述。改好保存即可
(四)【全网独家】Clion IDE For Windows 下 ESP-IDF 编程环境搭建本文默认大家已经成功安装Clion,安装方法自行查阅,很简单。本文不再赘述。
参考本文(二)idf.py基本操作使用,创建一个工程。
用Clion打开这个工程,选择加载CMake项目(无弹窗则自动加载)
加载过程中可能出现找不到cmake文件的错误,如下图。是环境变量中缺少IDF_PATH原因导致。可以按照以下方法完成修复。
下文之所以后边分了两种情况,是因为esp32的ESP-IDF和esp8266的RTOS SDK 都用到了这个IDF_PATH环境变量,可能会造成冲突。请读者根据自己的情况选择合适的方法。
推荐方法二,每次手动修改CMakeLists.txt即可
【一】电脑里没有 ESP8266 RTOS SDK 且 之后不打算使用RTOS SDK开发esp8266的,可永久指定IDF_PATH路径,一劳永逸。
sudo nano /etc/environment 在最后一行加上 IDF_PATH='自己esp-idf的路径' 例如我的是 IDF_PATH='/home/augtons/esp/esp-idf'
保存即可
【二】电脑里已经安装过 ESP8266 RTOS SDK 或 之后打算使用RTOS SDK开发esp8266的,并与ESP-IDF共存的,需要打开该工程根目录下的CMakeLists.txt,指定未找到的cmake文件的绝对路径
将前边的$ENV{IDF_PATH}替换成真实路径,例如
include(/home/augtons/esp/esp-idf/tools/cmake/project.cmake)
或者,参考方法一,分别建立IDF32_PATH和IDF8266_PATH两个环境变量。分别改成esp-idf路径和esp8266-rtos-sdk的路径。之后在此CMakeLists.txt改成如下即可
include($ENV{IDF32_PATH}/tools/cmake/project.cmake)
如果你是按照前文所述方法的安装的esp-idf,则不再会有其他的错误,如果仍然有错误,欢迎评论区留言或私信。祝大家搭建顺利!



