我是如何从零开始,把 ESP32-S3 跑起来的

作为一个刚入门的时候,我是如何入门 ESP32-S3 的

一、从"我也只是个刚入门的时候"说起

说实话,写这篇文章的时候,我自己也并不是什么"老工程师"。我刚开始接触 ESP32 的时候,心里其实是有点发虚的:

  • 芯片型号一大堆,看不懂怎么选
  • 文档、示例很多,但不知道从哪下手
  • 别人一上来就 Wi-Fi、BLE、LVGL,我连环境都没搭好

后来在项目中,我最终选择了 ESP32-S3,并且花了一段时间,把从环境搭建到第一个工程完整跑通。回过头看,这条路径对我来说,其实是可以被清晰总结出来的。

于是就有了这篇文章------站在一个刚入门的时候的视角,记录我第一次上手 ESP32-S3 的全过程


二、ESP32 到底是什么?刚入门的时候第一步要搞清楚的事

刚接触 ESP32 时,一开始我最大的误区是:

把它当成一颗"性能强一点的单片机"。

真正上手后才发现,ESP32 更准确的定位其实是:一颗高度集成的 SoC

对我来说,可以先抓住几个最核心的点:

  • 芯片内部集成了 Wi-Fi + Bluetooth(BLE)
  • 主频高,资源多,但也更复杂
  • 默认运行 FreeRTOS,不是传统裸机

也正因为这些特性,ESP32 的学习方式,和以前学 51、STM32 裸机是完全不一样的。如果一开始不转变思路,很容易被劝退。


三、为什么我最后选了 ESP32-S3?

日常生活中,说起ESP32时,我们一般说的是下方形态的模组。但准确点来说,ESP32其实不是一款芯片,而是一个系列的芯片,这个和STM32有点类型,STM32有L系列、F系列、H系列,ESP32也有不同的系列。

那ESP32有那些系列呢?


https://www.espressif.com.cn/zh-hans/products/socs

对比总结:

在真正开始动手前:ESP32、C3、S2、S3 到底怎么选?

选择建议

  • ESP32-P 系列:适合需要高性能计算和丰富外设的应用,如工业控制、智能家居中枢。
  • ESP32-H 系列:适合低功耗、低成本的应用,如智能农业、环境监测。
  • ESP32-S 系列:适合需要 Wi-Fi、蓝牙和 AI 功能的应用,如智能音箱、可穿戴设备。
  • ESP32-C 系列:适合成本敏感的应用,如智能插座、简单传感器。

最终我用的是 ESP32-S3原因有三。

  1. 官方主推,资料新:
    ESP32-S3 是目前乐鑫重点维护的型号之一,文档、示例、更新频率都比较友好,对我来说不容易踩到"过时坑"。
  2. 原生 USB,上手成本低:
    ESP32-S3 自带 USB OTG,很多开发板可以直接 USB 下载程序,不用额外折腾串口芯片和驱动问题。
    这一点对我这种刚入门的人来说,真的省了不少时间。
  3. 能力上限高,但起步不难
    它既能点灯、打日志,也能往后做 Wi-Fi、BLE、显示、音频,学习投入不会白费

四、刚入门的时候最容易踩的坑:一上来就写代码

刚开始的时候,我也犯过一个典型的新手错误:

环境还没完全跑通,就急着新建工程写代码。

结果就是各种奇怪的问题:

  • 编译报错,不知道是代码问题还是环境问题
  • 烧录失败,不确定是串口、驱动还是芯片问题

后来我才意识到,对我来说,第一步不是写代码,而是搭建环境、验证环境


五、开始动手:搭建ESP32-S3的开发环境

在真正开始搭 ESP32 的开发环境之前,我其实是有点抗拒的。

原因很简单:以前 ESP32 的环境搭建,是真的折磨人。早些年乐鑫主要支持的是 Linux 开发环境,搭环境基本意味着:

大量工具、脚本、依赖都托管在 GitHub,包体积很大,国内访问 GitHub 本身就不稳定,网络一抖,下载就失败,经常是折腾一整天,环境还没跑起来,人先被劝退了。

后来我才知道,这件事乐鑫自己也意识到了问题,所以近几年他们做了一个对新人非常友好的改变:

👉 官方提供了 Windows 下的一体化安装包。

为什么选择Windows方式搭建

如果你和我一样,是刚开始接触 ESP32,我非常明确地建议一句话:

优先用 Windows 官方安装包,别一上来就折腾 Linux。

原因很现实:

  • Windows 安装包把大多数坑都提前踩掉了
  • Python、工具链、CMake、依赖全部打包
  • 不需要一边装一边查 GitHub Issue

只有在 Windows 实在安装失败,或者你本身就很熟 Linux 的情况下,再考虑 Linux 环境。

Windows环境搭建(推荐)

5.1 安装包选择

官方下载链接:官网地址

我使用的是 ESP-IDF 5.4 的离线安装包。

之所以选离线版,而不是在线安装,是因为:

  • 在线安装下载速度慢
  • 网络不稳定时容易失败
  • 离线包一次下载,后面省心很多
5.2 安装过程(这里有坑,一定注意)

下载安装包到本地后,直接双击运行即可,整体流程并不复杂。

但有几个点,我当时是专门记下来的,不注意很容易导致安装失败:

  • 安装路径不能包含中文
  • 路径中不能有空格或括号
  • 路径长度不要超过 90 个字符


    如果提示需要修复长路径的,可以点击应用修复,但是最好不安装到长路径中

    如果安装过程中提示"需要修复长路径支持",可以点修复,但最稳妥的方式还是一开始就选短路径。

    然后就可以点击下一步,勾选需要安装的芯片包;
5.3 组件选择(别装太多)

安装过程中会让你选择组件,我当时的选择思路是:

够用就行,别贪多。

我只勾选了:

  1. 安装命令提示符和桌面快捷方式
  2. 安装 ESP32 / ESP32-S3 芯片支持包

这样既能满足当前学习,又能减少磁盘占用。

5.4 安装完成后的验证

安装结束后,我勾选了:

  • Run ESP-IDF PowerShell Environment

系统会自动打开一个 PowerShell 窗口,并加载 ESP-IDF 环境。当我在窗口里看到 ESP-IDF 的环境信息正常打印时,心里其实松了一口气:

至少,环境这一关是过了。

后续编译、烧录、查看日志,都可以在这个窗口里完成。如果以后需要重新打开,只要在开始菜单里搜索 esp-idf 即可。我个人更习惯用 PowerShell,因为命令补全更友好。

到这里为止,ESP32-S3 的 Windows 开发环境就算是搭建完成了。说实话,这一步是整个入门过程中最容易劝退人的一关,能顺利走完,后面的路会轻松很多。

Linux环境的搭建

Linux 环境我也尝试过,但必须说一句实话:如果你对 Linux 命令行不熟,不建议一开始就用它。

Linux 下的 ESP-IDF 环境:

  • 更灵活
  • 更贴近底层
  • 但问题定位成本也更高

如果你确实需要使用 Linux,建议至少具备基本的命令行操作能力,再去折腾虚拟机、依赖和源码编译。

前提

你需要安装虚拟机,然后 安装Ubuntu系统,我推荐的是ubuntu-18.04.5;因为我使用的是这个镜像,

你需要确保系统的CMake 3.16 、Python 3版本。

shell 复制代码
使用 ESP-IDF 需要 CMake 3.16 、Python 3以上版本。较早的 Linux 发行版可能需要升级自身的软件源仓库
leo@ubuntu:~/work/esp/demo01$ cmake -version
cmake version 3.16.3
leo@ubuntu:~/work/esp/demo01$ python --version
Python 3.8.10
安装依赖工具

安装完成后,打开命令终端,安装以下工具

shell 复制代码
sudo apt-get install git wget flex bison gperf python3 python3-pip python3-venv cmake ninja-build ccache libffi-dev libssl-dev dfu-util libusb-1.0-0
安装IDF 5.4

这个安装路径要记录下来,后续会用到相关例程源码

shell 复制代码
mkdir -p ~/esp
cd ~/esp
git clone -b v5.4 --recursive https://github.com/espressif/esp-idf.git
这一步因为要从外网下载大量代码和组件包,极其容易失败,建议上魔法多尝试,出现问题时自行搜索相关教程安装。如果最终搞不定,建议直接到淘宝找代安装服务。

除了 ESP-IDF 本身,还需要为支持 ESP32-S3 的项目安装 ESP-IDF 使用的各种工具,比如编译器、调试器、Python 包等。

shell 复制代码
cd ~/esp/esp-idf
export IDF_GITHUB_ASSETS="dl.espressif.cn/github_assets"
./install.sh esp32s3
这一步因为要下载大量代码和组件包,极其容易失败,建议上魔法多尝试,出现问题时自行搜索相关教程安装。如果最终搞不定,建议直接到淘宝找代安装服务。
设置环境变量&验证安装
shell 复制代码
leo@ubuntu:~/work/esp/demo01$ gedit ~/.bashrc 
alias get_idf='. $HOME/esp/esp-idf/export.sh'

使能环境变量

shell 复制代码
leo@ubuntu:~/work/esp/demo01$ source ~/.bashrc
leo@ubuntu:~/work/esp/demo01$ getidf
Checking "python3" ...
Python 3.8.10
"python3" has been detected
Activating ESP-IDF 5.4
* Checking python version ... 3.8.10
* Checking python dependencies ... OK
* Deactivating the current ESP-IDF environment (if any) ... OK
* Establishing a new ESP-IDF environment ... OK
* Identifying shell ... bash
* Detecting outdated tools in system ... Found tools that are not used by active ESP-IDF version.
For removing old versions of esp32ulp-elf, openocd-esp32, esp32s2ulp-elf, xtensa-esp32-elf, xtensa-esp32s2-elf, riscv32-esp-elf, xtensa-esp32s3-elf use command 'python /home/leo/work/esp/esp-idf/tools/idf_tools.py uninstall'
To free up even more space, remove installation packages of those tools.
Use option python /home/leo/work/esp/esp-idf/tools/idf_tools.py uninstall --remove-archives.
* Shell completion ... Autocompletion code generated

Done! You can now compile ESP-IDF projects.
Go to the project directory and run:

  idf.py build

一个非常重要的提醒

环境搭建,是后续所有学习内容的基础。不同电脑、系统、权限、网络环境差异都很大,你在搭环境的过程中,遇到奇怪问题是正常的。

这一步我自己的经验是:

  • 多看报错信息
  • 多用搜索引擎
  • 善用 AI 工具辅助排查

不要急躁,ESP32 是一款非常热门的芯片,绝大多数问题,网上都能找到答案。

只要你愿意多花一点耐心,环境这关基本都能过去。

六、第一个成功点:跑通 Hello World

在真正理解 ESP-IDF 之前,我做的第一件"正确的事",就是跑通官方示例里的 hello_world

这个示例本身没有任何复杂逻辑,但它一次性帮我验证了:

  • ESP-IDF 是否安装正确
  • 工具链是否完整
  • 编译流程是否正常
  • 程序是否真的跑在 ESP32-S3 上

当我在串口里看到 "Hello world!" 输出时,那一刻其实挺踏实的:

至少,这条路是走得通的。

复制官方示例

我们复制xxxx\Espressif\frameworks\esp-idf-v5.4\examples\get-started\hello_world到自己希望编写代码的路径下

xxxx为我们安装IDF的路径

然后我在window开始菜单中搜索,IDF,通过powershell进入此目录。

编译烧录

通过命令进行编译:

powershell 复制代码
//xxxx为你放代码的路径
cd xxxx\app\hello_world
//设置"目标"芯片。
idf.py set-target esp32s3  
//编译,首次编译一般需要几分钟
idf.py build 

编译成功:

接着我们把板卡,通过TypeC线接到电脑,然后就可以访问烧录。电脑USB与核心板USB相连。

注意:此步骤需要接上底板的TypeC线才能查看COM口,我这里是COM4,不同电脑会不一样,根据你自己电脑来。

烧录指令:

c 复制代码
//端口修改为自己电脑的端口
idf.py -p COM4 flash monitor
//或者自动寻找端口:
idf.py flash monitor

如果一切顺利,烧录完成后,开发板会复位,应用程序"hello_world"开始运行.

需要退出调试模式,可以按键盘的Ctrl+],到这里,我们就成功完成工程创建、编译、烧录的全部步骤。

注意

想必你们可能也有些人会遇到这个问题:

PS J:\ESP32_P\app\hello_world> idf.py flash monitor Executing action: flash Serial port COM3 Connecting... COM3 failed to connect: Failed to connect to Espressif device: No serial data received. For troubleshooting steps visit: https://docs.espressif.com/projects/esptool/en/latest/troubleshooting.html No serial ports found. Connect a device, or use '-p PORT' option to set a specific port.

该报错本质上是 PC 端未能在下载模式下与 ESP32-S3 建立串口通信。

  1. Failed to connect to Espressif device: No serial data received→ esptool 在握手阶段没有收到 ESP32-S3 的 ROM 下载响应。
  2. No serial ports found(出现在后面)→ 要么串口瞬间消失,要么驱动/端口被占用或识别异常。
问题:

未进入下载模式

解决方式

正确进入下载模式的方法:

  • BOOT(IO0) 按住不放
  • 再按一下 RESET
  • 先松 RESET
  • 最后松 BOOT
  • 再执行:
c 复制代码
idf.py flash

如果卡在了

shell 复制代码
boot:0x0 (DOWNLOAD)
waiting for download

则再摁一下reset按键


七、基于示例,新建属于自己的最小工程

在 Hello World 跑通之后,我并没有马上加功能,而是做了一件看起来很"慢"的事:

新建一个只属于我自己的最小工程。

1. 什么叫最小工程?

对我来说,最小工程的意义不在于功能,而在于结构清晰、可控

首先,通过观察helloworld工程中的文件结构,了解他们的作用;

c 复制代码
├── CMakeLists.txt             //工程构建文件
├── pytest_hello_world.py      //python脚本,用于SDK自动测试的
├── main                       //主代码文件夹
│   ├── CMakeLists.txt         //代码构建文件
│   └── hello_world_main.c     //源码
├── README.md                  //说明文件
├── sdkconfig.ci               //SDK配置文件,新工程内容为空,配置具体芯片型号才生成具体内容

所以看得出来pytest_hello_world.py、README.md、sdkconfig.ci文件,都不是新建工程的必要文件

一个最基本的 ESP-IDF 工程,只需要主代码、工程构建文件,于是我创建了以下文件夹及文件:

c 复制代码
01_my_first_project
├── CMakeLists.txt     //工程构建文件
├── main
│   ├── CMakeLists.txt //源码构建文件
│   ├── main.c         //源码文件
CMakeLists.txt

首先,我创建了01_my_first_project文件夹,在文件夹中创建了CMakeLists.txt工程配置文件
CMakeLists.txt

cmake 复制代码
# The following lines of boilerplate have to be in your project's
# CMakeLists in this exact order for cmake to work correctly
cmake_minimum_required(VERSION 3.16)

include($ENV{IDF_PATH}/tools/cmake/project.cmake)
project(01_my_first_project)

其中include命令,用于包含其他 CMake 文件。将 ESP-IDF 的项目配置文件引入到当前项目的 CMake 配置中,使得项目能够利用 ESP-IDF 的强大功能进行开发和构建

2. main.c 里我只做了一件事

app_main() 里,我只打印了一行日志。

没有点灯,没有任务,没有网络。

main文件夹

然后我在01_my_first_project中创建main文件夹,用于管理项目源码,main文件夹下创建两个文件CMakeLists.txt与main.c,CMakeLists.txt用于管理源码构建

c 复制代码
idf_component_register(SRCS "main.c"
                    INCLUDE_DIRS ".")

main.c

c 复制代码
#include <stdio.h>              // 引入标准输入输出库,用于使用 printf 函数
#include "freertos/FreeRTOS.h"  // 引入 FreeRTOS 的核心头文件,提供 FreeRTOS 的基本功能
#include "freertos/task.h"      // 引入 FreeRTOS 的任务管理头文件,提供任务相关的函数(如 vTaskDelay)

void app_main(void)             // ESP-IDF 程序的入口函数,类似于 main 函数
{
    int i = 0;                                  // 定义一个整数变量 i,并初始化为 0,用于计数
    while (1) {                                 // 无限循环,确保程序持续运行
        printf("[%d] Hello world!\n", i);       // 打印带计数的 "Hello world!" 消息,%d 会被变量 i 的值替换
        i++;                                    // 计数器 i 自增 1
        vTaskDelay(5000 / portTICK_PERIOD_MS);  // 延时 5000 毫秒(5 秒)
                                                // portTICK_PERIOD_MS 是 FreeRTOS 的时钟节拍周期(系统计时器的"心跳间隔" 通常为 1 毫秒)
    }
}

最终工程目录如下:

于是我进行烧录编译:

c 复制代码
//设置"目标"芯片。设置后会生成对应芯片的sdkconfig和build文件夹
idf.py set-target esp32s3  
//编译,首次编译一般需要几分钟
idf.py build 
//通过TypeC线接上板卡,烧录&调试 COM口改为你自己电脑的
idf.py -p COM4 flash monitor 或 idf.py flash monitor

并成功运行:

至此,我也成功自己独立搭建了一个最小的工程,这是我才真正感觉到

我可以开始可以掌控它了


八、回头看,刚入门的时候真正需要的是一条清晰路径

后来我发现,很多刚入门的时候在 ESP32 入门阶段会被劝退,并不是能力问题,而是路径问题。

如果一上来就:

  • 学 Wi-Fi 协议
  • 看 BLE 协议栈
  • 研究 LVGL

很容易迷失。

对我来说,真正有效的顺序是:

环境 → 官方示例 → 最小工程 → 逐步加功能

ESP32-S3 只是工具,而这条路径,才是刚入门的时候最需要的东西。


九、写在最后

如果你和我一样,也是刚开始接触 ESP32-S3,希望这篇文章能让你少一点焦虑。

不用急着"学很多",先把第一步走稳,比什么都重要。

后续我也会继续以一个刚入门的时候的视角,记录 ESP32-S3 的学习和踩坑过程。如果你也在入门阶段,欢迎一起交流。

相关推荐
于小猿Sup6 小时前
VMware在Ubuntu22.04驱动Livox Mid360s
linux·c++·嵌入式硬件·自动驾驶
chao1898448 小时前
STM32 HAL库驱动AT24C02 EEPROM例程
stm32·单片机·嵌入式硬件
不会武功的火柴9 小时前
SystemVerilog语法(8)-有限状态机(FSM)
嵌入式硬件·fpga开发·自动化·ic验证·rtl·uvm方法学
嵌入式小站12 小时前
STM32 零基础可移植教程 05:按键消抖,为什么按一次会触发好几次
chrome·stm32·嵌入式硬件
czhaii12 小时前
跟我动手学FX系列PLC GX2环境
嵌入式硬件
2zcode14 小时前
基于STM32的智能扫地机器人设计与实现
stm32·嵌入式硬件·机器人
jllllyuz14 小时前
单相并网逆变器控制代码实现(STM32版)
stm32·单片机·嵌入式硬件
冉卓电子16 小时前
GD32C103RBT6 misc 内核驱动库极简解析
单片机·嵌入式硬件
yongui4783416 小时前
MAX6675 K型热电偶温度采集程序(Keil环境)
单片机·嵌入式硬件
豆包公子16 小时前
AUTOSAR CP XCP 移植到裸机 MCU-实践篇
单片机·嵌入式硬件