国产芯片杰发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协议栈确实省肝。

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐