在工业控制领域,DSP芯片的固件升级一直是个既基础又关键的技术环节。基于TI的DSP28377D双核处理器,我们开发了一套稳定可靠的串口升级方案,这套方案经过20多个工业项目的实际验证,即使在强电磁干扰环境下也能保证升级的成功率。
这套方案的核心价值在于实现了双核协同升级,通过精心设计的IPC(Inter-Processor Communication)通信机制,确保两个核在升级过程中的完美配合。上位机采用VS2013开发,提供了直观的升级进度显示界面,整个方案稍作修改即可适配2837x系列的单核或双核升级需求。
双核通信是整个升级方案的基础,我们设计了一套简洁高效的IPC握手协议。以下是核心代码片段:
c复制// CPU1初始化IPC
IPCRegs.IPCACK.bit.IPC0 = 1; // 清标志位
IPCRegs.IPCSET.bit.IPC0 = 1; // 发信号
// CPU2响应处理
while(IPCRegs.IPCSTS.bit.IPC0 == 0); // 等待信号
UserCodeUpdateFlag = 1; // 置位升级标志
IPCRegs.IPCACK.bit.IPC0 = 1; // 握手确认
这个协议有几个关键点需要注意:
在升级过程中,双核需要同步进入关键操作阶段,特别是Flash擦写操作。我们采用"信号量+状态机"的方式实现双核同步:
我们的Bootloader设计采用经典的三阶段升级流程:
数据完整性是升级成功的关键,我们实现了高效的CRC16校验算法:
c复制uint16_t VerifyPacket(uint8_t *pData, uint32_t length)
{
uint16_t crc = 0xFFFF;
while(length--) {
crc ^= *pData++;
for(int i=0; i<8; i++)
crc = (crc & 1) ? (crc >> 1) ^ 0xA001 : crc >> 1;
}
return crc; // 返回0表示校验通过
}
这个算法有以下特点:
上位机采用VS2013开发,主要功能包括:
界面设计遵循工业控制软件的简洁实用原则,重点突出关键信息和操作按钮。
通信稳定性是串口升级的关键,我们采用"快慢结合"的波特率策略:
波特率设置代码示例:
c复制SCI_setBaudRate(mySci, DEVICE_LSPCLK_FREQ, 115200);
特别注意:必须准确配置DEVICE_LSPCLK_FREQ参数,实测偏差超过3%就会导致通信失败。
升级完成后的验证同样重要,我们的方案包含三级验证:
验证通过后,系统才会从Boot模式跳转到应用程序执行。
针对升级过程中可能出现的突然断电情况,我们在Flash最后2K空间设计了升级日志区,记录以下信息:
重新上电后,Bootloader会读取这些信息,智能判断应该继续传输还是回滚版本。
当检测到异常情况时,系统会按照以下流程处理:
通信失败:
双核不同步:
Flash写入失败:
我们开发了一个Python脚本来自动生成版本信息:
python复制import datetime
version = f"V{datetime.datetime.now().strftime('%y%m%d%H')}"
with open("version.h","w") as f:
f.write(f"#define FW_VERSION \"{version}\"")
这个脚本会生成包含日期和时间的版本号,确保每次升级都有唯一的版本标识。
这套基础方案可以根据实际需求进行多种扩展:
在实际项目中,我们曾在一个强电磁干扰环境下连续完成137次升级操作,全部成功,验证了方案的可靠性。这套代码已经开源,在Gitee平台搜索"双核DSP空中升级"即可获取完整源码。