This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[FAQ] [参考译文] 【常见问题解答】PGA900:如何将固件刷写到 PGA900/PGA970?

Guru**** 2540720 points
Other Parts Discussed in Thread: PGA970, PGA900, UNIFLASH

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/sensors-group/sensors/f/sensors-forum/1556253/faq-pga900-how-do-i-flash-firmware-to-pga900-pga970

部件号:PGA900
主题中讨论的其他部件:PGA970UNIFLASH

工具/软件:

一旦我编写了固件并准备好将其刷写到 PGA900 或 PGA970、我应该使用什么工具?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Uniflash 是 TI 用于将固件刷写到 PGA900 和 PGA970 的首选工具。

    XDS110 调试器(可在任何 MSP LaunchPad 上找到或单独购买) 是 TI 的优选调试探针。 此示例使用 XDS110。  

    1. 将调试器连接到用户的计算机。  启动 Uniflash、转至“New Configuration“、并选择以下设置。  
      1. 如果使用 PGA970、请选择 PGA970 作为所选器件。 所有其他设置保持不变。
    2. 为 PGA 供电并连接调试器。 PGA 器件必须处于运行状态才能刷写固件。  
    3. 选择“Start"</s>“
    4. 选择要加载到 PGA 器件的.out 文件
    5. 选择“Load Image“
    6. 断开调试器并根据需要开始使用 PGA 器件

    用户可以保存其会话配置设置。

    Uniflash 中的默认设置会将固件刷写到 PGA900/970 DEVRAM。 如果用户想将固件刷写到 OTP (PGA900) 或 FRAM (PGA970) 中、则必须更改.gel 文件。 在.gel 文件中、重映射函数将重映射地址设置为 0x01:

    Config_Remap()
    {
       WR_MEM_08(REMAP_ADDR,0x01);
    }
    

    如果用户想要对 OTP 或 FRAM 进行写入、则必须将其设置为 0x00。  

    1. 导航到以下文件夹: C:\ti\uniflash_9.0.0\deskdb\content\TICloudAgent\win\ccs_base\emulation\gel
      1. uniflash_9.0.0 文件夹名称可能不同、具体取决于安装的 Uniflash 版本
    2. 使用文本编辑器打开 pga900.gel 文件或 pga970.gel 文件。  
      1. 如果用户将来要写入 PGA900 或 PGA970 DEVRAM、建议复制原始的 pga900.gel 和 pga970.gel 文件、并使用其他名称进行保存。 当用户想要写入 DEVRAM 时、可以重命名修改后的.gel 文件、然后将原始.gel 文件重命名回 pga900.gel 或 pga970.gel。
    3. 如果修改 pga900.gel 文件、请将整个文本替换为以下内容
      1. //####################################################
        //PGA900 OTP GEL file
        //v1.1 March 4,2014
        //####################################################
        
        //*******************************************************************
        //Watchdog register
        //*******************************************************************
        #define WDOG_CTRL_STAT_ADDR (0x4000051C)
        
        //*******************************************************************
        //Remap register
        //*******************************************************************
        #define REMAP_ADDR (0x40000220)
        
        //*****************************************************************************
        //Read write prototype
        //*****************************************************************************
        #define WR_MEM_08(addr, data) *(unsigned char*)(addr) = (unsigned char)(data)
        #define RD_MEM_08(addr)       *(unsigned char*)(addr)
        
        //*****************************************************************************
        //Global Functions
        //*****************************************************************************
        
        //Watchdog is disabled to eliminate warm resets during debug
        Disable_Watchdog()
        {
           WR_MEM_08(WDOG_CTRL_STAT_ADDR,0x00);
        }
        
        //Set the processor to User mode after a file is loaded, on a 
        //restart or on a reset
        //This will facilitate code loading and debug by putting the processor in a known
        //state
        
        PGA900StartState()
        {
           xPSR = (xPSR & ~0x1F) | 0x10;   
        }
        
        OnFileLoaded()
        {
           GEL_TextOut("****  PGA900 OnFileLoaded .......... \n","Output",1,1,1);	
           PGA900StartState();
           Config_Remap();
           GEL_TextOut("****  PGA900 OnFileLoaded is done **** \n","Output",1,1,1);	
        }
        
        OnRestart()
        {
           GEL_TextOut("****  PGA900 OnRestart .......... \n","Output",1,1,1);	
           PGA900StartState();     
           Config_Remap();
           GEL_TextOut("****  PGA900 OnRestart is done **** \n","Output",1,1,1);	
        }
        
        OnReset()
        {
           GEL_TextOut("****  PGA900 OnReset .......... \n","Output",1,1,1);	
           PGA900StartState();
           Disable_Watchdog();
           Config_Remap();
           GEL_TextOut("****  PGA900 OnReset is done **** \n","Output",1,1,1);	
        }
        
        Config_Remap()
        {
           WR_MEM_08(REMAP_ADDR,0x00);
        }
        
        OnTargetConnect()
        {
           GEL_MapOff();
           GEL_MapReset();
           GEL_MapAddStr(0x00000000, 0, 0x00002000, "RAM|AS4", 0);  // OTP
           GEL_MapAddStr(0x21000000, 0, 0x00002000, "R|W", 0);  // Development RAM
           GEL_MapAddStr(0x20000000, 0, 0x00000400, "R|W", 0);  // SRAM Internal
           GEL_MapAddStr(0x40000000, 0, 0x00000080, "R|W", 0);  // EEPROM 
           GEL_MapAddStr(0x40000080, 0, 0x00000008, "R|W", 0);  // EEPROM Cache
           GEL_MapAddStr(0x40000088, 0, 0x00000578, "R|W", 0);  // Control and status registers
           GEL_MapAddStr(0xE000E000, 0, 0x00000F00, "R|W", 0);  // M0 registers
           GEL_MapOn();
           PGA900StartState();
           GEL_TextOut("****  PGA900 Initialization is in progress .......... \n","Output",1,1,1);	
           Disable_Watchdog();
           Config_Remap();
           GEL_TextOut("****  PGA900 Initialization is Done ****************** \n","Output",1,1,1);	
        }
        
        OnPreFileLoaded()
        {
            GEL_TextOut("**** PGA900 OnPreFileLoaded .......... \n","Output",1,1,1);
            Config_Remap();
            GEL_TextOut("**** PGA900 OnPreFileLoaded is done **** \n","Output",1,1,1);
        }
    4. 对于 PGA970、将整个文本替换为以下内容:
      1. //####################################################
        //PGA970 FRAM GEL file
        //v1.0 May 15,2015
        //####################################################
        
        //*******************************************************************
        //Watchdog register
        //*******************************************************************
        #define WDOG_CTRL_STAT_ADDR (0x4000051C)
        //*******************************************************************
        //Remap register
        //*******************************************************************
        #define REMAP_ADDR (0x40000220)
        
        //*****************************************************************************
        //Read write prototype
        //*****************************************************************************
        #define WR_MEM_08(addr, data) *(unsigned char*)(addr) = (unsigned char)(data)
        #define RD_MEM_08(addr)       *(unsigned char*)(addr)
        
        //*****************************************************************************
        //Global Functions
        //*****************************************************************************
        
        //Watchdog is disabled to eliminate warm resets during debug
        Disable_Watchdog()
        {
           WR_MEM_08(WDOG_CTRL_STAT_ADDR,0x00);
        }
        
        Config_Remap()
        {
           WR_MEM_08(REMAP_ADDR,0x00);
        }
        //Set the processor to User mode after a file is loaded, on a 
        //restart or on a reset
        //This will facilitate code loading and debug by putting the processor in a known
        //state
        
        PGA970StartState()
        {
           xPSR = (xPSR & ~0x1F) | 0x10;   
        }
        
        OnFileLoaded()
        {
           GEL_TextOut("****  PGA970 OnFileLoaded .......... \n","Output",1,1,1);	
           PGA970StartState();
           Config_Remap();
           GEL_TextOut("****  PGA970 OnFileLoaded is done **** \n","Output",1,1,1);	
        }
        
        OnRestart()
        {
           GEL_TextOut("****  PGA970 OnRestart .......... \n","Output",1,1,1);	
           PGA970StartState();     
           Config_Remap();
           GEL_TextOut("****  PGA970 OnRestart is done **** \n","Output",1,1,1);	
        }
        
        OnReset()
        {
           GEL_TextOut("****  PGA970 OnReset .......... \n","Output",1,1,1);	
           PGA970StartState();
           Disable_Watchdog();
           Config_Remap();
           GEL_TextOut("****  PGA970 OnReset is done **** \n","Output",1,1,1);	
        }
        
        
        OnTargetConnect()
        {
           GEL_MapOff();
           GEL_MapReset();
           GEL_MapAddStr(0x00000000, 0, 0x00004000, "R|W", 0);  // FRAM_TEXT
           GEL_MapAddStr(0x21000000, 0, 0x00004000, "R|W", 0);  // Development RAM
           GEL_MapAddStr(0x20000000, 0, 0x00000800, "R|W", 0);  // SRAM Internal
           GEL_MapAddStr(0x20000800, 0, 0x00000200, "R|W", 0);  // Waveform RAM
           GEL_MapAddStr(0x40000000, 0, 0x000005E7, "R|W", 0);  // Control and status registers
           GEL_MapAddStr(0xE000E000, 0, 0x00000F00, "R|W", 0);  // M0 registers
           GEL_MapOn();
           PGA970StartState();
           GEL_TextOut("****  PGA970 Initialization is in progress .......... \n","Output",1,1,1);	
           Disable_Watchdog();
           Config_Remap();
           GEL_TextOut("****  PGA970 Initialization is Done ****************** \n","Output",1,1,1);	
        }
    5. Uniflash 将查找 pga900.gel 或 pga970.gel 文件并将固件加载到正确的地址。