UBUNTU22.04 ESP32S3 入门

实战派 ESP32-S3,双模无线开发板

ESP32-S3 原生支持 ESP-IDF,WiFi + 蓝牙一次搞定

参考

ESP32 S3 芯片数据手册 芯片资源介绍

ESP32 S3 芯片技术手册 API 介绍

ESP32 编程指南 应用程序的启动流程章节介绍了完整的启动过程

ESP32 编译开发工具 EIM 安装教程

天线是怎么工作的 动画讲解天线怎么发射接受无线电波

大白话了解网络 网络基础知识动画,比较形象

ESP32 Vscode 开发环境教程

ESP 官方介绍构建系统(编译系统)

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 中。

启动过程

启动流程

  1. ESP32 有两个 CPU,PRO CPU 和 APP CPU。PRO CPU 优先启动,此时 APP CPU 保持复位状态。

  2. 一级引导程序固化在 ROM,由厂家烧录,不可二次修改。负责芯片复位,睡眠唤醒,烧录和启动二级引导程序。

  3. 二级引导程序负责校验 app 程序和启动 app 程序。

  4. app 程序负责芯片硬件初始化,软件系统初始化,最后加载用户的应用程序。

  5. 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)每个从设备,从设备只有在被主设备点名时才能发送数据。

  • 建立连接:发现、寻呼与配对

  1. 查询/发现 (Inquiry):

主设备会发出“查询”广播信号,处于可发现模式的从设备收到后,会回复自己的基本信息(比如地址、设备类型)。

  1. 寻呼/连接 (Paging):

主设备会将自己的时钟和跳频序列同步给从设备,把它拉入自己的“皮网”。

  1. 配对与绑定 (Pairing & Bonding):

为了安全,首次连接通常需要配对(PIN 码,或者自动比对数字)。配对后交换并存储安全密钥(这叫“绑定”)。下次收到对方无线电信号,能凭密钥认出彼此,自动加密通信,无需再次手动配对。

  1. 沟通规则:协议栈与配置文件 (Profiles)

为了便于管理,通常采用“分层”的设计思想。每一层都只负责特定的任务,并向上层提供服务,向下层请求服务。

蓝牙协议栈 (Bluetooth Protocol Stack) 简化模型:

  1. 最底层:控制器层 (Controller Stack)

        物理层 (PHY): 负责真正的无线电波发射和接收,控制 2.4GHz 频率。

        链路层 (Link Layer / Baseband): 这里的核心任务是管理“时序”和“跳频”。它决定了什么时候发送数据包,下一个频率跳到哪里。它还负责基础的纠错,确保数据没传丢。

    1. 中间层:主机层 (Host Stack)

          L2CAP (逻辑链路控制与适配协议):

          多路复用: 你的蓝牙可能同时连接着鼠标和耳机。L2CAP 负责把来自上层的音频数据和鼠标数据区分开,并通过同一个底层的无线电通道发送出去,在接收端又能准确分开。

          分片与重组: 上层传下来的数据包可能很大(比如一首歌的片段),L2CAP 要负责把它切成适应无线电传输的小片(分片),接收端收到后再拼起来(重组)。

          SDP (服务发现协议):当两个设备连接时,它们通过 SDP 互相查询支持的功能。

      1. 应用接口层

            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 通信

        1. 接入无线网络

          1. 设备主动扫描周围的无线信道,或者被动接收无线路由器定期广播的 Beacon(信标)报文,从而获取 SSID(网络名称)、信号强度和加密方式。

          2. 设备向路由器发起认证请求。常见的 WPA2/WPA3 家用网络,通常是确认设备是否运行相同的加密协议。

          3. 设备向路由器发送“关联请求”,路由器响应并为其分配一个 Association ID (AID)。此时,设备正式在物理层和数据链路层接入了该 Wi-Fi 网络。

          4. 为了防止无线信号被窃听,设备与路由器通过“四次握手”生成唯一的会话密钥(PTK)。

        2. 获取网络地址

          1. 设备(作为 DHCP 客户端)在局域网内广播发送 DHCP Discover 报文。局域网内的 DHCP 服务器(通常是路由器)收到后,会从 IP 地址池中挑选一个未被占用的局域网 IP 通过 DHCP Offer 和后续报文分配给该设备。同时包括子网掩码和默认网关。

        3. 寻找目标设备

          1. 设备 A 用自己的子网掩码与目标 IP(设备 B)进行与运算,确认设备 B 在同一个局域网内。

          2. 设备 A 在局域网内发送一个 ARP (Address Resolution Protocol) 广播包:“IP 是 192.168.1.150 的设备把 MAC 地址告诉我。” 因为是广播,局域网内的所有设备都能收到,但只有设备 B 会响应该请求。

          3. 设备 B 收到广播后向设备 A 发送单播响应,报告自己的 MAC 地址。设备 A 收到后,会将 B 的 “IP-MAC” 映射关系记录到本地的 ARP 缓存表中,以便下次直接使用。

        4. 数据通讯

          1. 设备 A 的应用层产生数据,经过传输层(加上 TCP/UDP 端口号)、网络层(加上源 IP 和目的 IP)、数据链路层(加上源 MAC 和目的 MAC)。

          2. 设备 A 将数字信号转换成电磁波通过天线发射出去。

          3. 虽然 A 和 B 都在同一个 Wi-Fi 下,但无线设备之间通常不直接对发信号(除非使用 Wi-Fi Direct 技术)。

            1. 路由器收到 A 发出的无线电波,解调出数据帧。

            2. 路由器检查数据帧的目的 MAC 地址,发现是局域网内的设备 B。

            3. 路由器重新将数据帧调制成无线信号,发射给设备 B(如果 B 是有线连接,通过交换机从网口转发)。

          4. 设备 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 注入到项目配置中。

        核心构建流程:

        1. 配置阶段:CMake 开始运行,首先读取你选择的芯片目标(如 esp32s3),然后搜索系统组件、项目自定义组件和 managed_components。它会解析每个组件的 CMakeLists.txt,确认它们之间的依赖关系。

        2. 生成构建文件:CMake 在 build 目录下生成庞大的 Ninja 构建文件(类似传统的 Makefile,但执行速度极快)。

        3. 编译与链接:编译器(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>

        实战派 ESP32-S3,双模无线开发板

        ESP32-S3 原生支持 ESP-IDF,WiFi + 蓝牙一次搞定

        评论
        添加红包

        请填写红包祝福语或标题

        红包个数最小为10个

        红包金额最低5元

        当前余额3.43前往充值 >
        需支付:10.00
        成就一亿技术人!
        领取后你会自动成为博主和红包主的粉丝 规则
        hope_wisdom
        发出的红包
        实付
        使用余额支付
        点击重新获取
        扫码支付
        钱包余额 0

        抵扣说明:

        1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
        2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

        余额充值