专题综述

Tutorial: 卓越工程师 Category: 嵌入式 Published: 2026-10-23 11:05:29 Views: 0 Likes: 0 Comments: 0

176.0专题综述

本课是新专题的总体介绍,只展示思维导图、项目框图、硬件清单和后续学习路线,没有打开或讲解具体源码。因此本节不在标题下强行补代码;配套目录中的 CAN、IAP、LVGL 和 ISO-TP 源码分别属于后续课程。

一、专题综述

本专题把三个知识点整合到一个“汽车仪表盘”教学项目中:

逐字稿误识别正确名称本专题中的作用
看CAN(Controller Area Network)在两个 STM32 节点之间传送仪表数据和升级数据
IP 固件升级IAP(In-Application Programming)设备安装后,通过通信接口更新片内 Flash 中的应用固件
IVGL、LHLLVGL(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 HEXASCII 文本记录是,记录内含地址、类型和记录校验常见下载工具输入格式,用来帮助理解“固件文件”
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 块;课程强调不要买 C6T6PC 与 CAN 之间的发送/网关节点;应按配套工程的具体芯片与引脚复现
CAN 收发器模块实验使用 2 块,视频建议买 3 块以上留备用课程实物图芯片丝印为 VP230,对应 SN65HVD230;每个 CAN 节点各需一块,购买时还要核对供电、CANH/CANL、终端电阻和模块引脚定义
3.5 英寸 SPI LCD1 块,新款、焊接排针、ST7796 版本最终仪表盘显示。控制器或排针版本不同,驱动与接线可能不同
0.96 英寸 OLED1 块前期 CAN 与传感器实验的简易数据显示,不是最终 3.5 英寸仪表盘屏
温湿度传感器1 个前期生成可观察的 CAN 业务数据
USB 转 TTL 串口模块建议 2 个分别服务数据模拟、固件传输或调试日志;必须核对 3.3 V TTL 电平与 TX/RX 交叉
ST-Link1 个初次下载 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 只是其示例之一。

学习这一部分应重点理解:

  1. Bootloader 和 Application 为什么必须使用互不重叠的 Flash 地址;
  2. 链接地址、向量表地址和实际烧写地址为什么要一致;
  3. Flash 擦除通常按页进行,写入又有对齐与“只能从 1 写成 0”等约束;
  4. 跳转应用前为什么要处理栈指针、中断、外设状态和向量表;
  5. 固件长度、版本、CRC/哈希乃至数字签名为什么不能只靠传输协议代替;
  6. 升级中途掉电时怎样避免设备同时失去 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 的寻址、连接、确认、重传和拥塞控制并不相同,不能说成“它们完全一样”。

参考资料