esp32开发笔记
Ubuntu下espidf开发环境配置 官方链接
第一步:安装准备
-
ubuntu
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
第二步:获取esp-idf
- 克隆远程仓库至
~/esp
目录mkdir -p ~/esp cd ~/esp git clone -b v4.3 --recursive https://github.com/espressif/esp-idf.git
第三步:设置工具
-
除了 ESP-IDF 本身,您还需要安装 ESP-IDF 使用的各种工具,比如编译器、调试器、Python 包等。
cd ~/esp/esp-idf ./install.sh
ESP-DIF 实例工程结构
ESP-IDF 示例工程结构
-
CMakeList.txt: 根目录的 CMakeList 描述了项目的构建行为,每个component中的CMakeList描述了组件的构建行为,例如指定编译哪些 .c 文件,包含哪些 .h 文件.
-
sdkconfig: 保存了项目宏定义,在使用 menuconfig 时自动生成.
-
components:用户组件目录,可自定义组件,也可对IDF_PATH 下的同名组件进行覆盖.
-
main: “伪组件”,与 components 中的组件遵循相同的编译规则,其中的app_main函数为默认的执行入口.
-
build:编译时自动保存的文件,无需修改
myProject/
│── CMakeLists.txt
│── sdkconfig
│── components/
│ ├── component1/
│ │ ├── CMakeLists.txt
│ │ ├── Kconfig
│ │ ├── src1.c
│ ├── component2/
│ │ ├── CMakeLists.txt
│ │ ├── Kconfig
│ │ ├── src1.c
│ │ ├── include/
│ │ │ ├── component2.h
│── main/
│ ├── CMakeLists.txt
│ ├── src1.c
│ ├── src2.c
│── build/
idf.py 常用指令
idf.py help
: 将输出指令列表和使用说明。idf.py set-target <target>
: 设置编译目标,<target>
请替换为esp32s3
等。idf.py menuconfig
: 运行menuconfig
终端图像化配置工具,可以选择修改配置选项,配置结果将保存在sdkconfig
文件。idf.py build
: 开始编译代码,编译产生的中间文件和最终的可执行程序,将默认保存在项目build
目录。编译过程是增量式的,如果仅对一个源文件进行修改,下次编译时只重新编译该文件。idf.py fullclean
: 删除整个build
目录下的内容,包括所有 CMake 的配置输出文件。下次构建项目时,CMake 会从头开始配置项目。请注意,该命令会递归删除构建目录下的所有文件,请谨慎使用。idf.py flash
: 将build
生成的可执行程序二进制文件烧录进目标 ESP32-C3 设备中。
-p <port_name>
和-b <baud_rate>
选项可分别设置串口的设备名和烧录时的波特率,如果不指定将自动搜索串口,并使用默认波特率。idf.py monitor
: 用于显示目标 ESP32-C3 设备的串口输出。同样-p
选项可用于设置主机端串口的设备名,串口打印期间,可按 Ctrl+] 退出监视器。unset IDF_TARGET
: 清除当前项目工程目录下的Target设置,项目编译时根据Target设置选择编译器,编译环境,以及sdkconfig配置生成。
esp32实践笔记
esp32工程项目构建逻辑
全局构建逻辑
构建入口
↓
项目顶层 CMakeLists.txt //通知cmake 该工程为esp32工程,按esp32工程组织main目录.components目录
↓
读取 sdkconfig //这里保存了idf.py menuconfig配置好的工程选项
↓
找 main/ 代码 //找main/目录下的 CMakeLists.txt告诉构建系统主函数有哪些源文件
↓
找 components/ 模块 //寻找自定义模块集合每个模块有自己小的编译规则。
↓
build/ 生成中间文件 //CMake开始工作,在 `my_project/build/` 里生成大量中间文件
↓
最终生成 .bin/.elf 固件文件
分区表(partitions.csv
)的介入规则
- 第1步:在 sdkconfig 中,指定要用哪个分区表
CONFIG_PARTITION_TABLE_CUSTOM=y //CUSTOM=y ➔ 说明你想用自定义分区表 CONFIG_PARTITION_TABLE_CUSTOM_FILENAME="partitions.csv" //自定义分区表路径
idf_component.yml
的介入规则
-
idf_componet.yml
目录结构components/组件名/idf_component.yml //main/目录也是特殊组件 main/idf_component.yml
-
'idf_component.yml' 作用阈:
- 自动下载缺失的外部托管组件(到
managed_components/
) - 生成和锁定组件依赖关系(写入
.dependencies.lock
) - 加载本地依赖(
override_path
:)可以覆盖外部托管组件地址,用本地组件地址替换
- 自动下载缺失的外部托管组件(到
工程文件配置方法及注意事项
分区表(partitions.csv
)配置
partitions.csv
配置指南- 查看芯片实际flash容量
esptool.py flash_id
- ✅ ESP32 分区表必要区笔记表格
分区名称 | 类型 (Type) | 子类型 (SubType) | 必要性 | 说明 |
---|---|---|---|---|
nvs |
data |
nvs |
✅ 必须 | 非易失性存储,保存 Wi-Fi、蓝牙配对、用户配置等 |
phy_init |
data |
phy |
✅ 必须 | PHY 初始化参数,Wi-Fi 启动时加载 |
factory |
app |
factory |
✅ 必须(无 OTA) | 主程序启动入口,无 OTA 时系统默认从这里运行应用程序 |
ota_data |
data |
ota |
✅ 必须(OTA) | OTA 状态记录,指示当前运行的是 ota_0 还是 ota_1 |
ota_0 |
app |
ota_0 |
✅ 必须(OTA) | 第一个 OTA 应用程序存储分区 |
ota_1 |
app |
ota_1 |
✅ 必须(OTA) | 第二个 OTA 应用程序分区,供轮流升级使用 |
📌 注:
- OTA用于远程固件升级;必要分区名称不可随意更改;
- 如果不启用 OTA 功能,只需要
nvs
,phy_init
,factory
三个分区即可;- 启用 OTA 功能时,必须添加
ota_data
,ota_0
,ota_1
;spiffs
,fatfs
,storage
等是可选的,根据项目需求添加。