TMS320F28377S: 我用tms320f28377s做flash固件升级相关问题

Part Number: TMS320F28377S

我用tms320f28377s做flash固件升级,cmd文件中(BEGIN            : origin = 0x080000, length = 0x000002),BEGIN占用了FLASHA的前两个字节,那我更新程序的时候,可以把FLASHA全部擦除吗?有没有tms320f28377s做flash固件升级的参考代码?

  • 否,擦除FLASHA时必须保留bank选择逻辑。
    对于固件更新,F2837xD没有示例实现。一个很好的起点是F2837xD的SCI闪存内核示例,并使用F28004x等其他设备的固件更新实现。

     Serial Flash Programming of C2000 MicrocontrollersLive Firmware Update with Device Reset on C2000 MCUs (Rev. A), and Live Firmware Update Without Device Reset on C2000 MCUs (Rev. B) 都是有用的应用程序说明。

  • 如果FLASHA无法完全擦除的话,我的代码只能从FLASHB开始?还有其他的方案吗?

  • 您可以擦除 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)进行此次更新,对吗?