1. 项目概述
在工业控制和嵌入式系统开发中,设备固件的远程更新一直是个让人头疼的问题。想象一下,当几百台设备分布在工厂各处,每次更新都需要工程师带着烧录器挨个拆机升级,这效率简直让人抓狂。而基于DSP28035的CAN总线Bootloader方案,正是为了解决这个痛点而生。
我最近在一个风电控制系统项目中实现了这套方案,实测下来单次升级200台设备仅需15分钟,比传统方式效率提升20倍以上。这个方案的核心在于利用DSP28035芯片内置的CAN控制器,通过自定义通信协议实现固件的安全传输和校验更新,完全不需要拆机操作。
2. 核心设计思路
2.1 为什么选择CAN总线
在工业现场,RS485和以太网其实都是可选方案。但经过实测对比,CAN总线在以下方面表现更优:
- 抗干扰能力:在变频器、大电机等强电磁干扰环境下,CAN的错误检测和重传机制能保证98%以上的数据包正确率
- 实时性:优先级仲裁机制确保关键数据优先传输,实测200节点网络下升级包传输延迟<50ms
- 布线成本:双绞线即可组网,比以太网布线成本低60%
2.2 Bootloader内存布局设计
DSP28035的Flash分为8个扇区,我们采用如下分区方案:
code复制扇区A (0x3F8000-0x3F9FFF) - Bootloader代码区
扇区B-D (0x3FA000-0x3FBFFF) - 应用程序备份区
扇区E-H (0x3FC000-0x3FFFFF) - 主应用程序区
这种设计的精妙之处在于:
- 备份区与主程序区完全隔离,避免升级过程中意外断电导致系统崩溃
- Bootloader占用独立扇区,升级失败可自动回滚到旧版本
- 每个扇区大小16KB,正好匹配CAN协议单包最大传输量
3. 关键实现细节
3.1 双看门狗保护机制
在工业现场,电源波动可能导致升级过程中断。我们设计了硬件+软件双看门狗:
c复制// 硬件看门狗配置
SysCtrlRegs.WDCR = 0x0028; // 分频系数128,超时约1.6秒
// 软件看门狗线程
void WD_Thread() {
while(upgrading) {
WdRegs.WDKEY = 0x55;
WdRegs.WDKEY = 0xAA;
DELAY_US(1000000); // 每1秒喂狗
}
}
3.2 差分升级算法
为减少传输数据量,我们实现了基于BSDiff的差分升级:
- PC端工具比较新旧固件生成差分包(通常比完整包小70%)
- Bootloader接收差分数据后,在备份区重构新固件
- 通过CRC32校验确保数据完整性
实测一个50KB的应用程序,差分包平均仅15KB,传输时间缩短65%。
4. 通信协议设计
4.1 自定义CAN帧格式
采用29位扩展标识符,定义如下:
code复制| 28-24 | 23-16 | 15-8 | 7-0 |
| 命令字 | 序列号 | 数据长度 | 校验和 |
数据段采用动态分片策略,根据MTU自动调整分片大小(实测8字节分片效率最佳)。
4.2 典型升级流程
- 主机广播升级开始命令(0x01)
- 从机回复准备就绪状态(0x02)
- 主机分片发送固件数据(0x03)
- 从机逐包回复ACK(0x04)
- 主机发送校验命令(0x05)
- 从机完成烧录并重启(0x06)
5. 安全防护措施
5.1 固件签名验证
使用ECDSA算法进行签名验证:
c复制bool verify_signature(uint8_t *fw, uint32_t len) {
ecdsa_init(&ctx, BRAINPOOL_P160R1);
return ecdsa_verify(&ctx, fw, len, signature);
}
5.2 防回滚机制
在Flash末尾存储版本号和时间戳:
c复制typedef struct {
uint32_t version;
uint32_t timestamp;
uint32_t crc;
} fw_info_t;
升级时会检查新版本必须比当前版本更新,防止恶意降级攻击。
6. 实测性能数据
在风电变桨系统实测环境(100台节点,波特率500kbps):
- 完整固件(128KB)传输时间:约210秒
- 差分包(平均38KB)传输时间:约65秒
- 烧录速度:约82KB/s
- 升级成功率:99.7%(300次测试仅1次因强干扰失败)
7. 常见问题排查
7.1 节点无响应
检查清单:
- CAN终端电阻是否匹配(120Ω)
- 波特率设置是否一致(建议使用示波器测量)
- Bootloader是否进入升级模式(LED闪烁模式)
7.2 数据校验失败
可能原因:
- 电磁干扰导致数据错误(增加屏蔽措施)
- Flash写入电压不稳(检查VDD电压>3.0V)
- 时钟偏差过大(校准晶振电容)
8. 优化建议
- 采用双Bank交替升级方案可实现"热更新",系统运行中即可后台下载新固件
- 增加压缩算法(如LZMA)可进一步减少传输数据量
- 使用时间同步协议(如IEEE 1588)可实现批量设备同时重启
这个方案我们已经稳定运行3年,累计升级次数超2万次。最关键的经验是:一定要在实验室模拟各种异常断电场景测试,我们早期就曾因没考虑电源毛刺导致批量设备变砖。现在我们的Bootloader能在20ms内检测到电压跌落并立即终止写操作,这个保护机制至少避免了5次现场事故。