共计 2474 个字符,预计需要花费 7 分钟才能阅读完成。
传统 ECU 刷写方式的局限性
在汽车电子控制单元(ECU)的开发中,传统的刷写方式通常需要将车辆开到 4S 店,通过 OBD 接口连接诊断设备进行软件更新。这种方式存在几个明显的痛点:

- 操作繁琐 :每次更新都需要专业设备和人员操作,车主需要专门安排时间前往 4S 店。
- 耗时较长 :由于 CAN 总线带宽限制(通常最高 1Mbps),传输大型固件包可能需要数十分钟甚至更久。
- 成本高昂 :4S 店的人力成本和设备维护成本最终会转嫁给消费者。
- 覆盖范围有限 :偏远地区或老旧车型可能无法及时获得更新服务。
这些痛点促使汽车行业转向 SOTA(Software Over-The-Air)技术,实现远程、高效的 ECU 软件更新。
SOTA 与传统 CAN 刷写的技术对比
SOTA 与传统 CAN 刷写在协议栈上存在显著差异:
协议栈差异
- 传统 CAN 刷写 :
- 物理层:CAN 总线(ISO 11898)
- 传输层:CAN TP(ISO 15765-2)
-
应用层:UDS(ISO 14229)
-
SOTA:
- 物理层:以太网(IEEE 802.3)或蜂窝网络(4G/5G)
- 传输层:TCP/IP
- 应用层:HTTP/HTTPS 或 MQTT
性能对比
| 指标 | 传统 CAN 刷写 | SOTA |
|---|---|---|
| 带宽 | ≤1Mbps | ≥100Mbps |
| 传输距离 | 车载局域网 | 全球范围 |
| 安全机制 | 基础认证 | 端到端加密 |
SOTA 核心实现
安全启动链(Secure Boot)配置
AURIX TC3xx 系列通过 HSM(Hardware Security Module)实现安全启动,主要配置步骤:
-
生成密钥对(RSA-2048 或 ECC-256):
openssl genrsa -out private_key.pem 2048 openssl rsa -in private_key.pem -pubout -out public_key.pem -
将公钥烧写到 HSM 的密钥槽(Key Slot),以 Slot 0 为例:
// 初始化 HSM 模块 IfxHsm_Init(&hsmConfig); // 加载公钥到 Slot 0 IfxHsm_LoadKey(0, public_key_der, sizeof(public_key_der)); -
在链接脚本(.ld)中配置受保护的内存区域:
.secure_code : {KEEP(*(.boot_header)) /* Boot header 必须放在起始位置 */ *(.secure_text) *(.secure_data) } > pflash0
差分更新算法(Delta Update)
差分更新通过比较新旧固件版本生成差异包(Delta Package),典型实现流程:
-
使用 bsdiff 算法生成差异包:
import bsdiff4 delta = bsdiff4.diff(old_firmware.bin, new_firmware.bin) -
在 ECU 端应用差异包:
// TC3xx 内存中执行补丁应用 void apply_delta(const uint8_t* base, const uint8_t* delta, uint32_t delta_size) {uint8_t* output = (uint8_t*)0xA0000000; // 双 Bank 切换的目标地址 bsdiff_patch(base, output, delta, delta_size); }
示例代码:HSM 加密调用
以下代码展示 TC3xx 的 AES-128 加密流程(参考数据手册第 23 章):
#include <IfxHsm.h>
void hsm_aes_encrypt(const uint8_t* plaintext, uint8_t* ciphertext) {
IfxHsm_Aes_Config aesConfig = {
.keySlot = 1, // 使用预配置的密钥槽 1
.mode = IFXHSM_AES_ECB,
.keySize = IFXHSM_AES_128,
};
IfxHsm_Aes_Handle aesHandle;
IfxHsm_Aes_init(&aesHandle, &aesConfig);
// 执行加密(数据长度必须是 16 字节的整数倍)IfxHsm_Aes_encrypt(&aesHandle, plaintext, ciphertext, 16);
}
避坑指南
内存分区设计
双 Bank 切换失败是 SOTA 常见问题,推荐设计原则:
- 保留至少 20% 的 Flash 空间作为缓冲区域
- 使用 Linker Script 明确划分 Bank 区域:
MEMORY {pflash0 (rx) : ORIGIN = 0x80000000, LENGTH = 1M pflash1 (rx) : ORIGIN = 0x80100000, LENGTH = 1M /* 必须保证两个 Bank 大小完全相同 */ }
断点续传策略
应对网络中断的典型方案:
-
在 RAM 中维护下载进度表:
typedef struct { uint32_t file_size; uint32_t received; uint8_t crc32[4]; } DownloadContext; -
实现 HTTP Range 请求:
GET /firmware.bin HTTP/1.1 Host: ota.server.com Range: bytes=1024-2047
测试验证
刷写耗时对比
实测数据(1MB 固件包):
| 方式 | 传输时间 | 总耗时 |
|---|---|---|
| CAN (500kbps) | 16.8s | 23.4s |
| Ethernet (100Mbps) | 0.08s | 1.2s |
注:总耗时包含签名验证和写入 Flash 的时间(TC3xx 擦除 1MB Flash 约需 200ms,见数据手册第 15.5.3 节)
ISO 21434 合规性
关键安全要求实现情况:
- 认证性 :通过 HSM 实现 ECDSA 签名验证
- 完整性 :SHA-256 校验固件哈希
- 机密性 :AES-128 加密传输通道
- 可用性 :支持回滚到上一个有效版本
结语
通过 AURIX 的 SOTA 功能,开发者可以构建符合汽车行业标准的远程更新系统。实际项目中还需要注意:
- 在 TC3xx 上启用 MPU(Memory Protection Unit)保护关键数据
- 定期测试看门狗在刷写期间的超时处理
- 遵循 AUTOSAR 标准定义诊断事件(DTC)
建议结合英飞凌的 AURIX Development Studio 和 MemTool 工具进行调试,可以显著提高开发效率。
