我用tms320f28377s做flash固件升级,cmd文件中(BEGIN : origin = 0x080000, length = 0x000002),BEGIN占用了FLASHA的前两个字节,那我更新程序的时候,可以把FLASHA全部擦除吗?有没有tms320f28377s做flash固件升级的参考代码?
我用tms320f28377s做flash固件升级,cmd文件中(BEGIN : origin = 0x080000, length = 0x000002),BEGIN占用了FLASHA的前两个字节,那我更新程序的时候,可以把FLASHA全部擦除吗?有没有tms320f28377s做flash固件升级的参考代码?
否,擦除FLASHA时必须保留bank选择逻辑。
对于固件更新,F2837xD没有示例实现。一个很好的起点是F2837xD的SCI闪存内核示例,并使用F28004x等其他设备的固件更新实现。
Serial Flash Programming of C2000 Microcontrollers, Live Firmware Update with Device Reset on C2000 MCUs (Rev. A), and Live Firmware Update Without Device Reset on C2000 MCUs (Rev. B) 都是有用的应用程序说明。
您可以擦除 A 区所有的闪存,但保留bank选择逻辑。这在 LFU 应用说明中有讨论。本质上,您的闪存将如下所示:

在更新固件时,您erase sectors 2+ 使用 the Fapi_issueAsyncCommandWithAddress(Fapi_EraseSector, ...) 命令.
#define Bzero_SectorA_start 0x80000
Uint16 backupBeginData; // 用于在RAM中备份BEGIN数据
Uint16 *beginAddress = (Uint16 *)0x080000; // BEGIN区域的起始地址
// 1. 备份BEGIN区域的数据
backupBeginData = *beginAddress; // 读取2字节数据
PUMPREQUEST = 0x5A5A0002;
oReturnCheck = Fapi_initializeAPI(F021_CPU0_W0_BASE_ADDRESS, 200);
if(oReturnCheck != Fapi_Status_Success)
{
Example_Error(oReturnCheck);
}
oReturnCheck = Fapi_setActiveFlashBank(Fapi_FlashBank0);
if(oReturnCheck != Fapi_Status_Success)
{
Example_Error(oReturnCheck);
}
oReturnCheck = Fapi_issueAsyncCommandWithAddress(Fapi_EraseSector,(uint32 *)Bzero_SectorA_start);
while(Fapi_checkFsmForReady() != Fapi_Status_FsmReady){}
oReturnCheck = Fapi_doBlankCheck((uint32 *)Bzero_SectorA_start, Bzero_16KSector_u32length,&oFlashStatusWord);
if(oReturnCheck != Fapi_Status_Success)
{
Example_Error(oReturnCheck);
}
oReturnCheck = Fapi_issueProgrammingCommand((uint32 *)Bzero_SectorA_start,&backupBeginData , 2,0,0,Fapi_AutoEccGeneration);
while(Fapi_checkFsmForReady() == Fapi_Status_FsmBusy);
if(oReturnCheck != Fapi_Status_Success)
{
Example_Error(oReturnCheck);
}
oFlashStatus = Fapi_getFsmStatus();
oReturnCheck = Fapi_doVerify((uint32 *)Bzero_SectorA_start,2,&backupBeginData,&oFlashStatusWord);
if(oReturnCheck != Fapi_Status_Success)
{
Example_Error(oReturnCheck);
} 这是我的代码,采用了通过“先备份,再擦除,后恢复”的策略,擦除FLASHA扇区同时保留BEGIN区域的引导代码,麻烦帮忙看看是否可行?
在此情况下,您仍需重新编程存储区选择逻辑和SCI引导加载程序。此外,若编程过程中出现错误,设备将无法正常工作,因为缺少存储区选择逻辑,它将无法确定应启动哪个固件。
由于存储区选择逻辑和引导加载程序永远不会更改,因此您可以跳过擦除前两个扇区的步骤,即只需将它们一次性加载到设备中。随后,SCI引导加载程序将擦除分配给应用程序的所有闪存区域并重新编程。有关详细信息,请参阅应用笔记的第4节。
为明确起见,您是想通过外设(例如SCI)进行此次更新,对吗?
我的固件更新流程是这样的,我们自己写的上位机,上位机通过串口SCI发送固件程序给dsp28377s,dsp28377s的固件更新程序是加载到ram里面运行的,上位机发送过来256个字节,就往flash里面写入256个字节,上位机一包一包的发,直到所有固件程序写入完成,然后复位,程序运行。之前是在dsp28335芯片上运行,一直都很稳定,我现在把这块的程序移植到dsp28377s上。但是dsp28335的flash地址从0x300000开始,不和BEGIN : origin = 0x33FFF6, length = 0x000002,冲突。dsp28377s就会和(BEGIN : origin = 0x080000, length = 0x000002)冲突了。因为dsp28377sflash起始地址是0x080000。问题在这里。
您是在尝试执行现场固件更新,还是在使用基于RAM的闪存内核的SCI启动模式?如果使用SCI启动模式,为何需要进行A/B切换?
但是dsp28335的flash地址从0x300000开始,不和BEGIN : origin = 0x33FFF6, length = 0x000002,冲突。dsp28377s就会和(BEGIN : origin = 0x080000, length = 0x000002)冲突了。因为dsp28377sflash起始地址是0x080000。问题在这里。
你能对此稍作详细说明吗?
我的固件更新程序和内核没关系,这么说吧,相当于单片机写了一个bootloader,然后自己写了一个上位机,自己定的协议,把固件程序通过sci串口发给单片机,然后单片机的bootloader把固件程序写入flash,现在我用dsp28335(之前的代码是28335,现在移植到28377s)这个bootloader程序直接在ram里面运行,只要不掉电,这个booloader就一直在运行,只要上位机发送固件过去就能对固件升级。(stm32单片机很多用这种iap方式升级)。我升级的过程中就存在一个问题,就是擦除flash,dsp28335的flash地址从0x300000开始,我擦除的时候直接从0x300000这个地址擦除就可以了,但是dsp28377s,擦除的时候它不能从0x080000,因为BEGIN origin = 0x080000, length = 0x000002)占用了两个字节,这就导致,本来我直接套用原来的程序一包是256字节,可以顺利移植升级程序,但是现在不行。