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.

[参考译文] TM4C1297NCZAD:将 TM4C1297nczadi3用作 USB 主机-通过从 USB 存储器读取二进制文件进行固件更新

Guru**** 1565925 points
Other Parts Discussed in Thread: EK-TM4C129EXL, EK-TM4C1294XL, TM4C1297NCZAD
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1375759/tm4c1297nczad-tm4c1297nczadi3-as-a-usb-host---firmware-update-via-read-a-binary-file-from-a-usb-memory

器件型号:TM4C1297NCZAD
主题中讨论的其他器件:EK-TM4C1294XL、EK-TM4C129EXL、

工具与软件:

我正在尝试使用 TivaWare_C_Series-2.2.0.295\examples\boards\dk-tm4c129x\usb_tick_update 中的示例通过 USB 存储器开始进行固件更新、但我没有成功。  

我没有检测到/枚举器件、它 始终显示 STATE_NO_DEVICE。

谢谢

        case MSC_EVENT_CLOSE:
        {
            //
            // Go back to the "no device" state and wait for a new connection.
            //
            g_eState = STATE_NO_DEVICE;
            break;
        }

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

    您好!

    [报价 userid="610603" url="~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1375759/tm4c1297nczad-tm4c1297nczadi3-as-a-usb-host---firmware-update-via-read-a-binary-file-from-a-usb-memory "]我尝试使用 TivaWare_C_Series-2.2.0.295\examples\boards\dk-tm4c129x\usb_tick_update、中的示例通过 USB 存储器开始进行固件更新

    您提到的示例适用于不再销售的 DK-TM4C129 EVM 板。 如果您有 LaunchPad (EK-TM4C1294XL) 、请尝试 C:\ti\TivaWare_C_Series-2.2.0.295\examples\boards\ek-tm4c1294xl\usb_tick_update 中的相同示例。 如果您可以让其在 LaunchPad 上工作、那么您可以比较 LaunchPad 和您的定制板之间的差异。  

    请浏览示例说明。 如说明中所示、USB_STICK_UPDATE 在三种条件下 会从 USB 记忆棒加载新固件。 该示例假设 APP_START_ADDRESS 为0x8000。 USB 记忆棒上的固件必须链接并分配给0x8000。 固件文件名必须为固件。 BIN 和 USB 记忆棒需要是 FA16或 FAT32文件系统。  您可以参考位于 C:\ti\TivaWare_C_Series-2.2.0.295\examples\boards\ek-tm4c1294xl\usb_tick_demo 的示例固件、并从  usb_stick_demo.bin 重命名为 firmware.bin 。  

    USB 记忆棒更新程序

    此示例应用程序的行为方式与引导加载程序相同。 它驻留
    并且将从 USB 存储器中读取二进制文件
    将其粘贴到闪存中的另一个位置、然后编程到闪存中。 密码
    应用程序已编程到闪存中、此程序将始终启动
    用户应用程序、直至有请求加载新应用程序。

    如果已有用户应用程序、则在启动此应用程序时执行
    Flash (位于\b app_start_address)、然后它将只运行用户应用程序。
    它将尝试从下面的 USB 记忆棒加载新的应用
    以下条件:

    -在\b app_start_address 中不存在任何用户应用程序
    -用户应用程序已通过转移控制请求更新
    更新程序
    -用户在板复位时按住 USER_SW1按钮

    当该应用程序尝试执行更新时、它将等待
    永远插入 USB 记忆棒。 一次插入 USB 记忆棒
    找到时、它将在根目录中搜索特定的文件名、即
    是\e 固件。 Bin 而变化。 此文件必须是的二进制映像
    要加载的程序(.bin 文件)、链接到从正确的源运行
    地址、位于\b app_start_address。

    USB 记忆棒必须格式化为 FAT16或 FAT32文件系统
    (正常情况下)、并且二进制文件必须位于根目录中
    目录。 记忆棒上可能存在其他文件、但它们会存在
    已忽略。

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

    客户电路板具有 TM4C1297NCZADI3微控制器。 此客户电路板具有一个 USB Type-A 母连接器。

    1. 我是否可以C:\ti\TivaWare_C_Series-2.2.0.295\examples\boards\ek-tm4c1294xl\usb_stick_update针对此特定微控制器 TM4C1297NCZADI3实施中的示例、是否有其他类型的电路板、如 dk-tm4c129x、ek-tm4c129exl 和 ek-tm4c1294xl?  以下哪个示例与该客户电路板上的该微控制器更兼容?

      #define PROG_LEN (FLASH_SIZE - 0x20000) 
      #define DATA_LEN  0x2000
      #define USB_STICK_UPDATE_ADDRESS      0x00000000  //USB stick update
      #define APP_START_ADDRESS             0x8000      //My Application
      
      MEMORY
      {
          /* Application stored in and executes from internal flash */
          PROG_FLASH (RX) : origin = APP_START_ADDRESS, length = PROG_LEN
      
          DATA_FLASH (RWX) : origin = USB_STICK_UPDATE_ADDRESS, length = DATA_LEN
          /* Application uses internal RAM for data */
          SRAM (RWX) : origin = 0x20000000, length = 0x00060000 /*0x00040000*/
      }
      
      /* Section allocation in memory */
      
      SECTIONS
      {
          .intvecs:   > APP_BASE
          .text   :   > PROG_FLASH
          .const  :   > PROG_FLASH
          .cinit  :   > PROG_FLASH
          .pinit  :   > PROG_FLASH
          .binit	:	> PROG_FLASH
          .init_array : > PROG_FLASH
      
          .vtable :   > RAM_BASE
          .data   :   > SRAM
          .bss    :   > SRAM
          .sysmem :   > SRAM
          .stack  :   > SRAM
          .TI.ramfunc : {} load=PROG_FLASH, run=SRAM, table(BINIT)
      }

    2. 是否有必要APP_START_ADDRESS如代码中所示修改0x8000?

    3. 客户电路板具有用于 USB 的引脚:USB0DP、USB0DM、USB0VBUS、但 USB0ID (已断开连接)。 我怀疑如果断开连接、我是否可以使用 USB0ID。 我能在内部控制它吗? 我使用 USB 的目的是通过 USB Type-A 记忆棒更新固件、因此我知道应该将其配置为主机。 能否向我提供一个示例、说明我如何执行该操作?  

    此外、我看到  USB 器件的数据表不完整。 这里没有关于如何配置寄存器的信息。 在哪里可以找到 Tiva TM4C1297NCZAD 微控制器的 USB 信息?

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

    您好!

    [报价 userid="610603" url="~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1375759/tm4c1297nczad-tm4c1297nczadi3-as-a-usb-host---firmware-update-via-read-a-binary-file-from-a-usb-memory/5260577 #5260577"]我能否C:\ti\TivaWare_C_Series-2.2.0.295\examples\boards\ek-tm4c1294xl\usb_stick_update针对此特定微控制器 TM4C1297NCZADI3实施中的示例、是否有其他类型的电路板、如 dk-tm4c129x、ek-tm4c129exl 和 ek-tm4c1294xl?  以下哪些示例与该客户电路板上的该微控制器更兼容?[/QUOT]

    如果您使用的定制电路板上有 TM4C1297NCZAD、则可以参考  TivaWare_C_Series-2.2.0.295\examples\boards\dk-tm4c129x\usb_tick_update。 请注意、usb_stick_update 更像是位于0x0的引导加载程序。 您无需修改 USB_STICK_UPDATE 的.cmd 文件。 APP_BASE 在.cmd 文件中将为0x00000000。 您需要指定应用程序固件在引导加载程序源代码中的位置。 查看第120行的 usb_stick_update.c 文件、其中假设#define APP_START_ADDRESS 等于0x8000。 您可以将该地址修改为1024字节的倍数的其他地址。 引导加载程序(USB_STICK_DATE)本身必须位于0x0。   

    请不要混淆已在 usb_stick_updart.cmd 文件中的 app_BASE 和在 usb_stick_updarte.c 文件中的 app_start_address。  

    [报价 userid="610603" url="~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1375759/tm4c1297nczad-tm4c1297nczadi3-as-a-usb-host---firmware-update-via-read-a-binary-file-from-a-usb-memory/5260577 #5260577"]
    • 是否有必要APP_START_ADDRESS如代码中所示修改0x8000?

    [报价]

     

    您还需要使用应用程序固件。 如我所述、有一个示例应用 、位于 C:\ti\TivaWare_C_Series-2.2.0.295\examples\boards\dk-tm4c129x\usb_tick_demo。 查看 C:\ti\TivaWare_C_Series-2.2.0.295\examples\boards\dk-tm4c129x\usb_stick_demo\usb_tick_demo_ccs.cmd 内的命令文件。 APP_BASE 设置为0x8000的就是该文件。 请参阅下面的片段。

    /* The starting address of the application. Normally the interrupt vectors */
    /* must be located at the beginning of the application. */
    #define APP_BASE 0x00008000
    #define RAM_BASE 0x20000000

    /* System memory map */

    MEMORY
    {
    /* Application stored in and executes from internal flash */
    FLASH (RX) : origin = APP_BASE, length = 0x000f8000
    /* Application uses internal RAM for data */
    SRAM (RWX) : origin = 0x20000000, length = 0x00040000
    }

    [报价 userid="610603" url="~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1375759/tm4c1297nczad-tm4c1297nczadi3-as-a-usb-host---firmware-update-via-read-a-binary-file-from-a-usb-memory/5260577 #5260577"]
    1. 客户电路板具有用于 USB 的引脚:USB0DP、USB0DM、USB0VBUS、但 USB0ID (已断开连接)。 我怀疑如果断开连接、我是否可以使用 USB0ID。 我能在内部控制它吗? 我使用 USB 的目的是通过 USB Type-A 记忆棒更新固件、因此我知道应该将其配置为主机。 能否向我提供一个示例、说明我如何执行该操作?  

    [报价]

    我觉得不需要 VBUSID 来运行 usb_stick_update。

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

    只是想告诉你、我在 DK-TM4C129x 板上运行 usb_stick_update、下载成功加载 usb_stick_demo 程序。 如果您有 DK 板、我建议您按原样运行它以获得使用体验。 如果您没有 DK 板、这就是为什么我首先建议您通过运行  C:\ti\TivaWare_C_Series-2.2.0.295\examples\boards\ek-tm4c1294xl\usb_tick_update 在 EK-TM4C1294XL LaunchPad 板上运行的原因。

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

    尊敬的 Charles:

    想知道 USB 更新程序是否具有闪存擦除功能、或者用户是否必须在每次需要更新时手动擦除闪存组?  

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

    您好、BP101:

     是的、更新程序具有闪存擦除/编程功能。 请参阅以下 usb_stick_update.c 文件中的函数。  

    //*****************************************************************************
    //
    // Read the application image from the file system and program it into flash.
    //
    // This function will attempt to open and read the firmware image file from
    // the mass storage device.  If the file is found it will be programmed into
    // flash.  The name of the file to be read is configured by the macro
    // \b USB_UPDATE_FILENAME.  It will be programmed into flash starting at the
    // address specified by APP_START_ADDRESS.
    //
    // \return Zero if successful or non-zero if the file cannot be read or
    // programmed.
    //
    //*****************************************************************************
    uint32_t
    ReadAppAndProgram(void)
    {
        uint_fast32_t ui32FlashEnd;
        uint_fast32_t ui32FileSize;
        uint_fast32_t ui32DataSize;
        uint_fast32_t ui32Remaining;
        uint_fast32_t ui32ProgAddr;
        uint_fast32_t ui32SavedRegs[2];
        volatile uint_fast32_t ui32Idx;
        uint_fast32_t ui32DriveTimeout;
    
        //
        // Initialize the drive timeout.
        //
        ui32DriveTimeout = USBMSC_DRIVE_RETRY;
    
        //
        // Check to see if the mass storage device is ready.  Some large drives
        // take a while to be ready, so retry until they are ready.
        //
        while(USBHMSCDriveReady(g_psMSCInstance))
        {
            //
            // Wait about 500ms before attempting to check if the
            // device is ready again.
            //
            SysCtlDelay(g_ui32SysClock/(3*2));
    
            //
            // Decrement the retry count.
            //
            ui32DriveTimeout--;
    
            //
            // If the timeout is hit then return with a failure.
            //
            if(ui32DriveTimeout == 0)
            {
                return(1);
            }
        }
    
        //
        // Initialize the file system and return if error.
        //
        if(SimpleFsInit(g_ui8SectorBuf))
        {
            return(1);
        }
    
        //
        // Attempt to open the firmware file, retrieving the file/image size.
        // A file size of error means the file was not there, or there was an
        // error.
        //
        ui32FileSize = SimpleFsOpen(USB_UPDATE_FILENAME);
        if(ui32FileSize == 0)
        {
            return(1);
        }
    
        //
        // Get the size of flash.  This is the ending address of the flash.
        // If reserved space is configured, then the ending address is reduced
        // by the amount of the reserved block.
        //
        ui32FlashEnd = FLASH_SIZE;
    #ifdef FLASH_RSVD_SPACE
        ui32FlashEnd -= FLASH_RSVD_SPACE;
    #endif
    
        //
        // If flash code protection is not used, then change the ending address
        // to be the ending of the application image.  This will be the highest
        // flash page that will be erased and so only the necessary pages will
        // be erased.  If flash code protection is enabled, then all of the
        // application area pages will be erased.
        //
    #ifndef FLASH_CODE_PROTECTION
        ui32FlashEnd = ui32FileSize + APP_START_ADDRESS;
    #endif
    
        //
        // Check to make sure the file size is not too large to fit in the flash.
        // If it is too large, then return an error.
        //
        if((ui32FileSize + APP_START_ADDRESS) > ui32FlashEnd)
        {
            return(1);
        }
    
        //
        // Enter a loop to erase all the requested flash pages beginning at the
        // application start address (above the USB stick updater).
        //
        for(ui32Idx = APP_START_ADDRESS; ui32Idx < ui32FlashEnd; ui32Idx += 1024)
        {
            ROM_FlashErase(ui32Idx);
        }
    
        //
        // Enter a loop to read sectors from the application image file and
        // program into flash.  Start at the user app start address (above the USB
        // stick updater).
        //
        ui32ProgAddr = APP_START_ADDRESS;
        ui32Remaining = ui32FileSize;
        while(SimpleFsReadFileSector())
        {
            //
            // Compute how much data was read from this sector and adjust the
            // remaining amount.
            //
            ui32DataSize = ui32Remaining >= 512 ? 512 : ui32Remaining;
            ui32Remaining -= ui32DataSize;
    
            //
            // Special handling for the first block of the application.
            // This block contains as the first two location the application's
            // initial stack pointer and instruction pointer.  The USB updater
            // relied on the values in these locations to determine if a valid
            // application is present.  When there is a valid application the
            // updater runs the user application.  Otherwise the updater attempts
            // to load a new application.
            // In order to prevent a partially programmed imaged (due to some
            // error occurring while programming), the first two locations are
            // not programmed until all of the rest of the image has been
            // successfully loaded into the flash.  This way if there is some error,
            // the updater will detect that a user application is not present and
            // will not attempt to run it.
            //
            // For the first block, do not program the first two word locations
            // (8 bytes).  These two words will be programmed later, after
            // everything else.
            //
            if(ui32ProgAddr == APP_START_ADDRESS)
            {
                uint32_t *pui32Temp;
    
                pui32Temp = (uint32_t *)g_ui8SectorBuf;
                ui32SavedRegs[0] = pui32Temp[0];
                ui32SavedRegs[1] = pui32Temp[1];
    
                //
                // Call the function to program a block of flash.  Skip the first
                // two words (8 bytes) since these contain the initial SP and PC.
                //
                ROM_FlashProgram((uint32_t *)&g_ui8SectorBuf[8],
                                 ui32ProgAddr + 8,
                                 ((ui32DataSize - 8) + 3) & ~3);
            }
    
            //
            // All other blocks except the first block
            //
            else
            {
                //
                // Call the function to program a block of flash.  The length of the
                // block passed to the flash function must be divisible by 4.
                //
                ROM_FlashProgram((uint32_t *)g_ui8SectorBuf, ui32ProgAddr,
                                 (ui32DataSize + 3) & ~3);
            }
    
            //
            // If there is more image to program, then update the programming
            // address.  Progress will continue to the next iteration of
            // the while loop.
            //
            if(ui32Remaining)
            {
                ui32ProgAddr += ui32DataSize;
            }
    
            //
            // Otherwise we are done programming so perform final steps.
            // Program the first two words of the image that were saved earlier,
            // and return a success indication.
            //
            else
            {
                ROM_FlashProgram((uint32_t *)ui32SavedRegs, APP_START_ADDRESS,
                                  8);
    
                return(0);
            }
        }
    
        //
        // If we make it here, that means that an attempt to read a sector of
        // data from the device was not successful.  That means that the complete
        // user app has not been programmed into flash, so just return an error
        // indication.
        //
        return(1);
    }