我用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。问题在这里。