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.

[参考译文] TM4C129ENCPDT:远程固件更新 TM4C129ENCPDT

Guru**** 2535750 points
Other Parts Discussed in Thread: TM4C129ENCPDT

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/821976/tm4c129encpdt-remote-firmware-update-tm4c129encpdt

器件型号:TM4C129ENCPDT
主题中讨论的其他器件: DK-TM4C129X

您好!

我开发了一款具有启用以太网模块的 TM4C129ENCPDT 的定制板。 我能够使用 FreeRTOS-TCP 和 UDP 堆栈通过 UDP 和 TCP/IP 协议与控制器进行通信。

现在我想实施远程固件更新机制、但我不知道从哪里开始。 我已经在论坛上阅读过关于同一主题的许多文章。 我曾尝试通过提供 MAC 地址和 IP 地址来连接到控制器,但是它不起作用,它说正在尝试连接.... 它似乎卡住了、因为它无法从控制器获得任何响应。

  • 一般情况下,有人能否提及要采取的步骤?

还请提及;

  1. 如何检查我的控制器中是否已有引导加载程序
  2. 如果不是、我应该使用哪个引导加载程序
  3. 我正在使用控制器内部 ROM 来保存少量变量, 可能占用50-100字节的 ROM 空间。如果我使用基于 ROM 的引导加载程序,它会在地址上造成任何冲突吗?  
  4. 我可以从哪里下载它

感谢大家的参与和帮助。

此致、

Sahil

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

    您好、Sahil、

    我将在我们的以太网专家中介绍有关以太网引导加载程序操作的更多信息、但有几个早期评论:

    1) 1)要调用 ROM 引导加载程序、您需要:

    1. 使用 ROM_UpdateXXX API 触发您的应用、其中 XXX 为 UART、USB、I2C、SPI 或以太网
    2. 将 GPIO 配置为通过 BOOTCFG 寄存器进行检查、启动时 ROM 将检查该寄存器以确定是否进入引导加载程序
    3. 在器件启动期间使器件的闪存为空

    有关更多详细信息、请参阅此帖子: e2e.ti.com/.../1946942

    2) 2)对于此应用、我可能会建议使用闪存引导加载程序、这样可以为您提供更大的灵活性、但 Charles 可能有一种简单的方法来使用 ROM 引导加载程序。

    3) 3)您无法将任何内容保存到 ROM。 ROM 是只读存储器。 根本无法更改 ROM。

    4) 4)不清楚这意味着什么。

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

    很抱歉、我将 ROM 与器件 EEPROM 上的内容混淆。

    第二点是"将 GPIO 配置为通过 BOOTCFG 寄存器进行检查、启动时 ROM 将检查该寄存器以确定是否进入引导加载程序" 、这是第一点的替代点、即"使用 ROM_UpdateXXX API 在您的应用程序上触发该 GPIO、其中 xxx 应为 UART、USB、I2C、SPI 或以太网"

     


    如果是第二步、那么在我的情况下是不可行的、因为我将有一个固件已经运行、如果我需要更新固件、我只需通过以太网端口发送固件。 我不希望有人在本地访问器件并点击将触发引导加载程序的开关。

    我的器件将已运行固件、需要对其进行更新。

    4) 4)不清楚这意味着什么。


    我是说我可以从 TI 网站下载引导加载程序的位置。

    谢谢

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

    您好、Sahil、

    这是调用 ROM 引导加载程序的3个独立选项。 您只需选择三个选项之一。

    我们的闪存引导加载程序在 TivaWare 中提供。 dk-tm4c129x 文件夹中还有一个 boot_emac_flash/boot_demo_emac_flash、您可以将其作为以太网部分的参考。

    我们不提供用于引导加载程序的 ROM 代码的完整源代码、但它的某些部分基于用于闪存引导加载程序的相同文件、就像 ROM 中包含的 TivaWare API 数量一样。

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

    您好、谢谢

    我已实施远程固件更新。 我正在关注此 链接上的一个主题

    我正在调用 ROM_UpdateEMAC()

    这是我在调用 fucnion 之前使用的代码;

    IntMasterDisable();
    HWREG (NVIC_DIS0_R)= 0xFFFFFFFF;
    HWREG (NVIC_DIS1_R)= 0xFFFFFFFF;
    HWREG (NVIC_DIS2_R)= 0xFFFFFFFF;
    HWREG (NVIC_DIS3_R)= 0xFFFFFFFF;
    SysTickIntDisable();
    SysTickDisable();

    然后、我使用 LM 闪存编程器连接到器件;

    我还提供设备的 EMAC 和 IP 地址。

    但是,当我按下“程序”按钮时,它会显示“正在尝试连接……”。 它就在那里。

    有什么想法吗?

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

    附加的是图像

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

    您好!

     您如何获取要使用的 IP 地址并将其放入 LM 闪存编程器中?  

     您能否先按 原样尝试 EMAC_BOOT_FLASH (基于闪存的引导加载程序)和 boot_demo_emac_flash.bin (引导加载程序将加载的示例应用程序)、能否让其正常工作?

     下面是尝试 EMAC_BOOT_FLASH 示例的说明。

    1.运行 enet_lwip 示例并记录 IP 地址。 IP 地址将通过终端窗口显示。 首次运行此示例的原因是只需获取 IP 地址。 使用 BOOTP 协议,引导加载程序的大小应该非常紧凑。 但是,BOOTP 本质上是静态的,与 DHCP 不同,DHCP 根据请求为客户端提供动态 IP 地址。 通常、您的 DHCP 会在特定的时间段(可能是小时或一天)内将 IP 地址租赁给您的客户端(MCU)。 通过运行 enet_lwip 获取 IP 地址后、IP 地址将在一段时间内仍然有效。 这是您要在 LM 闪存编程器中输入的 IP 地址。 如果您使用 launchpad、则在电路板背面会有一个贴纸显示 MAC 地址。 LM 闪存编程器充当 BOOTP 和 TFTP 服务器。 它必须在其系统中预先记录的 IP 地址和 MAC 地址之间建立关联。 请注意、您必须在 LM 闪存编程器中输入正确的 IP 地址和 MAC 地址。 如果没有它们,服务器将无法接受来自客户机的 BOOTP 请求。  
    2.通过 JTAG 接口将 EMAC_BOOT_FLASH 编程到闪存中。
    3.打开 LM 闪存编程器并输入终端窗口中显示的步骤1中的 IP 地址和 MAC 地址
    4.运行 EMAC_BOOT_FLASH 程序
    5.转到"Program"选项卡下的 LM 闪存编程器,指定 boot_demo_emac_flash.bin 并点击"Program"按钮

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

    您好、Charles、

    感谢你的答复。

    正如我说过的、我正在使用 FreeRTOS_TCP/IP 堆栈、它运行正常。

    我可以使用以太网 UDP 和 TCP 协议与控制器进行通信。

    当我的控制器复位时、它会将其 IP 和 MAC 地址打印到本地 UART 端口...

    我想我正在输入正确的 MAC 和 IP 地址、它在从 DHCP 服务器重置时刚刚获得。

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

    好的、IP 地址正常。

    当 LM 闪存编程器显示它正在尝试连接时、您等待了多长时间? 请注意,主板将首先发送 BOOTP 请求,如果没有 BOOTP 服务器响应,它将等待2秒钟,然后再发送另一个 BOOTP 请求。 如果服务器仍然没有 BOOTP 响应,则它将等待4秒钟。 换句话说、它将等待1s、2s、4s、8s、16s 的持续时间、 如果服务器没有响应,则在发送下一个 BOOTP 请求之前最多为32秒和64秒。 假设您的应用程序调用 ROM_UpdateEMAC(),并且在经过16秒后未按 LM 闪存编程器上的 Program 按钮,则主板将在发送下一个 BOOTP 请求之前再等待32秒。 在这32秒的时间内、LM 闪存编程器将显示它正在尝试连接。 如果等待时间不够长、您可能看不到握手发生。 最坏的情况是等待64秒。 这就是我问您等待多长时间的原因。 如果您等待几分钟,但没有任何活动,则首先要检查电路板是否正在向外发送 BOOTP 请求。 要了解这一点、您实际上需要使用 Wireshark 来观察以太网流量。 您应该会看到如下所示的内容。  

    我要求您尝试 EMAC_BOOT_FLASH 示例的原因是它是一个经过验证的示例。 这是一个基于闪存的 EMAC 引导加载程序。 如果调用 ROM_UpdateEMAC(),则它将调用存储在 ROM 中的以太网引导加载程序。   BOOT_DEMO_EMAC_FLASH 还包含用于检测来自 BOOTP 服务器的魔术包的代码。 这意味着、只要您按下 LM 闪存编程器上的 Program 按钮、就可以远程完成固件的新更新。 我不知道您是如何编写应用程序的。 但是、您至少应该看看 boot_demo_emac_flash 是如何完成的、以便它可以将控制权转移到引导加载程序。  

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

    您好、Charles、

    感谢您的指导。 我安装了 Wireshark 并开始监听数据包。 当我调用执行以下代码行的函数时、它会注意到我的控制器不会到达最后一行、并且将在我复位之前挂起。

     它会将第一条语句打印到 UART 、然后挂起。

    
    
    UARTprintf ("\r\n 更新固件");
    //IntMasterDisable ();
    HWREG (NVIC_DIS0_R)= 0xFFFFFFFF;
    HWREG (NVIC_DIS1_R)= 0xFFFFFFFF;
    HWREG (NVIC_DIS2_R)= 0xFFFFFFFF;
    HWREG (NVIC_DIS3_R)= 0xFFFFFFFF;
    ROM_SysTickIntDisable ();
    ROM_SysTickDisable ();
    ROM_UpdateEMAC (SYS_CLOCK); 




    我对所有行进行了注释、只剩下下面显示的最后一行;

    // UARTprintf ("\r\nUpDating 固件");
    //IntMasterDisable();
    // HWREG (NVIC_DIS0_R)= 0xFFFFFFFF;
    // HWREG (NVIC_DIS1_R)= 0xFFFFFFFF;
    // HWREG (NVIC_DIS2_R)= 0xFFFFFFFF;
    // HWREG (NVIC_DIS3_R)= 0xFFFFFFFF;
    // ROM_SysTickIntDisable ();
    // ROM_SysTickDisable();
    
    ROM_UpdateEMAC (sys_clock); 

    这样做会导致重新启动控制器。 我不明白为什么控制器会被复位?

    如果您查看上面的代码、我不会与我作为参考 链接所关注的线程相反地写入 NVIC_DIS4_R 寄存器。 这是因为 TM4C129ENCPDT 上不存在该寄存器。 这是我的代码和我提到的链接上的代码的唯一区别。

    请注意:请记住、我的控制器正在持续登录到端口5000上的远程 UDP 服务器、我可以看到正在使用 Yat (Yat 类似于 Putty)进行记录的数据。 我也可以在 Wireshark 上看到相同的数据记录数据包。

    评论您建议使用 EMAC_FLASH_example。 我有点害怕走下去、因为我担心的是使用 FreeRTOS UDP 堆栈、此时无法删除 FreeRTOS USP 堆栈并替换为 lwIP 堆栈。

    请提供建议。  

    谢谢

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

    您好、Charles、

    我刚刚更改了代码、并且还包括了 NVIC_DIS4寄存器、现在看起来控制器正在发送 BOOTP 数据包、就像我在 Wireshark 上捕获的那样。

    请注意、我的控制器 IP 地址为192.168.0.1、而不是0.0.0.0、LM Flash Programmer 位于192.168.0.2。

    此外、您还可以看到 LM FlashProgrammer 还以上图中的红圈形式发送广播消息。

    在下图中,它显示 LM Flash Programmer 也在发送 magick 数据包?

    但是、LM Flash 控制器的状态是"正在尝试连接..." 。 我将它保持在该状态3-4分钟、以查看它是否连接、但看起来好像它卡在那里。

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

    BOOOMM、

    我发现问题是所选的以太网适配器是环回的。 我更改了网络适配器并对控制器进行了编程。 现在它正在工作。

    我有一个问题。 根据数据表、 芯片上没有任何寄存器 NVIC_DIS4 (0xE000E190)、而实际上、如果我在代码中注释写入该寄存器、控制器将挂起。

    这是工作代码;

    HWREG (NVIC_DIS0)= 0xFFFFFFFF;
    HWREG (NVIC_DIS1)= 0xFFFFFFFF;
    HWREG (NVIC_DIS2)= 0xFFFFFFFF;
    HWREG (NVIC_DIS3)= 0xFFFFFFFF;
    HWREG (NVIC_DIS4)= 0xFFFFFFFF;
    ROM_SysTickIntDisable();
    ROM_SysTickDisable();
    
    ROM_UpdateEMAC (sys_clock); 

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

    您好、Sahil、

     很高兴您的问题得到了解决。 我想您也需要 NVIC_DIS4。  已实现的中断表是96个以上的通道、NVIC_DIS4用于禁用96个以上的通道。  

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

    谢谢 Charles