第 2 篇:ESP-IDF 工程结构------别再用 Arduino 了
ESP-IDF 的工程结构和 Keil/IAR 完全不同。如果上来就用 Arduino IDE 写完这个专栏,量产时你会后悔。这篇帮你一次性理解 ESP-IDF 的组件系统和构建流程。
1. 工程目录结构
bash
my_iot_project/
├── CMakeLists.txt # 顶层 CMake
├── sdkconfig # menuconfig 生成的配置
├── main/
│ ├── CMakeLists.txt # idf_component_register(SRCS "main.c")
│ └── main.c # app_main() 入口
├── components/
│ ├── sht30/ # 温湿度传感器驱动
│ │ ├── CMakeLists.txt
│ │ ├── sht30.h
│ │ └── sht30.c
│ ├── wifi_manager/ # WiFi 管理组件
│ │ ├── CMakeLists.txt
│ │ ├── wifi_manager.h
│ │ └── wifi_manager.c
│ └── mqtt_client/ # MQTT 客户端组件
│ ├── CMakeLists.txt
│ ├── mqtt_client.h
│ └── mqtt_client.c
└── partitions.csv # 分区表
组件(Component)= 独立的 .c/.h + CMakeLists.txt = 可复用的软件模块。
2. app_main() 不是 main()
c
// ESP-IDF 中你的入口是 app_main(),不是 main()
void app_main(void)
{
// 1. 初始化 NVS(非易失存储,WiFi 凭据存这里)
nvs_flash_init();
// 2. 初始化网络
wifi_init_sta();
// 3. 初始化传感器
sht30_init();
// 4. 创建任务
xTaskCreate(sensor_task, "sensor", 4096, NULL, 5, NULL);
xTaskCreate(mqtt_task, "mqtt", 8192, NULL, 4, NULL);
}
底层 main() 已经被 ESP-IDF 框架实现了------初始化 FreeRTOS、启动第二核心、加载分区表、然后才调你的 app_main()。
3. menuconfig------图形化配置系统
bash
idf.py menuconfig
# → 图形界面配置:
# - WiFi SSID / Password
# - CPU 频率 (80/160/240 MHz)
# - Flash 大小
# - FreeRTOS tick rate
# - 堆大小
# - 日志级别
所有配置保存在 sdkconfig 文件中,make menuconfig 自动生成 sdkconfig.h 供代码使用:
c
#include "sdkconfig.h"
printf("CPU freq: %d MHz\n", CONFIG_ESP_DEFAULT_CPU_FREQ_MHZ);
4. 构建与烧录
bash
idf.py set-target esp32c3 # 选择芯片
idf.py menuconfig # 配置
idf.py build # 编译
idf.py -p COM3 flash # 烧录
idf.py -p COM3 monitor # 串口监视(Ctrl+] 退出)
下一篇:GPIO + 传感器驱动------让 ESP32 感知世界