《ESP32 物联网全栈实战-02》ESP-IDF 工程结构

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


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 感知世界

相关推荐
Nil2081 小时前
leetcode 138随机链表的复制
算法·leetcode·链表
疯狂打码的少年3 小时前
【数据结构】图的遍历:深度优先搜索(DFS)
数据结构·笔记·算法·深度优先
-凌凌漆-4 小时前
【freertos】Task创建(v2)
java·开发语言·算法
Nil2084 小时前
leetcode 24两两交换链表中的节点
算法·leetcode·链表
.格子衫.4 小时前
033动态规划之状态压缩DP——算法备赛
算法·动态规划
ysa0510304 小时前
c++常用自带函数用法与注意
c++·笔记·算法
带多刺的玫瑰6 小时前
Leecode#4刷题之寻找两个正序数组的中位数
java·前端·算法
土司大王6 小时前
LeetCode hot100——除了自身以外数组的乘积
数据结构·算法·leetcode
IvanCodes6 小时前
RAG 实战教程(三):向量数据库检索算法,KNN、IVF、HNSW 与 Faiss 实战
人工智能·算法·agent