目标板:C2000的28335/28069
一、主要思路:
1、准备升级程序(相当于一个bootloader),作为上电首先运行的程序。进入升级程序,首先判断需不需要升级,需要升级,进入升级状态,通信完成新的主程序的接收,存入,升级成功后,进入主程序运行。
2、在主程序运行时,收到升级指令,标记升级标志,重启进入升级程序进去升级。
3、板子上电后,会调到flash启动的起始地址0x33FFF6(DSP28335),这个地址存放着程序的codestart的其实地址。所以,修改了0x33FFF6的存放的值,那么就能决定执行那一段程序。还可以通过汇编跳转指令直接跳转到程序codestart执行。
二、升级程序
1、具备能力:具备通信能力和Flash读写能力
2、准备:Flash API移植、上位机的升级配套程序;存储升级标志位的空间(外部EEPROM,不会随便擦除的内部Flash)
3、流程:接收->校验->烧写->跳转
三、升级步骤
1、数据
接收
:通过CAN/串口等方式接收数据。由于28335内存较小,不适合缓存大量的数据,这里是接收一部分数据,校验完成后烧写进Flash,再去接收一部分数据
2、数据解析:接收到的数据是hex格式的数据,所以需要解析才能放入对应的flash地址。但由于28335能力限制,这里采用先在上位机解析完成,采用先告知地址,然后发送数据的方式完成数据通信和传输。
3、校验:这里采用crc校验。
/******************************************************
*Name : crc16
*Function: crc校验16位
*Params : data(UInt8 *):待操作的数组 len:数据长度
*Return : UInt16:返回CRC值 CRC校验码为2个字节高位在前
*******************************************************/
UInt16 crc16(Uint8 *data, UInt16 len)
{
UInt16 CRC = 0xFFFF;
UInt8 j, TMP = 0;
UInt8 i;
for (i = 0; i < len; i++)
{
CRC ^= data[i];
for (j = 0; j < 8; j++)
{
TMP = CRC & 0x0001;
CRC = CRC >> 1;
if(TMP)
CRC = CRC ^ 0xA001;
}
}
return CRC;
}
4、数据烧写flash:运用flash API提供的接收完成数据的烧写。这里要注意flash API必须运行在RAM中。