随着汽车电子与智能制造的发展,对远程固件升级(OTA,Over-the-Air)的需求不断增加,尤其在车载控制器、工业网关等复杂系统中,通过 CAN 总线进行安全可靠的 OTA 更新 正成为主流选择。
灵动微电子针对该需求推出的 FlexCAN OTA 解决方案,基于标准 UDS(Unified Diagnostic Services)协议,实现了对 MM32 系列 MCU 的高可靠固件升级。
本文将深入剖析该方案的技术原理、关键模块、实现方式及其在实际应用中的价值。
一、核心概念解析1. FlexCAN 是什么?FlexCAN 是 NXP 首创的一个高鲁棒性 CAN 控制器架构,灵动在其部分 MM32 系列(如 MM32F3270)中参考实现了类似功能,包括: 更完善的帧缓冲管理; 更强的中断控制能力; 适用于工业与车载的复杂 CAN 网络。
相比传统 CAN 控制器,FlexCAN 更适合大规模节点通信及实时响应要求高的场景。 2. 什么是 UDS 协议?UDS(ISO 14229) 是一套汽车行业标准化诊断通信协议,用于: 读取 ECU 信息; 写入数据块(如 ECU 配置、固件); 控制诊断会话、重启命令等。
在 OTA 场景中,UDS 提供了完整的数据包传输与安全升级流程,包括: 3. Bootloader 的角色OTA 的关键组件是 Bootloader,其职责包括: 启动判断:区分是否进入主程序或升级模式; 接收并验证 UDS 传输的数据; 将新固件写入 Flash; 保证升级失败时 MCU 不“变砖”。
二、FlexCAN OTA 系统架构OTA 过程通常分为如下几步: plaintext
[ 上位机工具 ] <--UDS--> [ Bootloader 固件(运行在 MCU) ] | [ Flash 存储区划分 ]
三、关键代码与功能模块示意1. Bootloader 启动逻辑c
if (received_UDS_enter_program_mode()) { enter_bootloader(); // 接收固件数据} else { jump_to_user_app(); // 启动主程序}
2. 典型 UDS 服务处理流程(0x34 数据传输)c
case UDS_REQUEST_DOWNLOAD: prepare_flash_write(); send_positive_response();case UDS_TRANSFER_DATA: buffer_write(); send_positive_response();case UDS_REQUEST_TRANSFER_EXIT: verify_checksum(); send_positive_response();
3. Flash 写入流程c
void write_flash(uint32_t addr, uint8_t* data, uint16_t len) { FLASH_Unlock(); for (int i = 0; i < len; i += 4) { FLASH_ProgramWord(addr + i, *(uint32_t*)(data + i)); } FLASH_Lock();}
|