esp32 的IDF本质上就是FreeRTOS,默认使用(arduino也可以直接使用rtos相关代码)
安装esp-idf,多数情况下需要先下载安装vscode,然后再插件搜索esp-idf,默认选择express并安装最新版即可
安装后,在左侧的Advance选择新项目向导

然后在上方选择你的当前用的esp-idf版本
然后你会看到

选择get-started->helloworld然后创建项目

如下配置
ProjectName是你的项目名字,也就是你文件夹的名字
下面的那个是文件路径,推荐找个好记住的
Esp-IDF board 是你的板子,根据你板子选择,本次选择esp32-s3
端口一般默认不选择,因为你就连接一台足够了,多台后面再底部有个port可以选择
然后创建项目
让我们分析代码结构
main是你主要代码目录,那里存放主代码,今后操作也主要在这里进行
让我们打开main文件里面的main.c
/*
* SPDX-FileCopyrightText: 2010-2022 Espressif Systems (Shanghai) CO LTD
*
* SPDX-License-Identifier: CC0-1.0
*/
#include <stdio.h>
#include <inttypes.h>
#include "sdkconfig.h"
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "esp_chip_info.h"
#include "esp_flash.h"
#include "esp_system.h"
void app_main(void)
{
printf("Hello world!\n");
/* Print chip information */
esp_chip_info_t chip_info;
uint32_t flash_size;
esp_chip_info(&chip_info);
printf("This is %s chip with %d CPU core(s), %s%s%s%s, ",
CONFIG_IDF_TARGET,
chip_info.cores,
(chip_info.features & CHIP_FEATURE_WIFI_BGN) ? "WiFi/" : "",
(chip_info.features & CHIP_FEATURE_BT) ? "BT" : "",
(chip_info.features & CHIP_FEATURE_BLE) ? "BLE" : "",
(chip_info.features & CHIP_FEATURE_IEEE802154) ? ", 802.15.4 (Zigbee/Thread)" : "");
unsigned major_rev = chip_info.revision / 100;
unsigned minor_rev = chip_info.revision % 100;
printf("silicon revision v%d.%d, ", major_rev, minor_rev);
if(esp_flash_get_size(NULL, &flash_size) != ESP_OK) {
printf("Get flash size failed");
return;
}
printf("%" PRIu32 "MB %s flash\n", flash_size / (uint32_t)(1024 * 1024),
(chip_info.features & CHIP_FEATURE_EMB_FLASH) ? "embedded" : "external");
printf("Minimum free heap size: %" PRIu32 " bytes\n", esp_get_minimum_free_heap_size());
for (int i = 10; i >= 0; i--) {
printf("Restarting in %d seconds...\n", i);
vTaskDelay(1000 / portTICK_PERIOD_MS);
}
printf("Restarting now.\n");
fflush(stdout);
esp_restart();
}
这是个c语言,编译型语言,学过的很熟悉很正常
include <stdio.h>
include <inttypes.h>
include "sdkconfig.h"
include "freertos/FreeRTOS.h"
include "freertos/task.h"
include "esp_chip_info.h"
include "esp_flash.h"
include "esp_system.h"
这几个头文件目前使用频率很高,日后注意
我们可以把这段代码分为四个部分来拆解:
1. 头文件与入口函数
#include "freertos/FreeRTOS.h" // FreeRTOS 基础库
#include "freertos/task.h" // 任务相关 API(如 vTaskDelay)
#include "esp_system.h" // 系统基础 API(如 esp_restart)
// ... 其他硬件信息查询相关的头文件
void app_main(void) { ... }app_main: 这是 ESP-IDF 的程序入口点。不同于标准 C 语言的main,在 ESP32 中,系统启动后会自动创建一个名为main的 FreeRTOS 任务并运行这个函数。
2. 获取芯片核心信息
代码通过 esp_chip_info_t 结构体来读取硬件参数:
esp_chip_info_t chip_info;
esp_chip_info(&chip_info); // 将硬件信息填充到结构体中接下来是一连串的 printf,利用位运算(&)判断芯片支持的功能:
CONFIG_IDF_TARGET: 这是一个宏,在编译时由工具链确定(对于你来说就是 "esp32s3")。CHIP_FEATURE_WIFI_BGN: 判断是否支持 Wi-Fi。chip_info.revision: 获取芯片的硬件版本(Silicon Revision)。
3. 读取存储与内存
esp_flash_get_size(NULL, &flash_size); // 获取 Flash 容量
esp_get_minimum_free_heap_size(); // 获取历史最小剩余堆内存- Flash 大小: 这里计算出的结果通常是 4MB、8MB 或 16MB。
- Heap Size: 堆内存大小对于排查程序是否“内存泄漏”至关重要。
minimum_free_heap告诉你在程序运行过程中,内存最紧张的时候还剩多少。
4. FreeRTOS 延时与重启
这是代码的最后一部分,展示了如何让系统“动起来”:
for (int i = 10; i >= 0; i--) {
printf("Restarting in %d seconds...\n", i);
vTaskDelay(1000 / portTICK_PERIOD_MS); // 关键点!
}
esp_restart(); // 软件重启vTaskDelay: 这不是简单的忙等待(Sleep),它是 FreeRTOS 的阻塞延时。1000 / portTICK_PERIOD_MS的意思是:将 1000 毫秒转换为系统的 Tick(时钟节拍)。- 在延时期间,CPU 会让出执行权去处理其他后台任务(如 Wi-Fi 协议栈)。
esp_restart(): 触发软件复位,芯片会重新从app_main开始执行。
idf_component_register(SRCS "hello_world_main.c"
PRIV_REQUIRESspi_flash
INCLUDE_DIRS "")这个是CMakeLists.txt 后面添加文件,选择依赖都得靠他
然后看下面

那个扳手是编译,闪电是写入,插头是选端口号设备
让我们先编译
先说一句,esp-idf的编译如果修改了依赖,要全量编译的,也就是清空了从头来,但是如果只是修改点东西,那也就是部分编译,很快的

看到这个说明编译成功了
烧录设备也很简单,目前的开发板一经检测写入自动冷重启,无需你操作
然后就能看到
ESP-ROM:esp32s3-20210327
Build:Mar 27 2021
rst:0x1 (POWERON),boot:0x8 (SPI_FAST_FLASH_BOOT)
SPIWP:0xee
mode:DIO, clock div:1
load:0x3fce3808,len:0x370
load:0x403c9700,len:0x900
load:0x403cc700,len:0x2364
entry 0x403c98ac
I (14) cpu_start: Multicore app
I (11) cpu_start: GPIO 44 and 43 are used as console UART I/O pins
I (13) cpu_start: Pro cpu start user code
I (14) cpu_start: cpu freq: 160000000 Hz
I (14) app_init: Application information:
I (17) app_init: Project name: hello_world
I (21) app_init: App version: 1
I (24) app_init: Compile time: Apr 5 2026 23:54:20
I (29) app_init: ELF file SHA256: 000000000...
I (34) app_init: ESP-IDF: v5.5.2
I (37) efuse_init: Min chip rev: v0.0
I (41) efuse_init: Max chip rev: v0.99
I (45) efuse_init: Chip rev: v0.0
I (49) heap_init: Initializing. RAM available for dynamic allocation:
I (56) heap_init: At 3FC95108 len 00054608 (337 KiB): RAM
I (60) heap_init: At 3FCE9710 len 00005724 (21 KiB): RAM
I (65) heap_init: At 3FCF0000 len 00008000 (32 KiB): DRAM
I (70) heap_init: At 600FE000 len 00001FE8 (7 KiB): RTCRAM
I (76) spi_flash: detected chip: gd
I (79) spi_flash: flash io: dio
I (82) sleep_gpio: Configure to isolate all GPIO pins in sleep state
I (89) sleep_gpio: Enable automatic switching of GPIO sleep configuration
I (96) main_task: Started on CPU0
I (106) main_task: Calling app_main()
Hello world!
This is esp32s3 chip with 2 CPU core(s), WiFi/BLE, silicon revision v0.0, 4MB external flash
Minimum free heap size: 392752 bytes
Restarting in 10 seconds...
Restarting in 9 seconds...
Restarting in 8 seconds...
Restarting in 7 seconds...
Restarting in 6 seconds...
Restarting in 5 seconds...
Restarting in 4 seconds...
Restarting in 3 seconds...
Restarting in 2 seconds...
Restarting in 1 seconds...
Restarting in 0 seconds...
Restarting now.你的第一个esp32固件就这么编译成功了
