尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

# 基于ESP32-S3与CAN总线的车载仪表盘远程固件升级系统(开源实战)

# 基于ESP32-S3与CAN总线的车载仪表盘远程固件升级系统(开源实战) 项目开源地址https://github.com/1919884213/ESP32-LCD-CAN-IAPMIT License技术栈ESP32-S3 LVGL 9 ESP-IDF 5.x | STM32F103C8T6 ×2 | CAN 2.0A 50 kbit/s | FreeRTOS / 自研 TinyRTOS一、项目是做什么的这是一套「1 个上位机 2 个下位机节点」的车载仪表演示系统核心卖点一句话通过 CAN 总线对下位机 Bootloader 做远程固件升级IAP全程不拆机、不接 SWD。系统分工上位机ESP32-S3LVGL 9 仪表盘 UI320×24010 个页面、WiFi/MQTTOneNET、和风天气、智谱 AI 流式对话、OTA 自升级并通过 TWAI 外设收发 CAN 报文下位机STM32F103C8T6 ×2环境节点DHT11 温湿度、GL5528 光照、NTC运动节点MPU6050 姿态、超声波测距、霍尔轮速每块 STM32 都是Bootloader0x08000000 APP0x08004000双区结构上位机从本地 bin / W25Q64 / HTTP 拉取固件走 CAN 协议刷入。还有一个我觉得比较有意思的点下位机 APP 提供两套运行时——标准 FreeRTOS 版CanDevice*和自研 TinyRTOS 版myCanDevice*后者通过 CMSIS-RTOS v2 兼容层无缝替换内核业务任务代码一行不改固件体积从 29.8 KB 降到 19.5 KB。二、系统架构┌──────────────────────────────┐ WiFi / MQTT │ ESP32-S3 上位机 │ ┌──────────────│ LVGL 9 仪表盘 · TWAI(CAN) │──── OTA (HTTPS) │ │ WiFi/MQTT(OneNET) · LLM对话 │ │ └──────────┬───────────────────┘ │ │ CAN 总线 50 kbit/s │ ┌──────────┴──────────┐ │ ┌────────▼────────┐ ┌────────▼────────┐ │ │ STM32F103 节点1 │ │ STM32F103 节点2 │ │ │ 环境节点 │ │ 运动节点 │ │ │ BootloaderAPP │ │ BootloaderAPP │ │ │ DHT11/光照/NTC │ │ MPU6050/超声波/霍尔│ │ └─────────────────┘ └─────────────────┘三、CAN IAP 协议设计重点完整报文表见仓库myCanDevice2/CAN总线报文ID汇总_v2.0.0 (1).md要点CAN 2.0A 标准帧11 位 IDDLC850 kbit/s多字节字段小端序IAP 流程四步走握手擦除 → 分块传输带序号 CRC→ 校验 → 激活重启节点侧升级指令 ID运动节点0x600/0x610/0x620环境节点0x601/0x611/0x621业务数据帧举例环境节点上报0x200/0x201故障帧0x080运动节点上报0x100/0x101/0x110/0x701。Bootloader 的判断逻辑上电后先等一小段时间的 CAN IAP 指令没收到就校验 APP 区有效标志并跳转0x08004000APP 有效标志持久化保存升级失败不会变砖。板载 PC13 LED 可以直观区分当前跑在哪边——闪烁 Bootloader常亮 APP。四、上位机功能一览模块说明仪表盘 UILVGL 9320×240 运动仪表风主题碳黑 橙10 个功能页面CAN 通信ESP32 TWAI 驱动50 kbit/s收发环境/运动节点业务帧IAP 升级本地 / W25Q64 / HTTP 三种固件源CAN 协议刷入带 CRC 校验OTA 升级上位机自身 HTTPS OTA自定义分区表factory 单分区 3.9 MB云端OneNET MQTT 物模型上报和风天气智谱 AI 流式对话WiFi软键盘配网、连接状态机、NVS 持久化凭据存储W25Q64GIF 待机动画帧、中文字库、OTA/IAP 固件缓存FATFS五、TinyRTOS 版与 CMSIS-OS2 兼容层myCanDevice*的内核是我自己写的 TinyRTOS位图调度器 协程式上下文切换switch.sPendSV软件定时器、队列、信号量、优先级继承互斥锁关键是Core/rtos/os_compat.c实现CMSIS-RTOS v2 → TinyRTOS 兼容层既有的 CanTask / MPU6050Task / UltrasonicTask / freertos.c一行不改就能跑在自研内核上这也让换内核的对比测试变得非常方便——同一个 IAP 协议、同一套上位机两个内核的固件都可以刷。六、快速上手1. 下位机每块 STM32 板编译烧录 BootloaderBootLoader_device1或 2→0x08000000编译 APP二选一FreeRTOS 版CanDevice1/CanDevice2CMake arm-none-eabi-gcc或 STM32CubeIDE 导入TinyRTOS 版myCanDevice1/myCanDevice2APP 烧到0x08004000——也可以偷懒直接用上位机 IAP 页面通过 CAN 刷入仓库里自带的LCD/*.bin。2. 上位机ESP32-S3cdLCD idf.py set-target esp32s3 idf.py build flash monitor首次使用必做main/secrets.h不入库克隆后复制main/secrets.h.example为main/secrets.h填入WiFi 热点 SSID / 密码UI 网络页也可现场改智谱 AI API KeyLLM 对话页和风天气 API Key天气页OneNET 产品/设备三元组不用可留占位值连接失败不影响其他功能。3. IAP 演示上位机 IAP 页面选择节点0x600/0x601与固件源本地 bin / W25Q64 / HTTP点升级即可看到进度条CRC 校验通过后 Bootloader 跳转新 APP。七、开发环境ESP32-S3ESP-IDF ≥ 5.1推荐 5.2/5.3LVGL 9.xmanaged componentSTM32F103arm-none-eabi-gcc 12 与 CMakeCMakePresets.json或 STM32CubeIDE.ioc可重新生成 CubeMX 工程另附BootLoader_device*/tools/can_iap_flash.py可用 CAN 口直接刷 Bootloader 初始镜像。八、写在最后这个项目把嵌入式求职常被问到的几块硬骨头串成了一条完整的链路LVGL 多页 UI TWAI/CAN 驱动 Bootloader/双区 IAP CRC 校验 OTA MQTT 物模型 自研 RTOS 内核而且每个环节都有实机可演示。仓库是多个子工程的合并快照结构清晰欢迎 Star / Fork / 提 Issue 交流。再放一次地址https://github.com/1919884213/ESP32-LCD-CAN-IAP
返回列表