1、学习
参考:【有手就行系列】嵌入式单片机教程-桌面小屏幕实战教学 从设计、硬件、焊接到代码编写、调试 ESP32 持续更新2022
对应在线文档
1、需求分析
需求–>需求细化–>流程化–>外设方案化–>软硬件接口梳理;
2、 方案选型
外设选型(封装、通用/稳定性、电池容量/充电电流/保护、主控主频/RAM/ROM/IO);
ESP32选型一文就够,ESP32-WROOM-32、ESP32-WROVER、ESP32-S衍生模组、ESP32-PICO差异 - 哔哩哔哩 (bilibili.com)
3、绘制PCB
参考:ESP32自动下载电路究竟是如何巧妙实现的-CSDN博客)
原理图–>PCB(layout规范、绘制板框尺寸、布局、走线规范、过孔/测试点/泪滴/丝印、DRC检查。(PS:CH340添加防倒灌电路、预留测试/下载点、电源线要粗点.立创EDA绘制自己的元件(无符号/封装):新建元件库–>新建符号–新建封装–>关联符号与封装);
4、设计梳理,绘制流程图
5、 开发环境搭建
1、Linux:
方案:虚拟机(ubuntu2 + ssh+samba + vscode(windows) +esp32开发依赖环境(ESP-IDF v5.3);
参考:Linux 和 macOS 平台工具链的标准设置 - ESP32 - — ESP-IDF 编程指南 v5.3 文档 (espressif.com)
Embeded 2 环境搭建 - 飞书云文档 (feishu.cn)
安装编译所需软件包:
1
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
获取ESP-IDF:
1
2
3mkdir -p ~/esp
cd ~/esp
git clone -b v5.3 --recursive https://github.com/espressif/esp-idf.git设置工具(编译器、调试器、Python包等):
1
2
3
4
5
6ESP-IDF 工具安装器会下载 Github 发布版本中附带的一些工具,如果访问 Github 较为缓慢,可以设置一个环境变量,从而优先选择 Espressif 的下载服务器进行 Github 资源下载。
推荐国内用户使用国内的下载服务器,以加快下载速度
cd ~/esp/esp-idf
export IDF_GITHUB_ASSETS="dl.espressif.cn/github_assets"
仅为 ESP32 安装所需工具
./install.sh esp32设置环境变量:
1
2
3
4. $HOME/esp/esp-idf/export.sh
可为执行 . $HOME/esp/esp-idf/export.sh创建一个别名
在.bashrc文件中添加
alias get_idf='. $HOME/esp/esp-idf/export.sh'开始使用:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23get_idf
将 get-started/hello_world 工程复制至本地的 ~/esp 目录下:
cd ~/esp
cp -r $IDF_PATH/examples/get-started/hello_world .
进入 hello_world 目录,设置 ESP32 为目标芯片,然后运行工程配置工具 menuconfig
cd ~/esp/hello_world
idf.py set-target esp32
idf.py menuconfig
清楚先前编译产生的文件(涉及分区操作时最好执行一次)
idf.py fullclean
编译
idf.py build
烧录&监视输出
idf.py -p /dev/ttyUSB0 -b 115200 flash moitor
退出ESP-IDF监视器
ctr+]
擦除整个 flash
idf.py -p PORT erase-flash
若存在需要擦除的 OTA 数据
idf.py -p PORT erase-otadata(可选)更新ESP-IDF:
2、windows:
3、iats_pro @esp-idf3.0 @windows
- 设置工具链:下载集成在一起的工具链和 MSYS2 压缩文件,将 zip 压缩文件解压到
C:\
(或其它路径,这里假设是C:\
),它会使用预先准备的环境创建一个msys32
目录,运行C:\msys32\mingw32.exe
打开一个 MSYS2 的终端窗口,在此窗口下开发; - 获取ESP-IDF;
- 设置ESP-IDF环境变量(这里使用单次:
export IDF_PATH="D:/South/iAts_pro/lib/esp-idf"
):在用户配置文件中添加 IDF_PATH — ESP-IDF 编程指南 v3.3.1 文档 (espressif.com); - 安装依赖的Python 软件包:
python2.7 -m pip install --user -r D\:/South/iAts_pro/lib/esp-idf/requirements
; - 示例工程:
cp -r D\:/South/iAts_pro/lib/esp-idf/examples/get-started/hello_world/ .
; - 配置:
make menuconfig
; - 编译、烧写、监视。
6、程序编写
参考:快速入门 - ESP32 - — ESP-IDF 编程指南 v5.3 文档 (espressif.com)
1、日志打印
1 |
|
2 、多任务
3、Timer+消息队列
4、文件系统
后续供http service使用,存储html等文件。spiffs文件系统移植,复制分区表esp-idf/examples/storage/spiffs/partitions.csv
,到项目文件夹下,idf.py menuconfig
设置参数:
1 | CONFIG_PARTITION_TABLE_CUSTOM=y |
5、NVS-非易失性存储
KeyMap,供Wifi账号密码存储使用
6、GPIO
7、I2C
8、SPI
高速、全双工、同步
9、AP mode + http service
SSID 与 passwd在menuconfig中配置
http service 参考:esp-idf/examples/protocols/http_service
编写setting.html文件,添加到main/CMakeLists.txt–>EMBED_FILES “setting.html”,分区表添加spiffs,用于存储setting.html文件
HTTP与HTTPS请求服务器数据:
HTTP:参考esp-idf/examples/protocols/http_request
心知天气、苏宁时间、B站粉丝数
HTTPS: 获取网站ca证书:openssl s_client-showcerts-connect api seniverse.com:443 </dev/null 复制—-BEGIN CERTIFICATE—后内容到pem文件
Makefile添加证书EMBED_TXTFILES “server_root_cert.pem”
main/component.mk添加COMPONENT_EMBED_TXTFILES :=server_root_cert.pem
10、STA mode + wifi connect
STA参考:esp-idf/examples/wifi/getting_start/station
STA scan
11、显示字库图标
图标–>取模—>数组
字库:字体文件.TTF—->LVGL工具:LvglFontTool–>加入常用汉字—>XBF字体,外部bin文件
字库下载到Flash:
- 添加分区(partitions.csv):storages1, 0x40, 0x01, 0x15D000, 0x2000000
- idf.py menuconfig 修改flash大小为实际大小
- 下载字体库到flash:python esptool.py –chip esp32 –port /dev/ttyUSB0 –baud
write_flash -z 0x15D000 DesktopScreenFont.bin
画笔相关实现,将图标文字放在同一个页面
7、关于ESP-IDF
1、相关术语:
- SMP(对称多处理);
- ESP-IDF FreeRTOS:是基于原生 (Vanilla)FreeRTOS v10.5.1 的 FreeRTOS 实现,其中包含支持 SMP 的大量更新。最多支持两个核(即双核 SMP),但在设计上对这种场景进行了优化;
- Amazon SMP FreeRTOS:是由 Amazon 官方支持的 FreeRTOS SMP 实现,能够支持 N 核,即双核以上;
- 核亲和性:尽管 SMP 系统支持线程切换核,但在某些情况下,线程必须或应该仅在特定核上运行。因此,在 SMP 系统中,线程也具备核亲和性,指定线程在哪个特定核上运行;
- PRO_CPU和APP_CPU:核 0 和核 1别名,反映了典型 ESP-IDF 应用程序使用这两个 CPU 的方式。负责处理 Wi-Fi 或蓝牙等协议相关处理程序的任务通常会分配给核 0,而处理应用程序其余部分的任务会分配给核 1;
- 任务创建:内存动态/静态分配,核亲和性;
- Vanilla FreeRTOS 调度器:具有时间分片和固定优先级的抢占式调度器;
- 临界区 (Critical Section):在 SMP 系统中,仅禁用中断并不能构成临界区,因为存在其他核意味着共享资源仍可以同时访问。因此,IDF FreeRTOS 中的临界区使用自旋锁实现,自旋锁可以静态或动态分配;