ESP32基础配置
ESP32基础配置
本笔记为作者再学习ESP32的一些心得体会,如有不对的地方,请包含与谅解!
————by wsoz
ESP-IDF配置
环境项配置
ESP32我们采样ESP-IDF来进行编译,我们直接拉取官方的空工程来构建我们的工程然后在该文件夹下添加我们自己的idf_5.1.2.code-workspace
文件,后续我们打开文件直接通过这个文件打开即可。
该文件的作用就是告诉VS Code 和它安装的 “Espressif IDF” 扩展,你的 ESP-IDF (乐鑫物联网开发框架) 工具链都安装在哪里,以及如何配置它们。
{"folders": [{"path": "."}],"settings": {"idf.espIdfPathWin": "d:\\esp32-idf-ahy\\5.1.2\\frameworks\\esp-idf-v5.1.2","idf.pythonBinPathWin": "d:\\esp32-idf-ahy\\5.1.2\\python_env\\idf5.1_py3.11_env\\Scripts\\python.exe","idf.toolsPathWin": "d:\\esp32-idf-ahy\\5.1.2","idf.customExtraPaths": "d:\\esp32-idf-ahy\\5.1.2\\tools\\xtensa-esp-elf-gdb\\12.1_20221002\\xtensa-esp-elf-gdb\\bin;d:\\esp32-idf-ahy\\5.1.2\\tools\\riscv32-esp-elf-gdb\\12.1_20221002\\riscv32-esp-elf-gdb\\bin;d:\\esp32-idf-ahy\\5.1.2\\tools\\xtensa-esp32-elf\\esp-12.2.0_20230208\\xtensa-esp32-elf\\bin;d:\\esp32-idf-ahy\\5.1.2\\tools\\xtensa-esp32s2-elf\\esp-12.2.0_20230208\\xtensa-esp32s2-elf\\bin;d:\\esp32-idf-ahy\\5.1.2\\tools\\xtensa-esp32s3-elf\\esp-12.2.0_20230208\\xtensa-esp32s3-elf\\bin;d:\\esp32-idf-ahy\\5.1.2\\tools\\riscv32-esp-elf\\esp-12.2.0_20230208\\riscv32-esp-elf\\bin;d:\\esp32-idf-ahy\\5.1.2\\tools\\esp32ulp-elf\\2.35_20220830\\esp32ulp-elf\\bin;d:\\esp32-idf-ahy\\5.1.2\\tools\\cmake\\3.24.0\\bin;d:\\esp32-idf-ahy\\5.1.2\\tools\\openocd-esp32\\v0.12.0-esp32-20230921\\openocd-esp32\\bin;d:\\esp32-idf-ahy\\5.1.2\\tools\\ninja\\1.10.2;d:\\esp32-idf-ahy\\5.1.2\\tools\\idf-exe\\1.0.3;d:\\esp32-idf-ahy\\5.1.2\\tools\\ccache\\4.8\\ccache-4.8-windows-x86_64;d:\\esp32-idf-ahy\\5.1.2\\tools\\dfu-util\\0.11\\dfu-util-0.11-win64;d:\\esp32-idf-ahy\\5.1.2\\tools\\esp-rom-elfs\\20230320","idf.customExtraVars": {"OPENOCD_SCRIPTS": "d:\\esp32-idf-ahy\\5.1.2\\tools\\openocd-esp32\\v0.12.0-esp32-20230921/openocd-esp32/share/openocd/scripts","IDF_CCACHE_ENABLE": "1","ESP_ROM_ELF_DIR": "d:\\esp32-idf-ahy\\5.1.2\\tools\\esp-rom-elfs\\20230320/"},"idf.gitPathWin": "d:\\esp32-idf-ahy\\5.1.2\\tools\\idf-git\\2.39.2\\cmd\\git.exe","idf.espAdfPathWin": "D:\\esp32-idf-ahy\\esp-adf","files.associations": {"gpio.h": "c","stdio.h": "c","task.h": "c","sdkconfig.h": "c"}}
}
然后我们还需要修改一下.vscode
文件夹因为可能会出现链接错误等问题
我们直接删除整个文件夹然后在搜索框中输入如图
然后选择配置ESP-IDF扩展即可
配置项修改
首先现在ESP-IDF的设置界面调整几个参数:
- 烧录方式-UART
- 烧录的波特率拉到最高2MHZ-2000000
- 串口监视器-115200
然后在sdk-menuconfig
中配置
- 搜索CPU直接将主频拉到240MHZ
- freertos的系统节拍修改为1ms–1000hz
- freertos的版本兼容configENABLE_BACKWARD_COMPATIBILITY
工程构建
ESP-IDF是采用的CMakeLists工具构建。IDF工具链中的构建工具Ninja会根据CMake生成的makefile执行实际的编译、链接等构建步骤。
我们采用的框架是组件驱动库加应用层构建我们的工程框架
然后我们的每一个组件中都需要有一个Cmake文件来链接进入我们的工程。
下面主要讲一下整个工程的cmake文件分为了项目CMake以及组件Cmake
项目CMake
每个工程都有一个项目 CMakeLists.txt 文件,其中包含整个项目的构建设置。默认情况下,项目 CMakeLists 可
以非常小。
# The following lines of boilerplate have to be in your project's
# CMakeLists in this exact order for cmake to work correctly# 1. 设置最低的 CMake 版本要求
# 告诉构建系统,要成功构建这个项目,CMake 工具的版本至少需要是 3.16。
# 这是一个兼容性声明,确保不会在过旧的环境下构建失败。
cmake_minimum_required(VERSION 3.16)# 2. 引入 ESP-IDF 的核心构建脚本
# 这是整个项目的魔法所在!
# $ENV{IDF_PATH} 是一个环境变量,指向你的 ESP-IDF 框架的安装路径。
# 这行代码的作用是加载乐鑫官方提供的 project.cmake 脚本。
# 这个脚本包含了所有复杂的逻辑,比如如何发现组件、如何编译、如何链接、如何生成最终的 .bin 固件等等。
include($ENV{IDF_PATH}/tools/cmake/project.cmake)# 3. 定义项目名称
# 这行代码为你的项目命名为 "sample_project"。
# 这个名字会出现在构建日志和一些生成的文件中。
# 通常,我们让它和项目文件夹的名称保持一致。
project(sample_project)
组件CMake
每个项目都包含一个或多个组件。组件可以是 ESP-IDF 的一部分、项目自己的组件目录的一部分,或者从自定义组件目录中
添加。主要是告诉整个工程自己需要将哪些源码构建进工程以及自己能提供的接口和所需要的依赖有哪些。
idf_component_register(# 1. 列出所有 .c 源文件,需要包含 src/ 路径SRCS "src/key.c" --> 告诉系统要编译哪些源文件# 2. 指定 .h 头文件所在的目录INCLUDE_DIRS "inc" -->提供可供外部使用的公共接口 # 2. 指定依赖REQUIRES driver -->声明自己的依赖
)
同时为了避免重复去main组件的CMake中频繁修改包含我们可以修改原本的CMake为:
idf_component_register(# 1. 列出所有 .c 源文件,需要包含 src/ 路径SRC_DIRS ".""myapp"# 2. 指定 .h 头文件所在的目录INCLUDE_DIRS ".""myapp"
)
这个版本会自动去 main
目录和 main/myapp
目录里寻找所有的 .c
和 .cpp
文件来编译。
乐鑫在线组件管理器
在乐鑫拓展处点击Components Manager
进入乐鑫在线组件管理器,我们可以在此处进行搜索然后使用乐鑫官方已经提供的组件方便我们开发。或者进入网站ESP Component Registry进行搜索。
下面我们以使用按键库为例子,首先我们需要复制红圈处然后在终端进行粘贴,然后就会自动将该库导入我们的工程。
在ESP-IDF终端中进行输入即可,需要注意的是如果我们的电脑中装了Ananconda会导致我们的idf.py
文件无法执行,所以我们需要先退出Ananconda环境
conda deactivate
#如果(base) PS则表示没有2完全退出Ananconda环境
#退出Ananconda环境后为 PS
当然也有更简单的方法就是直接在ESP-IDF终端禁用Ananconda环境
conda config --set auto_activate_base false
#这行命令是全局的全局禁用了该环境
#所以在其他有关python的环境中要使用到就需要按下面的激活该环境# 激活 base 环境
conda activate base
具体使用文档可以参考按钮 - - — ESP-IoT-解决方案最新文档
下面为本人写的简单使用没添加RTOS框架
#include <stdio.h>
#include "key_app.h"
#include "esp_log.h"
#include "iot_button.h"
#include "button_gpio.h"void button_app_cb1(void *arg,void *usr_data)
{printf("Button clicked\n");
}void button_app_cb2(void *arg,void *usr_data)
{printf("Button long pressed\n");
}void button_init(void)
{const button_config_t btn_cfg = {.long_press_time = 1000, //长按时间阈值.short_press_time = 0, //短按时间阈值}; //长短按阈值const button_gpio_config_t btn_gpio_cfg = //GPIO配置 端口号以及有效电平{.gpio_num = 0,.active_level = 0,.disable_pull=0,};button_handle_t gpio_btn = NULL; //按钮句柄esp_err_t ret = iot_button_new_gpio_device(&btn_cfg, &btn_gpio_cfg, &gpio_btn);if(NULL == gpio_btn) {printf("Button create failed");}iot_button_register_cb(gpio_btn, BUTTON_LONG_PRESS_START,NULL,button_app_cb2, NULL); //注册回调函数iot_button_register_cb(gpio_btn, BUTTON_SINGLE_CLICK,NULL,button_app_cb1, NULL); //注册回调函数
}void app_main(void)
{button_init();while (1){}
}