国产芯片杰发AutoChip 基于CAN的UDS Bootloader及刷写上位机 合并文件编...
AutoChip这套基于CAN总线的UDS Bootloader方案算是解了燃眉之急,特别是在奇瑞、大众这些量产项目上跑得挺稳,必须得扒一扒它的实现门道。这里0x08008000是应用程序的起始地址,取到的SP指针相当于给APP准备了全新的运行时环境。有次在奇瑞4S店现场抓到一个经典案例:刷写中途被人拔了OBD线,Bootloader居然能记住已传输的有效块,下次接着传剩余部分。特别是带启停功能的
国产芯片杰发AutoChip 基于CAN的UDS Bootloader及刷写上位机 合并文件编译等功能, 项目工程已使用奇瑞大众等项目
最近在汽车电子开发里折腾Bootloader的朋友们应该都深有体会——整车厂对刷写效率和稳定性的要求越来越变态。AutoChip这套基于CAN总线的UDS Bootloader方案算是解了燃眉之急,特别是在奇瑞、大众这些量产项目上跑得挺稳,必须得扒一扒它的实现门道。

先看Bootloader启动流程的核心跳转逻辑。芯片上电后最先执行的这段汇编特别有意思:
__asm void JumpToApplication(void)
{
LDR R0, =0x08008000 //APP起始地址
LDR SP, [R0] //初始化栈指针
LDR R1, [R0, #4] //取复位向量
BX R1
}
这里0x08008000是应用程序的起始地址,取到的SP指针相当于给APP准备了全新的运行时环境。关键点在于BX指令执行前必须关全局中断,不然跳转瞬间来个中断直接死给你看。这种底层的骚操作在量产项目中踩坑踩出来的经验,手册上可不会告诉你。
上位机用C#搞的刷写工具才是真生产力利器。特别是它的文件合并功能,直接把APP、标定数据、指纹信息打包成整车厂要求的格式:
public byte[] MergeBinFiles(List<byte[]> segments)
{
using (var memStream = new MemoryStream())
{
foreach (var seg in segments)
{
memStream.Write(seg, 0, seg.Length);
FillFFToBlock(memStream); //4K对齐填充
}
AddMetaHeader(memStream); //添加VIN校验头
return memStream.ToArray();
}
}
这种设计让产线工人不用再手动拼接多个bin文件,还能自动补FF对齐Flash块。之前见过某项目因为没做4K对齐导致刷写到90%直接卡死,现在工具层就规避了这种低级错误。

说到刷写协议,UDS的0x34、0x36、0x37服务实现里藏着魔鬼细节。比如传输块大小动态调整算法:
uint8_t CalculateBlockSize(CAN_HandleTypeDef *hcan)
{
float busLoad = GetCANBusLoad(hcan);
if(busLoad > 0.7) return 32; //总线负载高时减小块
if(CheckRetryCount() > 3) return 16; //重传次数过多降速
return 64; //默认最大块
}
这种动态调整在实车CAN网络上实测能把刷写时间缩短20%以上。特别是带启停功能的车型,必须在发动机熄火的有限时间内完成传输,动态块大小调整直接决定了能否一次刷写成功。
量产项目中最骚的还是异常处理机制。有次在奇瑞4S店现场抓到一个经典案例:刷写中途被人拔了OBD线,Bootloader居然能记住已传输的有效块,下次接着传剩余部分。这背后的断点续传功能实现起来可比普通CRC校验复杂得多:
void HandleProgramFlow(uint32_t baseAddr)
{
uint32_t storedCRC = ReadFromBackupRAM(CRC_ADDR);
uint32_t calcCRC = CalculateCRC(currentBlock);
if(storedCRC != calcCRC) {
SendNegResponse(SERVICE_36, ERR_CONDITIONS_NOT_CORRECT);
RestoreFromBackup(); //从备份区恢复上下文
} else {
ExecuteProgramFlow(); //继续执行刷写流程
}
}
这种设计相当于给刷写过程加了事务机制,遇到意外断电也不至于变砖。实测在12V电瓶亏电到9V时还能保住Flash数据,这对经常在恶劣工况下刷写的工程车来说简直是救命稻草。

现在这套方案已经迭代到支持动态差分升级,据说新版本能通过CAN总线实现ECU局部更新,这对动辄上百兆的自动驾驶域控制器来说才是真刚需。不过最让开发者爽的还是AutoChip提供的SDK里那些现成的诊断服务,不用再从头撸UDS协议栈确实省肝。
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐

所有评论(0)