专题综述
176.0专题综述
本课是新专题的总体介绍,只展示思维导图、项目框图、硬件清单和后续学习路线,没有打开或讲解具体源码。因此本节不在标题下强行补代码;配套目录中的 CAN、IAP、LVGL 和 ISO-TP 源码分别属于后续课程。
一、专题综述
本专题把三个知识点整合到一个“汽车仪表盘”教学项目中:
| 逐字稿误识别 | 正确名称 | 本专题中的作用 |
|---|---|---|
| 看 | CAN(Controller Area Network) | 在两个 STM32 节点之间传送仪表数据和升级数据 |
| IP 固件升级 | IAP(In-Application Programming) | 设备安装后,通过通信接口更新片内 Flash 中的应用固件 |
| IVGL、LHL | LVGL(Light and Versatile Graphics Library) | 在 3.5 英寸 LCD 上绘制仪表盘图形界面 |
三者分别解决“设备间怎样通信”“设备怎样更新自身程序”“设备怎样显示图形界面”。它们不是彼此替代的技术,而是位于项目不同位置:CAN 提供通信链路,IAP 利用该链路取得新固件,LVGL 使用收到的业务数据刷新界面。
CAN 与 I²C、SPI、UART 都能传输串行数据,但不能只把它理解为“又一个串口”。CAN 面向总线上的多个节点,具有基于标识符的仲裁、帧校验、错误检测与自动重发等机制;STM32 内部的 CAN 控制器负责协议帧,外部 CAN 收发器负责把逻辑信号转换成 CANH/CANL 差分电平。
IAP 也不等于“网络升级”或“以后完全不需要下载器”。它表示 MCU 在应用场景中通过自身程序重写内部 Flash;通信介质可以是 CAN、USART、USB 等。本项目选择 CAN。初次写入 Bootloader、调试以及异常恢复仍可能需要 ST-Link。
LVGL 是用 C 编写的嵌入式图形库,不是 STM32 的硬件外设,也不等于显示屏驱动。LCD 底层驱动负责把像素送到屏幕,LVGL 在其上提供对象、控件、样式、动画和输入事件等 GUI 能力。配套资料目录明确使用 LVGL 8.3,后续学习应以课程版本的 API 为准,不能直接套用其他大版本示例。
1.1 汽⻋仪表盘项目
该项目设计了两个 STM32 节点:STM32F103C8T6 作为 PC 与 CAN 总线之间的中间节点,STM32F103ZET6 作为仪表显示与固件更新目标。课程用它串联串口、CAN、Flash、Bootloader、LCD 和 LVGL,不只是做一张静态仪表盘图片。
视频录制时,教师明确说明 CAN 与固件升级部分已经完成,LVGL 部分仍在制作。这是当时的课程开发进度,不能据此写成整个项目已经完成并经过完整产品级验证。当前配套目录虽已保存多个后续阶段工程,也仍应按课程逐节验证,而不能把目录名当作测试结论。
1.1.1 项目功能
项目包含两条主要数据链路:
仪表数据链路:
PC 模拟车速、里程等数据
→ USART1
→ STM32F103C8T6
→ CAN 控制器 + CAN 收发器 + CAN 总线
→ STM32F103ZET6
→ LVGL
→ 3.5 英寸 LCD 仪表盘
固件升级链路:
PC 发送固件二进制数据
→ USART2
→ STM32F103C8T6
→ CAN / ISO-TP
→ STM32F103ZET6 Bootloader
→ 校验并写入内部 Flash
→ 启动新的应用程序
视频把两路 PC 连接分别称作“串口 1”和“串口 2”;配套 C8T6 工程的 .ioc 也确实启用了 USART1、USART2 和 CAN。仪表数据由 PC 模拟,不代表课程已经接入真实汽车的 ECU、车速传感器或整车 CAN 网络。
LVGL 的价值不是“不用它就不能画圆”,而是把控件、样式、动画、字体、事件和局部刷新等通用功能组织成一套图形框架。直接使用 LCD 画点、画线函数也能画图,但界面规模变大后,状态管理和交互维护会明显困难。
1.1.2 网络固件更新
本节所说的“网络”是由 CAN 节点构成的车载通信网络,不是互联网、Wi-Fi 或云端 OTA。升级数据先由 PC 经 USART2 送到 C8T6,再通过 CAN 链路传给 ZET6;ZET6 端的 Bootloader 接收、校验并写入应用区。
视频先用熟悉的 HEX 文件帮助理解,随后明确说明项目实际传的是 BIN 文件。二者不能混为一谈:
| 文件 | 形式 | 是否自带目标地址等记录信息 | 本项目中的定位 |
|---|---|---|---|
| Intel HEX | ASCII 文本记录 | 是,记录内含地址、类型和记录校验 | 常见下载工具输入格式,用来帮助理解“固件文件” |
| BIN | 连续的原始字节 | 否,起始地址需由升级协议/Flash 布局约定 | 本项目实际传输的固件载荷 |
IAP 的关键并不只是“把文件传过去”。一个可用的升级流程至少需要约定 Bootloader 区与应用区、固件长度和写入地址,校验镜像完整性,处理擦写失败或中途掉电,并在跳转前设置应用入口与中断向量。课程后面会逐步实现这些内容,本节只建立总体概念。
1.1.3 项目框图
从职责上看,框图中的组件可分为四层:
| 层次 | 组件 | 主要职责 |
|---|---|---|
| PC 工具层 | 串口助手、固件发送工具 | 产生模拟仪表数据,或发送固件文件 |
| 网关/发送节点 | STM32F103C8T6 | 从 USART1/2 接收数据,整理后送入 CAN |
| CAN 链路 | 两端 CAN 控制器、TJA1050 收发器、CANH/CANL | 传送 CAN 帧;长数据再由 ISO-TP 分段与重组 |
| 目标节点 | STM32F103ZET6、LCD、Bootloader、应用程序 | 显示仪表数据,或接收并安装新固件 |
课程口中的“CAN 收发器传输 CAN 数据”应再细分:MCU 的 CAN 外设产生 TX/RX 逻辑信号,TJA1050 一类收发器完成逻辑电平与 CAN 总线差分电平之间的转换。只买两块 MCU 板而没有两端收发器,不能直接组成标准 CANH/CANL 总线。
项目的传输链路较长,调试时应分段验证:先验证 PC↔C8T6 串口,再验证两个 CAN 节点,最后接入 LVGL 或 Flash 写入。否则最终屏幕不动时,很难判断故障位于 PC 数据、串口、CAN、协议解析还是显示层。
1.1.4 硬件清单
视频中的清单及其用途如下。购买链接和价格会随时间变化,应按型号、接口、电压和控制器核对,而不是照历史商品页面盲买。
| 硬件 | 数量/选择 | 用途与注意点 |
|---|---|---|
| STM32F103ZET6 开发板 | 1 块,课程黑色开发板 | 目标 CAN 节点,驱动大屏,运行 LVGL,并作为 IAP 升级对象 |
| STM32F103C8T6 最小系统板 | 1 块;课程强调不要买 C6T6 | PC 与 CAN 之间的发送/网关节点;应按配套工程的具体芯片与引脚复现 |
| CAN 收发器模块 | 实验使用 2 块,视频建议买 3 块以上留备用 | 课程实物图芯片丝印为 VP230,对应 SN65HVD230;每个 CAN 节点各需一块,购买时还要核对供电、CANH/CANL、终端电阻和模块引脚定义 |
| 3.5 英寸 SPI LCD | 1 块,新款、焊接排针、ST7796 版本 | 最终仪表盘显示。控制器或排针版本不同,驱动与接线可能不同 |
| 0.96 英寸 OLED | 1 块 | 前期 CAN 与传感器实验的简易数据显示,不是最终 3.5 英寸仪表盘屏 |
| 温湿度传感器 | 1 个 | 前期生成可观察的 CAN 业务数据 |
| USB 转 TTL 串口模块 | 建议 2 个 | 分别服务数据模拟、固件传输或调试日志;必须核对 3.3 V TTL 电平与 TX/RX 交叉 |
| ST-Link | 1 个 | 初次下载 Bootloader/应用、在线调试和故障恢复;有 IAP 后仍建议保留 |
| 杜邦线、USB 线和稳定电源 | 按连接需要准备 | 建立串口、模块和供电连接,所有相关节点必须有正确电源参考 |
逐字稿中的 Z1T6 是 ZET6,0.96 寸 RED 屏幕 是 OLED 屏幕,烧热器 是 烧录器,中景源 应为品牌名“中景园”。TZ1050 这一近音转写不能仅凭语音直接定为 TJA1050:课程后续实物图上的 VP230 丝印对应 SN65HVD230D,采用 3.3 V 电源;而 TJA1050 采用 5 V 电源。复现时必须以实际芯片丝印和模块资料为准。视频提到烙铁、焊锡、斜口钳、剥皮钳和万用表只是通用工具参考,本项目使用已焊排针模块时不一定全部需要;万用表仍很适合排查供电、短路和连通性。
1.2 看部分
本节的“看部分”就是 CAN 部分。教师强调代码本身不一定很长,但理论较多。后续至少要建立这些概念的联系:
- CAN 控制器与外部收发器各负责什么;
- CANH/CANL 差分总线、共地和终端匹配为什么重要;
- 标准帧/扩展帧、数据帧、标识符和 DLC 表示什么;
- 多节点同时发送时如何按标识符逐位仲裁;
- 位时序、波特率、采样点为什么必须在节点之间匹配;
- 接收过滤器、中断/轮询以及错误状态怎样影响程序。
“先简单浏览”适合本节总览,不代表后面可以跳过理论。CAN 故障往往表现为“代码调用成功但总线没有有效帧”,需要结合接线、电平、终端、位时序、过滤器和错误计数逐层定位。
1.3 固件升级部分
IAP 的典型启动结构是:复位后先运行预置 Bootloader;Bootloader 判断是否需要升级,若需要则从通信接口接收镜像、校验并写 Flash,否则验证并跳转到应用程序。ST 官方资料说明 STM32F10x 的 IAP 可以使用 CAN、USART、USB 等通信协议,USART 只是其示例之一。
学习这一部分应重点理解:
- Bootloader 和 Application 为什么必须使用互不重叠的 Flash 地址;
- 链接地址、向量表地址和实际烧写地址为什么要一致;
- Flash 擦除通常按页进行,写入又有对齐与“只能从 1 写成 0”等约束;
- 跳转应用前为什么要处理栈指针、中断、外设状态和向量表;
- 固件长度、版本、CRC/哈希乃至数字签名为什么不能只靠传输协议代替;
- 升级中途掉电时怎样避免设备同时失去 Bootloader 和可启动应用。
课程项目首先用于理解 IAP 机制,不能仅因能通过 CAN 更新一次就宣称达到量产汽车 ECU 的可靠性或安全要求。真实产品还会考虑回滚、防降级、认证、安全启动、故障诊断与升级状态持久化。
1.4 LVGL部分
LVGL 移植不是把库文件复制进工程就结束。后续至少要接通:
- LCD 初始化和显示刷新回调,把 LVGL 生成的像素区域真正送到 ST7796;
- 绘图缓冲区,并根据 STM32F103ZET6 的 RAM/Flash 资源选择大小和色深;
- 周期 tick 与
lv_timer_handler()调度; - 若使用触摸,还要把触摸坐标和按下/松开状态接入 LVGL 输入设备接口;
- 字体、图片等资源的存储位置,以及界面刷新速度和总线带宽。
课程配套目录使用 LVGL 8.3;LVGL 不同大版本的显示、输入和定时器 API 会变化,因此学习时先跟随 8.3 工程,再对照新版迁移文档。
本节最后又提到“CAN TP”。结合配套工程中的 iso_tpif/isotp.c,这里具体指 ISO-TP(ISO 15765-2),用于在 CAN 上承载超过单帧容量的长数据。它通过单帧、首帧、连续帧和流控帧完成分段、重组与发送节奏控制,适合传输固件等长数据。
视频中的协议分层类比需要纠正:
- ISO 将 ISO-TP 定义为 CAN 上的传输协议和网络层服务,不宜简单称为“应用层协议”;
- TCP 是互联网协议栈的传输层协议,不是应用层协议;
- 网线是物理介质,Ethernet 和 Wi-Fi 才分别定义相应的物理层/数据链路层机制;
- ISO-TP 能处理长消息分段、序号、流控和超时,但“传输后固件一定完全正确”仍需镜像长度、CRC/哈希或签名等端到端校验来保证。
二者可在“都为上层提供比底层单帧更完整的传输能力”这一点上帮助类比,但 TCP/IP 与 ISO-TP/CAN 的寻址、连接、确认、重传和拥塞控制并不相同,不能说成“它们完全一样”。
参考资料
- 课程配套 专题思维导图 与 阶段工程目录:核对专题名称、项目阶段、硬件清单和两条数据链路。
- C8T6 侧 27C8T6_Send.ioc、ZET6 侧 12LCD_Display.ioc 与 bootloader.ioc:核对 MCU 型号以及 CAN、USART1、USART2 等项目外设。
- 配套 LVGL 8.3 源码目录 与 ISO-TP 实现:确认课程使用的 LVGL 版本,以及单帧、首帧、连续帧和流控帧实现属于后续课程源码。
- TI 官方 SN65HVD23x 数据手册 与 NXP 官方 TJA1050 数据手册:确认
VP230是 SN65HVD230D 的器件丝印、采用 3.3 V 电源,而 TJA1050 采用 4.75~5.25 V 电源。 - ST 官方 AN2557:STM32F10x in-application programming using the USART:说明 IAP 的含义,以及 STM32F10x 可使用 CAN、USART、USB 等协议完成在应用编程。
- LVGL 官方 8.3 文档 与 LVGL 简介:核对其嵌入式 GUI 库定位、硬件无关性和移植范围。
- ISO 官方 ISO 15765-2:2024:核对 ISO-TP 是面向 CAN 车载网络的传输协议和网络层服务。
- IETF RFC 9293:Transmission Control Protocol:核对 TCP 在互联网协议栈中属于传输层协议,而非应用层协议。