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.

[参考译文] TM4C1294NCPDT:以太网固件更新

Guru**** 2391095 points


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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1372813/tm4c1294ncpdt-ethernet-firmware-update

器件型号:TM4C1294NCPDT

工具与软件:

你(们)好   

我曾尝试构建 MQTT 客户端、当我尝试烧录它时、Usig 引导加载程序从地址0x4000烧录、运行良好、 然后、我添加了软件更新、该更新将控制权交给引导加载程序来烧录更新的固件、但它从地址0x000开始烧录代码。我不理解这种奇怪的行为、我将相同代码复制到了 boot_demo_emac_flash 项目中(我只通过 main.c 更新 boot_demo_emac_flash.c 文件、然后我在 boot_demo_flash 项目中添加了 mqTT 客户端的所有文件  
我的问题是" BOOT_DEMO_EMAC_FLASH 项目中是否有可以解决此问题的配置? 如果不是,你认为问题是什么?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Unknown 说:
    我尝试构建 MQTT 客户端时尝试了将其刻录到 Usig 引导加载程序从地址0x4000

    这是哪个引导加载程序? 这是基于闪存的 引导加载程序吗? 如果您使用基于闪存的引导加载程序、那么如果 APP_START_ADDRESS 是 bl_config.h 文件中定义的0x4000、它会将您的固件编程为0x4000。  请参阅下面的片段。

    //*****************************************************************************
    //
    // The starting address of the application. This must be a multiple of 1024
    // bytes (making it aligned to a page boundary). A vector table is expected at
    // this location, and the perceived validity of the vector table (stack located
    // in SRAM, reset vector located in flash) is used as an indication of the
    // validity of the application image.
    //
    // The flash image of the boot loader must not be larger than this value.
    //
    // Depends on: None
    // Exclusive of: None
    // Requires: None
    //
    //*****************************************************************************
    #define APP_START_ADDRESS 0x00004000

    //*****************************************************************************
    //
    // The address at which the application locates its exception vector table.
    // This must be a multiple of 1024 bytes (making it aligned to a page
    // boundary). Typically, an application will start with its vector table and
    // this value should be set to APP_START_ADDRESS. This option is provided to
    // cater for applications which run from external memory which may not be
    // accessible by the NVIC (the vector table offset register is only 30 bits
    // long).
    //
    // Depends on: None
    // Exclusive of: None
    // Requires: None
    //
    //*****************************************************************************
    #define VTABLE_START_ADDRESS 0x00004000

    //*****************************************************************************
    //
    // The size of a single, erasable page in the flash. This must be a power
    // of 2.
    //
    // Depends on: None
    // Exclusive of: None
    // Requires: None
    //
    //*****************************************************************************
    #define FLASH_PAGE_SIZE 0x4000

    Unknown 说:
    然后我添加了软件更新、它将控制权交给引导加载程序来烧录更新的固件、但它烧录的代码始于地址0x000

    从应用程序跳转到引导加载程序与启动引导加载程序首次下载固件没有什么不同。  除非您调用 ROM 引导加载程序而不是闪存引导加载程序、否则它应更新0x4000处的固件。  在应用程序中调用它时、请参见下面的 SoftwareUpdateBegin。 基于 ROM 的引导加载程序将始终在0x0处对固件进行编程。  

    //*****************************************************************************
    void
    SoftwareUpdateBegin(uint32_t ui32SysClock)
    {
    //
    // Disable all processor interrupts. Instead of disabling them
    // one at a time (and possibly missing an interrupt if new sources
    // are added), a direct write to NVIC is done to disable all
    // peripheral interrupts.
    //
    HWREG(NVIC_DIS0) = 0xffffffff;
    HWREG(NVIC_DIS1) = 0xffffffff;
    HWREG(NVIC_DIS2) = 0xffffffff;
    HWREG(NVIC_DIS3) = 0xffffffff;
    HWREG(NVIC_DIS4) = 0xffffffff;

    //
    // Also disable the SysTick interrupt.
    //
    SysTickIntDisable();
    SysTickDisable();

    //
    // Return control to the boot loader. This is a call to the SVC
    // handler in the flashed-based boot loader, or to the ROM if configured.
    //
    #if ((defined ROM_UpdateEMAC) && !(defined USE_FLASH_BOOT_LOADER))
    ROM_UpdateEMAC(ui32SysClock);
    #else
    (*((void (*)(void))(*(uint32_t *)0x2c)))();
    #endif
    }

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

    否、这是以太网引导加载程序(BOOT_EMAC_FLASH)  

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

    好的。

    如果您使用闪存引导加载程序(位于0x0的 BOOT_EMAC_FLASH)先加载示例固件  ( BOOT_DEMO_EMAC_FLASH、而不是您的 MQTT 代码)、它是否成功?  

    在  加载 BOOT_DEMO_EMAC_FLASH 并开始运行后、按 LaunchPad 上的 SW1、它应该跳回闪存引导加载程序、然后再次将您的固件重新加载到0x4000、它是否成功?

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

    我首先加载 boot_demo_example、它运行良好、然后我使用 LM Flasher 对其进行更新、它会正常运行

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我首先加载 boot_demo_example、它运行良好、并且我使用 LM Flasher 更新它并能够正常使用

    我不清楚。 我想确保我们所说的是同一件事。 您说的是 boot_demo_example。 您是指 BOOT_DEMO_EMAC_FLASH 吗?

    我想您使用引导加载程序(boot_emac_flash)通过以太网端口使用 LM 闪存编程器加载示例 boot_demo_emac_flash、对吗?

     BOOT_DEMO_EMAC_FLASH 运行后、您如何跳回引导加载程序? 您是否按下 LaunchPad 上的 SW1? 假设您确实按下了 SW1、引导加载程序是否 再次重新加载 BOOT_DEMO_EMAC_FLASH? 我不认为你在我之前的答复中回答了我的问题。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [报价 userid="93620" url="~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1372813/tm4c1294ncpdt-ethernet-firmware-update/5243708 #5243708"]

    我不清楚。 我想确保我们所说的是同一件事。 您说的是 boot_demo_example。 您是指 BOOT_DEMO_EMAC_FLASH 吗?

    [报价]

    [报价 userid="93620" url="~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1372813/tm4c1294ncpdt-ethernet-firmware-update/5243708 #5243708"]

    我想您使用引导加载程序(boot_emac_flash)通过以太网端口使用 LM 闪存编程器加载示例 boot_demo_emac_flash、对吗?

    [报价]

    正确

      启动 boot_demo_EMAC_flash 后、您是如何跳回引导加载程序的?

    我在通过以太网接收到魔术包时通过 LM Flasher 更新代码  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我在通过以太网接收 Magic 数据包时通过 LM Flasher 更新代码

    如果您可以使用 LM 闪存编程器通过以太网端口重复更新代码、则意味着 bootlaoder 正在更正将固件重新发送到0x4000的问题。 您需要根据 boot_demo_emac_flash 检查您自己的代码之间有什么区别。   

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

    我将 mqTT 客户端工程中的所有文件夹复制到 boot_demo_emac、并通过 mqTT 客户端的 main.c 文件更新 boot_demo_emac.c、我可以重复更新代码。问题是、我在传输文件时这里不起作用、但它在 MQTT 客户端工程上不起作用

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

    如果已将 MQTT 项目的 APP_BASE 设置为0x4000、则需要检查.cmd 文件。  

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

    是的、现在仍然存在同样的问题

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

    我无法查看您的 mqTT 项目、也不知道为什么将 mqTT 文件复制到  boot_demo_emac_flash 项目中、但当 mqTT 项目本身是一个单独的 CCS 项目时、它无法工作。 检查 CCS 项目设置。 它们是否相同? 仔细查看 CCS Build and ARM Linker 下的每个选项、然后查看这两个项目之间是否有任何差异。