ESP32

选购指南

首先看使用的模组是否和官方的一样,以 ESP32-3 为例 分为 pcb 板载天线模组(不带 U)另外一种是外接天线模组(带 U,预留 ipex 接口)  ,天线是蓝牙和 WiFi 共用的合二为一的,自带的和外接的只是改变信号的强弱 穿透 和距离 不改变原本的 WiFi 或者蓝牙的版本 因为芯片原生固定硬的 WiFiX  BLEX 的版本,好像说的这种板子是开源的 所以很多盗版 或者小厂家买二手芯片 二手器件组装出来一个开发板

芯片

在芯片的基础上做个封装,加点外壳天线这些就算是一个模组了,下面分别是ESP32-S3的两个模组(带板载天线和不带天线的)

模组 参数图
模组 模组参数图
下面以 N16R8 为例
N 常温通用版,-40℃-85℃
16 板子的存储空间(类比电脑硬盘 512Gb 1Tb 或者手机的存储空间 128Gb 256Gb……),永久化存储,断电数据还在
R8 当于电脑的内存条 程序运行是临时存储的变量 数据 缓存…,关闭程序或者断电释放清空 零时性的

把模组集成带板子上就是一个最小系统版了,能够直接烧录运行代码,系统版又分给你焊好 排针的可以用于插入到 PCB 版或者面板版上和没有焊排针的,这种可以用于贴片(自己做产品的话肯定是买最小的芯片单元贴片到自己设计的板子上然后做封装)

认识引脚

类型 作用
GPIO 通用输入输出,用于输出/接收 高低电平,既可以往外输出也可以用于接收信号作为监测输入
GND 开发板上的 GND 是供地的(即内部是连通的,用来接负极)

关于电

交流电

交流电: 家庭 220v 供电,工业 380v 三相电供电,不分正负极,有零线火线,且火线是周期波形一高一低上下围绕着零线,常见电源上面写着 50Hz 即表示电流一秒钟变换 50 次,(火线-电器设备-零线-电器设备-火线-电器设备-零线…),电压从高的一侧经过用电的器件后流入到电压低的一侧循环交替

直流电

直流电: 常见的电池,电瓶,能用来存储正负电荷的,区分正负极,正极的电压高于负极的电压,所以固定从正极流入到用电设备,从负极流出(电源正极-用电设备正极-用电设备负极-电源负极)
在开发版上这里的电源正极就是 3.3V/5V,负极就是GND,当然也可以用GPIO输出一个高电平
wokwi led 示例
上图是通过GPIO输出高低电平进行控制的,如果不写代码,可以直接用 3.3V连接 LED 正极,GND 连接负极

注: 交流电规范话应该先接 用电元器件负极与 GND 这样万一没用断电也可以减少先接正极元器件烧毁的情况,当然还是规范化先断电再操作

相同点:都是电压高的流向电压低的一侧
不同点:交流电不分正负极,交流电是来回交替,直流电是固定方向

组件/依赖

插件安装依赖

  • main/main.c 中如果想要使用组件库,也就是 managed_components 中的内容,是不需要在 main/CMakeLists.txt 中添加的
  • 自己写的 components 里面的如果需要使用第三方组件库则需要再对应的 components/xxx/CMakeLists.txt 中添加第三方也就是 managed_components 中的组件,组件名就是 managed_components 下面的文件夹名称
    组件安装
    效果

自定义组件

  • 如果根目录下没有 components 目录,在输入组件名后会自动创建 components目录
  • 每个组件创建后默认会生成 3 个文件,结构是 components/组件名/组件名.c components/组件名/CMakeLists.txt components/组件名/include/组件名.h
  • components/json_utils/include/tmgp_sgame_official.h 这个是我后面自己加的一个结构体
  • 注: 不要在components/组件名 之间增加任何目录(比如 components/middleware/littlefs_utils 中间加了一层),否则要额外的配置比较麻烦,虽然可以分包管理,但是小项目真没那么操心
    创建组件
  • 组件自己的 CMakeLists.txt配置(components/json_utils/CMakeLists.txt)
1
2
3
4
5
idf_component_register(
SRCS "json_utils.c"
INCLUDE_DIRS "include"
REQUIRES "json"
)
  • 组件自己的 CMakeLists.txt配置(components/littlefs_utils/CMakeLists.txt)
1
2
3
4
5
idf_component_register(
SRCS "littlefs_utils.c"
INCLUDE_DIRS "include"
REQUIRES "joltwallet__littlefs"
)
  • main组件的 CMakeLists.txt 配置(main/CMakeLists.txt)
1
2
3
4
5
6
7
idf_component_register(
SRCS "main.c"
INCLUDE_DIRS "."
REQUIRES "littlefs_utils" "json_utils"
)
# 构建镜像到 littlefs (flash中,与自定义组件没关系,只是上面littlefs_utils需要而已)
littlefs_create_partition_image(storage ../resources FLASH_IN_PROJECT)
  • 根目录的 CMakeLists.txt 配置(CMakeLists.txt)
1
2
3
4
5
6
7
8
9
cmake_minimum_required(VERSION 3.16)

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

# 设置编译选项以启用彩色诊断输出,这样在编译时可以更容易地阅读错误和警告信息
add_compile_options(-fdiagnostics-color=always)
# 最小化构建设置为 ON,以便在构建时仅包含必要的组件
idf_build_set_property(MINIMAL_BUILD ON)
project(ESP_IDF_Universal_Template)
  • 总的来说 自定义组件需要关注的是 REQUIRES 是否有需要依赖的库 INCLUDE_DIRS SRCS 就是用刚才插件创建时写好了的
  • main组件的 CMakeLists.txt 主要就看 REQUIRES,要把我们自己的组件引入进来
  • INCLUDE_DIRS SRCS REQUIRES 的内容都用因为的引号包裹一下最好,如果有多个就中间空格一下或者换行
  • 根目录下的 CMakeLists.txt 和自定义组件目前看着没什么关系

示例

如何开启 tinyusb

  1. 在项目的 main 文件夹里新建一个 idf_component.yml 用于管理依赖 这个类似于 Java 的 Maven/gradle
  2. 内容如下
1
2
3
dependencies:

esp_tinyusb: "~2.0.0"
  1. 打开ESP-IDF 终端
    进入ESP-IDF 终端

  2. 输入命令 idf.py add-dependency esp_tinyusb~2.0.0
    命令添加依赖

  3. 图形化编辑配置报错 exited with code:2
    导致的原因:我先用命令行 idf.py menuconfig 去看了里面的配置,然后退出后去尝试用 esp-idf 插件的sdk配置编辑器,就导致报错了,也可能是我手动之前把 sdkconfig 文件删了导致的

编辑配置报错

开发板设置

对应根目录下的 sdkconfig 文件,如果文件删除了就要重新配置

  1. 设置 Flash 大小
    flash设置

  2. 设置 Flash 模式

  • Serial flasher config -> Flash SPI mode -> QIO

Flash SPI mode

模式 优点 缺点
DIO • 引脚占用少
• 兼容性最好
• 速度最慢
DOUT • 读取速度优于 DIO
• 引脚占用少
• 写入速度慢
QIO • ⚡ 读取速度最快
• 写入速度快
• 占用 5 个 GPIO
• 需要支持 QIO 的 Flash
QOUT • 读取速度快
• 兼容性较好
• 占用 5 个 GPIO
• 写入速度慢
  • 看网课视频中说的 QIO 比 DIO 性能大约快45%,但是就是占用的引脚会多点,好像说的开了
  • 也就是说像车道一样,4 车道,双车道,多两个车道那么就得多占用引脚
  1. 设置 PSRAM 模式
  • Component config -> ESP PSRAM -> ☑️Support for external, SPI-connected RAM -> SPI RAM config -> Mode (QUAD/OCT) of SPI RAM chip in use -> Octal Mode PSRAM
    设置PSRAM
  • Quad Mode PSRAM:4 条数据线同时工作(四线模式),走 4 车道的路,一次能过 4 辆车
  • Octal Mode PSRAM:8 条数据线同时工作(八线模式),走 8 车道的高速,一次能过 8 辆车
  • ESP32-S3-WROOM-1-N16R8 型号里的 R8,就代表板载 8MB Octal PSRAM
  • Quad Mode PSRAM:老款、常见,速度上限较低(约 40MB/s),很多旧款模组用这个
  • Octal Mode PSRAM:新款、更快,速度上限接近 80MB/s,你的 N16R8 模组用的就是这种
  1. 设置 RAM 时钟频率
  • Component config -> ESP PSRAM -> ☑️Support for external, SPI-connected RAM -> SPI RAM config -> Set RAM clock speed -> 80MHz clock speed
    Set RAM clock speed
  1. 设置 FreeRTOS 节拍时钟周期
  • Component config -> FreeRTOS -> Kernel -> configTICK_RATE_HZ : 1000
    configTICK_RATE_HZ
  • 原本我们写延迟 1S 可以有三种写法
    vTaskDelay(100); 这是在我们确定好一个节拍是 10ms 的情况(这是默认的,configTICK_RATE_HZ : 100 的情况下)
    vTaskDelay(pdMS_TO_TICKS(1000)); 第二种就是不考虑节拍数,中间自己用个 pdMS_TO_TICKS()
    vTaskDelay(1000); configTICK_RATE_HZ:1000 ,那么我们自己定义了算下来就是一个节拍 1ms 就可以用 来符合我们习惯的方式

Espressif Touch Controller

HID相关
HID设置

构建与烧录

烧录时选择 UART 模式进行烧录(UART=串口模式 只能下载烧录固件不能调试,JTAG=USB模式,可以下载烧录固件也可以调试)
构建与烧录

进入烧录(下载模式)

插若我们的烧录的固件导致设备插入电脑时电脑死机,无法烧录新的程序时

  1. 按住开发版的BOOT 键不松手,然后用 USB 线连接电脑和开发版,连接后看到开发版上亮灯也就是供电后,点按一下RESET 键(我好像没按也行),然后再把 BOOT键松开,这样开发版就会进入下载模式,也就是不会往外去输出执行程序,电脑就不会死机了
  2. 这个时候就正常的去烧录程序吧