第 2 篇:ESP-IDF 工程结构——别再用 Arduino 了

ESP-IDF 的工程结构和 Keil/IAR 完全不同。如果上来就用 Arduino IDE 写完这个专栏,量产时你会后悔。这篇帮你一次性理解 ESP-IDF 的组件系统和构建流程。


1. 工程目录结构

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()

// 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——图形化配置系统

idf.py menuconfig
# → 图形界面配置:
#   - WiFi SSID / Password
#   - CPU 频率 (80/160/240 MHz)
#   - Flash 大小
#   - FreeRTOS tick rate
#   - 堆大小
#   - 日志级别

所有配置保存在 sdkconfig 文件中,make menuconfig 自动生成 sdkconfig.h 供代码使用:

#include "sdkconfig.h"
printf("CPU freq: %d MHz\n", CONFIG_ESP_DEFAULT_CPU_FREQ_MHZ);

4. 构建与烧录

idf.py set-target esp32c3      # 选择芯片
idf.py menuconfig              # 配置
idf.py build                   # 编译
idf.py -p COM3 flash           # 烧录
idf.py -p COM3 monitor         # 串口监视(Ctrl+] 退出)

下一篇:GPIO + 传感器驱动——让 ESP32 感知世界

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐