参考
ESP32 S3 芯片数据手册 芯片资源介绍
ESP32 S3 芯片技术手册 API 介绍
ESP32 编程指南 应用程序的启动流程章节介绍了完整的启动过程
天线是怎么工作的 动画讲解天线怎么发射接受无线电波
大白话了解网络 网络基础知识动画,比较形象
ESP32 官方组件库 在这里可以搜索需要的功能组件,然后再下载安装库文件
环境
ubuntu22.04,ESP32S3N16R8 核心开发板,VSCode 编辑器,VSCode 的 ESP-IDF 开发插件,VSCode 的 AI 编程插件 ZOO,deepseek api,部分信息来自 Gemini AI,GPT AI

硬件资源

CPU,存储
-
Xtensa 芯片架构允许客户定制指令集和数据总线宽度,让芯片在功耗,性能,成本之间平衡。
-
Cache 高速缓存:存储频繁访问的数据和指令,减少 cpu 等待。
-
SRAM 静态随机存储器:代码和数据运行。
DRAM 动态随机存储器:DRAM 使用电荷存储数据,需要定时刷新保持数据
SRAM 是锁存器存储数据,通电就能保持。SRAM 速度快,成本较高,静态功耗低,动态功耗高。
PSRAM Pseudo Static RAM 伪静态随机存储器:芯片内部集成了刷新电路。从外部 CPU 的角度看,它像 SRAM 一样直接读写,不需要操心刷新的事;但在芯片内部,它实际上使用的是 DRAM 的核心存储单元,并自动完成刷新工作。
-
ROM 只读存储器:预设系统启动代码 bootloader
-
JTAG:调试接口
-
中断矩阵:esp32 有多于 cpu 中断源的外设中断源。”矩阵“允许你通过软件配置将中断信号连接到 cpu 中断线。由于esp32 是有两个 cpu 的,中断源和 cpu 怎么连接由用户决定。甚至可以多个外设源共享一个 cpu 中断线。
对比 stm32 中断向量表:外设中断源和 cpu 中断线连接固定,结构简单响应快。
RF 射频
esp32 使用同一根天线接受 wifi 和蓝牙信号,这根天线即发射也接受信号。
采用 tdd 时分双工模式,在极短时间(微妙)天线要么发射,要么接收,由切换器快速切换。
由 coexistence 机制协调蓝牙和 wifi 对天线的使用。
天线负责发射,接受信号,基带负责调制,解析信号。
-
2.4GHz Balun + 切换器:Balun 将天线接收的差分信号转换为单端信号供内部处理;切换器负责在发射和接收模式之间快速切换天线
-
2.4GHz 接收器 / 发射器:模拟前端,将基带信号上变频到 2.4GHz 载波并放大发射(发射器),或将接收的微弱射频信号下变频到基带(接收器)。
-
RF 合成器 + 锁相环:产生精准的高频本振信号,用于收发器的频率合成和稳定。
-
外部主时钟:通常连接 40 MHz 晶振,为整个芯片提供基准时钟源。
-
快速 RC 振荡器:内部阻容振荡器,功耗极低但精度一般,用于低功耗模式或时钟监测。
无线数字电路
-
Wi-Fi MAC:介质访问控制层,管理 Wi-Fi 的数据帧封装、寻址、重传和媒体竞争协议(CSMA/CA)。
-
Wi-Fi 基带:物理层基带处理,完成调制/解调、信道编解码、CRC 校验等任务。
-
低功耗蓝牙链路层控制器 + 基带:类似 Wi-Fi,但针对 BLE 协议,控制连接状态、广播、扫频等,并进行基带信号处理。
外设 Peripherals
-
GPIO / RTC GPIO:通用输入输出引脚,RTC GPIO 可在 Deep-sleep 模式下保持状态或唤醒芯片。
-
DIG ADC / RTC ADC:模数转换器,将模拟电压转换为数字值(12 位精度)。RTC ADC 可在低功耗下工作。
-
SD/MMC 主机:支持连接 SD 卡、TF 卡或 eMMC 存储芯片。
-
SPI0/1 / SPI2/3:同步串行外设接口。SPI0/1 通常内部连接 Flash/PSRAM,不应被用户占用;SPI2/3 可供用户连接传感器、显示屏等。
-
I2S / I2C:I2S 专门用于音频;I2C 用于连接低速传感器(普通数据传输和控制指令)。
I2C 有时钟线 SCL,数据线 SDA;传输速率最大 1Mbps(Megabits per second)速度较慢。半双工工作模式,因为只有一根数据线,不能同时收发。有上拉电阻导致有静态功耗。
I2S 传输 PCM 格式的音频数据。有数据线 SD,左右声道 WS,时钟线 SCK;
SPI 有 SCK 时钟线,MOSI 主发从收数据线,MISO 主收从发数据先,CS 片选信号(选择从机)。 10 Mbps 以上的速率,无静态功耗。全双工。
-
UART:通用异步收发传输器,常用于串口打印调试、连接 GPS 模块或串行设备。
-
LED PWM:脉宽调制输出,可独立控制多个 LED 的亮度或电机的转速。
-
MCPWM:电机控制 PWM,提供更复杂的同步、死区控制、故障检测功能,用于伺服电机、无刷直流电机。
-
RMT:红外遥控模块,既能输出红外波形,也可精确测量脉冲宽度。
-
USB 串口/JTAG 控制器:集成了 USB 转串口和 USB 转 JTAG 功能,只需一根 USB 线即可完成下载程序和调试。
-
USB OTG:USB On-The-Go,使 ESP32-S3 可作为 USB 主机(如读取 U 盘)或设备。
-
LCD 接口 / 摄像头接口:并行 8/16 位接口,可直接驱动 RGB 屏或接收摄像头(如 OV2640)数据。
-
Touch Sensor:电容触摸传感器,用于制作触摸按键。
-
TWAITM:兼容 Bosch 的 CAN 2.0 协议,用于汽车或工业总线通信。需要额外芯片将信号转为 CAN 信号。
-
GDMA:通用直接存储器访问,可在外设和存储器间搬运数据,无需 CPU 干预,大幅提升数据吞吐量。
定时器与系统控制(Timers & System)
负责时间管理和电源,复位等功能。
-
系统定时器 / 通用定时器:提供基本的定时中断或计时功能。
-
看门狗定时器:若程序卡死未及时“喂狗”,将自动复位系统。
RTC 看门狗:低功耗,由 RTC 低频时钟提供时钟源。
主系统看门狗:系统 APB 总线时钟提供时钟源。
超级看门狗:模拟电路时钟源,完全独立,物理层面的系统最后守门员。
-
RTC 定时器:在 Deep-sleep 模式下仍能运行,用于低功耗下的超时唤醒。
-
脉冲计数器:对输入脉冲进行计数,用于流量计、旋转编码器等。
-
World:一种上下文保护机制,可将 CPU 和外设状态快速切换,用于安全性隔离。
将芯片软硬件(内存,外设,cpu等)划分为“安全”和“非安全”区域,相当于门禁。硬件自动完成,无需软件干预,保证了切换的安全性和低延迟。
-
PMU:电源管理单元,控制不同电源域(如 Wi-Fi、RTC 等)的开关,实现低功耗策略。
-
RTC 存储器:Deep-sleep 模式下数据不丢失的小容量内存,可用于保存唤醒后的上下文。
-
温度传感器:测量芯片内部温度,用于过热保护或补偿。
-
ULP 协处理器:超低功耗协处理器,可在主 CPU 休眠时独立运行简单的传感器读取、判断任务,极大降低系统功耗。
安全
提供硬件级别的安全功能。
-
SHA(安全哈希算法) / RSA(非对称式加密演算法) / AES(高级加密标准) / HMAC(hash 算法和密钥计算得到数据信息的信息认证码) / RSA_DS(RSA 数字签名外设):硬件加速的加密算法引擎,比软件实现更快、更省电,常用于 TLS 加密通信、安全启动和固件加密。
-
RNG:真随机数发生器,基于射频噪声等物理熵源,用于生成密码密钥。
-
eFuse:一次性可编程存储,用于烧录设备唯一 ID、密钥、安全启动配置等,一旦写入不可篡改。
-
安全启动:确保芯片只运行经过签名认证的固件,防止恶意固件篡改。
-
Flash 加密:自动对存储在外部 Flash 中的代码和数据进行加解密,防止物理读取。
-
权限控制:管理不同总线主设备(如 CPU、DMA)对存储器和外设的访问权限,增强系统稳定性。
不是说 ESP32S3 有 AI 加速吗,怎么没看到 NPU 之类的模块?
ESP32S3 的 AI 加速是通过“向量指令集”来实现并行数据处理,集成在 CPU 中。
启动过程
启动流程
-
ESP32 有两个 CPU,PRO CPU 和 APP CPU。PRO CPU 优先启动,此时 APP CPU 保持复位状态。
-
一级引导程序固化在 ROM,由厂家烧录,不可二次修改。负责芯片复位,睡眠唤醒,烧录和启动二级引导程序。
-
二级引导程序负责校验 app 程序和启动 app 程序。
-
app 程序负责芯片硬件初始化,软件系统初始化,最后加载用户的应用程序。
-
PRO CPU 在完成硬件初始化之后启动 APP CPU 的启动。

ROM,Cache,RAM,FLASH
ROM(Read-Only Memory,或者掩膜 ROM):芯片内部的只读区域,生成芯片时候写入程序。
Cache 高速缓存:芯片内部的读写区域。不可寻址,也就是说用户无法直接操作使用,由芯片控制。
RAM(Random Access Memory 随机存取存储器):包括 SRAM,DRAM,PSRAM 等,可读写资源。可在芯片内部集成(SRAM),也可在外部通过 SPI 等接口被 CPU 操作。
FLASH:芯片外部的可读写资源,通常说的“硬盘”,可增减,通过 SPI 等接口被 CPU 操作。一般不能直接执行原始指令,需要加载到内存才能使用。(现代 cpu 可以通过映射实现在 flash 上执行)
二级引导程序 bootloader 和应用程序都烧录在片外 flash 中, 为什么二级引导程序的烧录地址不是从 0x0 开始?
片外 flash 开始的 0x0 一段区域是留给一级引导程序使用的。
无线通讯基础知识
玩 ESP32 肯定是要玩无线通信功能,也就是蓝牙和wifi。相关方面的知识也得补充补充。
无线通讯
发展历史
麦克斯韦推论:变化的电场会产生磁场,变化的磁场又会产生电场。这种变化的电磁场会以波的形式在空间中传播,而且这种波的速度等于光速。
赫兹通过实验证实了麦克斯韦的理论。
马可尼改进用天线发射,极大增强信号传播距离,用金属屑检波器接收微弱信号。
通过三极管实现了调幅广播 (AM Radio),把信息调制在固定频率的电磁波上。
无线电波通讯原理
-
调制
无线电波具有相位,频率,幅度的属性,通过改变这些属性来装载信息,调制无线电波形,实现数据传播。
例如把高频电波作为 1,把低频电波作为 0,这样就可以传递连续的二进制信息了。
基带信号 Baseband Signal:要传递的数据信号

载波 Carrier Wave:固定的频率和幅度的电磁波作为装载信息的波形

主要调制方式:
调幅(AM:Amplitude Modulation) - 改变载波的幅度

调频(FM:Frequency Modulation) - 改变载波的频率

调相(PM:Phase Modulation) - 改变载波的相位

-
发送
ESP32 使用 “倒F” PCB 天线发送电磁波信号。已调制的电磁波通过天线发射出去,以光速在空气中传播。

ESP32 使用的是 2.4 GHz 频段(Wi-Fi 和蓝牙)的电磁波,在空气中的波长大约是 12.5 厘米。最简单高效的天线是“四分之一波长天线”,大约是 3.1 厘米。为了把天线“塞入” PCB 板子上,使用“蜿蜒 (Meandering)”的 PCB 设计技术,实现小空间容纳大天线。
天线长度和无线电波频率的关系看天线是怎么工作的。
-
接收
符合特定长度的天线,对特定频率的电磁波最“敏感”,在该频率下产生的感应电流最大。虽然空气中有很多电磁波,但是无线模块天线并不会接收太多不需要的信息。天线能接收到信号都非常微弱,之后经过放大器等比例放大信号才能解析。
-
解调,解码
解调就是调制的逆过程,获取基带信号,最后把信号转换为 0 和 1 数据。
经典的 AM 解调示例:




蓝牙通信
-
跳频扩频技术 (FHSS - Frequency-Hopping Spread Spectrum)
2.4 G 频段是公共频段,充满了各种电子仪器发出的电磁波。如果固定在一个频率下通信会收到各种噪音。跳频就是发送方和接收方商量好一个“跳频序列”。双方每次通信的频段都不一样,提高抗干扰性和数据安全性。
-
主从关系与皮网 (Piconet)
发起连接的设备是主设备,被连接的设备是从设备。由一个主设备和若干个从设备组成的微型网络,被称为“皮网” (Piconet)。 主设备会轮询(Polling)每个从设备,从设备只有在被主设备点名时才能发送数据。
-
建立连接:发现、寻呼与配对
-
查询/发现 (Inquiry):
主设备会发出“查询”广播信号,处于可发现模式的从设备收到后,会回复自己的基本信息(比如地址、设备类型)。
-
寻呼/连接 (Paging):
主设备会将自己的时钟和跳频序列同步给从设备,把它拉入自己的“皮网”。
-
配对与绑定 (Pairing & Bonding):
为了安全,首次连接通常需要配对(PIN 码,或者自动比对数字)。配对后交换并存储安全密钥(这叫“绑定”)。下次收到对方无线电信号,能凭密钥认出彼此,自动加密通信,无需再次手动配对。
-
沟通规则:协议栈与配置文件 (Profiles)
为了便于管理,通常采用“分层”的设计思想。每一层都只负责特定的任务,并向上层提供服务,向下层请求服务。
蓝牙协议栈 (Bluetooth Protocol Stack) 简化模型:
-
最底层:控制器层 (Controller Stack)
物理层 (PHY): 负责真正的无线电波发射和接收,控制 2.4GHz 频率。
链路层 (Link Layer / Baseband): 这里的核心任务是管理“时序”和“跳频”。它决定了什么时候发送数据包,下一个频率跳到哪里。它还负责基础的纠错,确保数据没传丢。
-
中间层:主机层 (Host Stack)
L2CAP (逻辑链路控制与适配协议):
多路复用: 你的蓝牙可能同时连接着鼠标和耳机。L2CAP 负责把来自上层的音频数据和鼠标数据区分开,并通过同一个底层的无线电通道发送出去,在接收端又能准确分开。
分片与重组: 上层传下来的数据包可能很大(比如一首歌的片段),L2CAP 要负责把它切成适应无线电传输的小片(分片),接收端收到后再拼起来(重组)。
SDP (服务发现协议):当两个设备连接时,它们通过 SDP 互相查询支持的功能。
-
应用接口层
RFCOMM: 在经典蓝牙中,它模拟了一个老式的串口(RS-232)。很多传统的应用(比如传输文件、某些 OBD 车载诊断)就把它当成一条物理数据线来用。
GATT (通用属性配置文件): 这是低功耗蓝牙 (BLE) 的核心。 现代的智能手环、物联网传感器大多不用上面的 RFCOMM,而是用 GATT。它把数据组织成一个个小的“属性”和“特征值”(比如心率值、电量值),供对方读写。
一图概括(图片由 GPT 生成):

网络模型
-
局域网(LAN Local Area Network),设备通过有线或者无线方式连接到同一个交换机或路由,在一个网络中通信。
-
MAC 地址(Media Access Control Address)作为设备唯一身份标识,理论上在全球身份唯一。现实中 MAC 主要在局域网内其作用,如果局域网内出现相同 MAC 的设备,会导致通信异常。
-
IP 地址(Internet Protocol Address):设备在网络中的逻辑位置标识,在互联网中具有地理区域标识的作用,可以通过路由寻址高效把数据从地理位置 A 传输到地理位置 B 的目标设备。
-
子网掩码 (Subnet Mask):用于区分 IP 地址是否在当前局域网内,否则就是外网。例如子网掩码 255.255.255.0,和 IP 地址进行逻辑与运算,如果数据源 IP 和目标 IP 运算结果一样说明两个设备在同个局域网内。
-
网关 (Gateway):连接不同局域网的通道口,通常是路由器的 IP 地址,路由器负责与外网直接通信。
例如我电脑 ip 地址是 192.168.X.X,那么网关路由器地址是 192.168.X.1。网页访问就是路由器管理页面
-
-
交换机(Network Switch):存有 MAC 地址表,记录交换机各个网口连接哪个设备(MAC 地址作设备标识)。
-
路由器(Router):对接局域网(LAN 口)和外网(WAN 口 Wide Area Network Port):
-
路由功能:存有路由表(网络地图,动态更新),计算数据包最快的传输路线(下个路由器地址)。
-
交换机:局域网内设备数据传输。
-
无线 AP(Wireless Access Point):把有线信号转无线信号发出,把无线设备接入局域网内。
-
DHCP (Dynamic Host Configuration Protocol)服务:给加入局域网的设备自动分发网络参数,如 IP 地址。
-
NAT 转换(Network Address Translation):把局域网内发往外网的数据,都伪装成路由器的“公网 IP”请求。收到数据包,经过一层解码后才发送到局域网内具体设备。
-
局域网结构(图片由 GPT 生成):

互联网大概结构(图片由 Gemini 生成):

WIFI 通信
-
接入无线网络
-
设备主动扫描周围的无线信道,或者被动接收无线路由器定期广播的 Beacon(信标)报文,从而获取 SSID(网络名称)、信号强度和加密方式。
-
设备向路由器发起认证请求。常见的 WPA2/WPA3 家用网络,通常是确认设备是否运行相同的加密协议。
-
设备向路由器发送“关联请求”,路由器响应并为其分配一个 Association ID (AID)。此时,设备正式在物理层和数据链路层接入了该 Wi-Fi 网络。
-
为了防止无线信号被窃听,设备与路由器通过“四次握手”生成唯一的会话密钥(PTK)。
-
-
获取网络地址
-
设备(作为 DHCP 客户端)在局域网内广播发送 DHCP Discover 报文。局域网内的 DHCP 服务器(通常是路由器)收到后,会从 IP 地址池中挑选一个未被占用的局域网 IP 通过 DHCP Offer 和后续报文分配给该设备。同时包括子网掩码和默认网关。
-
-
寻找目标设备
-
设备 A 用自己的子网掩码与目标 IP(设备 B)进行与运算,确认设备 B 在同一个局域网内。
-
设备 A 在局域网内发送一个 ARP (Address Resolution Protocol) 广播包:“IP 是 192.168.1.150 的设备把 MAC 地址告诉我。” 因为是广播,局域网内的所有设备都能收到,但只有设备 B 会响应该请求。
-
设备 B 收到广播后向设备 A 发送单播响应,报告自己的 MAC 地址。设备 A 收到后,会将 B 的 “IP-MAC” 映射关系记录到本地的 ARP 缓存表中,以便下次直接使用。
-
-
数据通讯
-
设备 A 的应用层产生数据,经过传输层(加上 TCP/UDP 端口号)、网络层(加上源 IP 和目的 IP)、数据链路层(加上源 MAC 和目的 MAC)。
-
设备 A 将数字信号转换成电磁波通过天线发射出去。
-
虽然 A 和 B 都在同一个 Wi-Fi 下,但无线设备之间通常不直接对发信号(除非使用 Wi-Fi Direct 技术)。
-
路由器收到 A 发出的无线电波,解调出数据帧。
-
路由器检查数据帧的目的 MAC 地址,发现是局域网内的设备 B。
-
路由器重新将数据帧调制成无线信号,发射给设备 B(如果 B 是有线连接,通过交换机从网口转发)。
-
-
设备 B 接收到信号,通过 MAC 确认是发给自己的,随后解析将数据交付给指定的应用程序。
-

Wifi 为什么没有跳频?
定频工作
Wifi 追求高吞吐量,需要很宽的“车道”(20MHz、40MHz 甚至 160MHz)。路由器在工作时,会固定在一个选定的信道上,不会每秒钟乱跳。
动态信道分配 DCA
路由器在开机或定期检测时,会扫描周围环境。如果发现当前信道干扰严重,它会自动切换到另一个相对干净的信道。
载波监听多路访问 CSMA/CA
wifi 设备在发射数据前,会先监听当前信道有没有人在说话。如果有(即使是微波炉的噪音),它就会随机等待一段时间再发送,以此来避免冲突。
同频干扰
如果空间内有多个路由器工作在相同频段,会触发 CSMA/CA,即使 wifi 信号强度大,但是延时依然严重。
邻频干扰
2.4G 频段下很多信道是相互叠加的,导致噪声严重数据包损坏,需要重复发送数据包。
编译烧录
我选择在 VSCode 平台开发,按 教程 来还是挺快上手的。

最基础的工程目录如图:

-
sdkconfig 项目配置文件,有时候叫菜单配置文件
裁剪系统组件: 如果项目不需要 Wi-Fi 或蓝牙,你可以在配置中关闭它们。编译时,这些未开启的代码就不会被编译进最终的固件中,从而极大地节省 Flash 和 RAM 空间。
调整硬件底层参数: 设置 CPU 的运行频率。
配置 Flash 的大小和 SPI 速度。
设置控制台串口(UART)的默认波特率。
配置操作系统(FreeRTOS):设置 FreeRTOS 的系统节拍(Tick Rate,通常是 100Hz 或 1000Hz)
开启或关闭特定的内核调试功能(如内存泄漏检查、任务堆栈溢出检测)。
不要直接编辑该文件,部分参数之间有依赖关系,要通过插件 GUI 来配置!
Vscode 安装了 espidf 可以通过 vscode 底部 “设置”按钮来配置。

-
根目录的 CMakeLists.txt 文件
负责调用 ESP-IDF 的构建系统
-
子目录的 CMakeLists.txt 文件
负责组件功能的编译
构建系统
ESP-IDF 项目可以看作是多个不同组件的集合。组件就是模块化且相对独立的代码,每个组件负责一个核心功能。
项目的配置参数可以通过 sdkconfig 进行调整,组件的配置参数可以通过 Kconfig.projbuild 注入到项目配置中。
核心构建流程:
-
配置阶段:CMake 开始运行,首先读取你选择的芯片目标(如 esp32s3),然后搜索系统组件、项目自定义组件和 managed_components。它会解析每个组件的 CMakeLists.txt,确认它们之间的依赖关系。
-
生成构建文件:CMake 在 build 目录下生成庞大的 Ninja 构建文件(类似传统的 Makefile,但执行速度极快)。
-
编译与链接:编译器(GCC)并发编译每一个 .c 文件生成 .o 目标文件。最后,链接器(Linker)将这些目标文件、静态库(.a)以及引导程序(Bootloader)打包合并为一个统一的 project.bin 固件。
官方组件库
对于成熟的外设,可以直接使用官方组件来加速开发进度,同时学习官方的驱动代码。
以连接 wifi 为例,使用官方组件库 espressif/console_cmd_wifi,支持终端交互式配置网络:
在 /main 目录下创建名为 idf_component.yml 的组件清单文件,内容如下
dependencies:
espressif/console_cmd_wifi: "^1.1.0"
先点击清理:

再点击编译:

ESPIDF 组件管理器回去读取 idf_component.yml 组件清单文件,下载相关组件库到工程中。编译成功能看到多了 managed_components 目录,里面是下载的相关组件库文件。

espressif__console_cmd_wifi 工程目录如图:

-
component_hash 和 CHECKSUMS.json
由 ESP-IDF 组件管理器自动生成,用来记录当前下载的源码文件的哈希值。编译系统每次构建前会比对这个哈希,防止源码被意外篡改,确保版本的一致性。
-
idf_component.yml
组件管理器清单文件,声明了该组件依赖的第三方组件库。
-
Kconfig.projbuild 菜单配置定义文件
将该组件特有的配置项注入到主工程的 idf.py menuconfig 中。例如可以裁剪掉不需要的命令以节省 Flash 空间。
接触过 ROS 的人肯定觉得组件库和 ROS 的功能包非常相似。都采用了“分布式依赖、中心化仓库、松耦合模块化”的设计思想。
main/CMakeLists.txt 文件
idf_component_register(
SRCS "main.c"
INCLUDE_DIRS "."
REQUIRES espressif__console_cmd_wifi console # 添加用到的组件
esp_wifi nvs_flash esp_netif esp_event
)
main/mian.c 文件
#include <stdio.h>
#include "esp_netif.h" // 网络接口库
#include "nvs_flash.h" // nvs 存储,wifi 和控制台需要用来记录历史数据
#include "esp_event.h" // 事件循环库
#include "console_wifi.h" // 通过终端控制台操作 wifi
void app_main(void)
{
ESP_ERROR_CHECK(esp_netif_init()); // 初始化底层的 TCP/IP 协议栈
ESP_ERROR_CHECK(esp_event_loop_create_default()); // 创建系统默认的事件循环
esp_err_t ret = nvs_flash_init(); // 尝试始化板载的 NVS Flash 存储分区
// 检查 flash 是否满了
if (ret == ESP_ERR_NVS_NO_FREE_PAGES || ret == ESP_ERR_NVS_NEW_VERSION_FOUND) {
ESP_ERROR_CHECK(nvs_flash_erase()); // 如果出错了,格式化 flash
ret = nvs_flash_init();
}
ESP_ERROR_CHECK(ret);
// 初始化控制台
ESP_ERROR_CHECK(console_cmd_init());
// 注册 wifi 控制指令
ESP_ERROR_CHECK(console_cmd_wifi_register());
// 启动控制台交互
ESP_ERROR_CHECK(console_cmd_start());
printf("Ironball! ROLLING!\n");
}
烧录程序后,点击“监视设备”
![]()
终端输入:
wifi help

查看可连接 wifi:
查看可连接 wifi:

连接 wifi:
wifi sta join <net_work> <passwork>



1844

被折叠的 条评论
为什么被折叠?



