1. DSP28035 Bootloader CAN在线升级方案解析
在工业控制和嵌入式系统开发中,固件升级是一个永恒的话题。传统方式需要拆机、连接JTAG等繁琐操作,而基于CAN总线的在线升级方案正在改变这一局面。以TI的TMS320F28035 DSP为例,其Bootloader CAN升级方案为工程师提供了更高效的固件维护途径。
这个方案的核心价值在于:
- 支持多种通信接口(CAN/UART/SPI/TCP)
- 完整的Hex文件解析机制
- 灵活的内存空间分配策略
- 可定制的通信协议栈
- 配套的上位机工具链
提示:选择CAN总线作为升级通道时,建议优先考虑250kbps-1Mbps的通信速率,这个范围在工业环境中能兼顾稳定性和传输效率。
2. 系统架构设计要点
2.1 双区存储设计原理
可靠的Bootloader必须采用A/B双区设计:
- 活动区:运行当前有效固件
- 备份区:存储待升级固件
- 状态标志区:记录系统状态
这种设计的关键在于状态机的实现:
c复制typedef enum {
STATE_ACTIVE = 0x55AA,
STATE_UPDATING = 0xAA55,
STATE_ROLLBACK = 0x5A5A
} FirmwareState;
2.2 通信协议栈设计
CAN协议帧需要特殊设计以应对大数据量传输:
- 帧ID分配:
- 0x180:命令帧(上位机→DSP)
- 0x181:数据帧(上位机→DSP)
- 0x280:响应帧(DSP→上位机)
典型的数据包结构:
code复制| 包头(2B) | 包序号(2B) | 数据长度(1B) | 数据(0-8B) | CRC(2B) |
3. 关键实现技术详解
3.1 CAN模块初始化实战
初始化代码需要特别注意时序控制:
c复制void CAN_Init(uint32_t baudrate)
{
EALLOW;
// 1. 进入初始化模式
CanaRegs.CANMC.bit.STM = 1; // 自测试模式
CanaRegs.CANMC.bit.ABO = 1; // 自动总线恢复
// 2. 配置位定时参数
uint16_t brp = LSPCLK_FREQ / (baudrate * 16) - 1;
CanaRegs.CANBTC.bit.BRP = brp;
CanaRegs.CANBTC.bit.TSEG1 = 12; // 时间段1
CanaRegs.CANBTC.bit.TSEG2 = 3; // 时间段2
CanaRegs.CANBTC.bit.SJW = 2; // 同步跳转宽度
// 3. 退出初始化模式
CanaRegs.CANMC.bit.CCR = 0;
while(CanaRegs.CANES.bit.CCE);
EDIS;
}
注意:配置CANBTC寄存器时,必须确保TSEG1 ≥ TSEG2 ≥ SJW,否则会导致通信异常。
3.2 Hex文件解析引擎
Hex文件解析需要处理多种记录类型:
- :02000004 -> 扩展线性地址
- :10 -> 数据记录
- :00 -> 结束记录
解析算法流程:
- 校验记录头(':')
- 提取记录长度
- 解析记录类型
- 计算校验和
- 地址重组(处理04类型记录)
- 数据缓存管理
4. 内存空间规划策略
4.1 CMD文件配置要点
典型的F28035内存分配示例:
code复制MEMORY
{
BOOT_RSVD : origin = 0x000000, length = 0x000050
RAMM0 : origin = 0x000050, length = 0x0003B0
FLASHH : origin = 0x3F8000, length = 0x007F80
}
SECTIONS
{
.bootloader: > BOOT_RSVD
.text : > FLASHH
.cinit : > FLASHH
.stack : > RAMM0
}
4.2 安全校验机制
必须实现三级校验保障:
- 传输层CRC16校验
- 镜像头部特征校验(如0x55AA)
- 完整固件SHA-1校验
校验失败处理流程:
code复制if(VerifyFailed) {
LED_ErrorPattern(3);
Watchdog_Reset();
}
5. 上位机开发注意事项
5.1 通信超时处理
建议采用分层超时策略:
- 字节级超时:100ms
- 帧级超时:500ms
- 操作级超时:10s
5.2 进度反馈设计
良好的用户体验需要包含:
- 当前进度百分比
- 传输速率显示
- 错误代码提示
- 日志记录功能
6. 现场问题排查指南
常见问题及解决方案:
| 现象 | 可能原因 | 排查方法 |
|---|---|---|
| CAN无响应 | 波特率不匹配 | 用示波器测量波形 |
| 升级中途失败 | 电源干扰 | 增加去耦电容 |
| 校验失败 | 内存冲突 | 检查CMD文件配置 |
| 无法跳转 | 中断未关闭 | 添加__disable_irq() |
7. 性能优化技巧
- 采用DMA传输CAN数据:
c复制void ConfigDMAForCAN(void)
{
DmaRegs.CH1.CONTROL.bit.PERINTE = 1; // 外设中断使能
DmaRegs.CH1.MODE.bit.PERINTSEL = 8; // CAN-A接收
DmaRegs.CH1.MODE.bit.ONESHOT = 1; // 单次触发
}
- 压缩传输算法优化:
- 使用LZ77算法压缩固件
- 上位机预压缩,Bootloader解压
- 典型压缩率可达30-50%
- 差分升级策略:
- 仅传输差异部分
- 需要配合版本管理系统
- 可减少90%以上传输量
在实际项目中,我发现电源稳定性对CAN升级成功率影响很大。建议在关键节点增加47μF钽电容和0.1μF陶瓷电容组合。另外,升级前务必关闭所有中断,这个细节很容易被忽视但至关重要。