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.

[参考译文] EK-TM4C1294XL:TCP 引导加载程序、跳转至应用中出现问题

Guru**** 2473260 points
Other Parts Discussed in Thread: EK-TM4C1294XL, ENERGIA, TM4C1294NCPDT, UNIFLASH

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/673585/ek-tm4c1294xl-tcp-bootloader-issue-in-jump-to-app

主题中讨论的其他器件:EK-TM4C1294XLENERGIATM4C1294NCPDTUNIFLASH

大家好、我目前在 EK-TM4C1294XL 电路板上使用 John 的 TCP 引导加载程序。 简直太棒了。 下面是他的帖子的链接:

https://e2e.ti.com/support/microcontrollers/tiva_arm/f/908/p/587260/2294240?tisearch=e2e-sitesearch&keymatch=tm4c%20tcp%20bootloader#2294240

现在、我想稍微修改一下引导加载程序、以便在固件更新后 、EEPROM 中的 BOOTLOADING 位置不是由引导加载程序本身写入的、而是仅在经证明是稳定的且正常的情况下由主应用程序写入。

这样、如果我错误地使用无法正常工作的主应用程序更新了电路板、就不必手动(即使用 USB 在本地连接到电路板并使用 LM 闪存编程器或 Energia、 或任何其他刷写工具)对 EEPROM 中的 BOOTLOAD 位置进行重新编程、但只需关闭电路板电源即可(或看门狗过期)将其放入引导加载程序并允许更新新固件。

因此、 在 John 的函数 Read_LocalClient 中、在地址0x00010000处的闪存中进行固件传输后、我注释了将 BOOTLOADING 写入0的代码、并发出无限循环、 并添加了包含在 setup 函数中的相同代码片段以跳转到主应用程序:

HWREG (0xE000E000 +(0xD08))=(0x10000和0xFFFFFFF);//更新矢量表偏移寄存器
asm (" MOVW r0、#0x0000");//加载 r0-Low、地址的低部分、2字节
asm (" MOVT r0、#0x0001");//将 r0-High 加载到地址的高位2字节
asm (" ldr sp、[r0]");//将应用程序矢量地址加载到 SP 中
asm (" LDR r0、[r0、#4]");//准备跳转到起始地址+ 4.
asm (" BX r0");//进行跳转

但遗憾的是、当我尝试刷写固件时、通过 BL 将文件从 TCP 客户端完全传输到电路板、但跳转到主应用程序失败:电路板重置、BL 启动。

附件您可以找到 John 的原始代码(左侧)与我的修改之间的比较。

修改时我出了什么问题?

此致

Simonee2e.ti.com/.../3438.tcp_5F00_bootloader.html

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

    您好、Simone、
    您可以调用 system_watchdog_feed()。 如何设置看门狗? 在 BX 指令或应用程序运行之前、您的复位是否可能是由看门狗引起的? 您能否注释掉 asm (" BX r0")并单步执行您添加的新代码?

    BTW、您是否有机会尝试 TivaWare 的以太网引导加载程序示例? 在 TivaWare 的示例中、应用程序将等待来自 BOOTP 客户端的魔术字。 收到魔法字后、将开始固件更新。 您还可以使用引脚(即按下开关)强制固件。 我想知道是否有任何问题阻止您引用 TivaWare 示例?

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

    您好 Charles、看门狗设置不会相对于 John 的引导加载程序版本发生更改、即:

    void system_watchdog_setup()
    {
    //启用看门狗外设
    ROM_SysCtlPeripheralEnable (SYSCTL_Periph_WDOG0);
    while (!ROM_SysCtlPeripheralReady (SYSCTL_Periph_WDOG0))
    ){
    //等待看门狗模块准备就绪
    }
    
    //检查寄存器是否被锁定,然后解锁。
    if (ROM_WatchdogLockState (WATCHDOG0_BASE)== true)
    {
    ROM_WatchdogUnlock (WATCHDOG0_BASE);
    }
    
    ROM_WatchdogReloSet (WATCHDOG0_BASE、BL_SysClock * 3);// DTMF_lSysClock 在 setup ()/6
    秒内已设置为120MHz。 (3秒到第一次超时和
    //中断,另外3秒用于处理器引导。
    //启用看门狗失效时的复位
    rom_WatchdogResetEnable (WATCHDOG0_BASE);
    
    //启用看门狗中断
    //获取
    
    
    
    
    并打印复位原因(WATCHDOG0_BASE);//启用 ROM_USEADCogeneEnable (WATCHDOG0_BASE);//获取并打印复位原因(USCROM_RESTHREST_RESTON_RESTON_RESTON_RESTONSE
    
    
    
    
    
    
    
    
    
    
    
    serial.println (" ");
    Serial.println (" ");
    Serial.print ("系统时钟频率已设置为:");
    Serial.println (BL_SysClock);
    Serial.println ("系统看门狗重新引导时间设置为:6秒");
    Serial.********_(") ");
    Serial.println (" ");
    Serial.println ("");
    } 

    TCP 服务器启动后在 setup()函数中调用。

    我调用 system_watchdog_feed()、因为我最初认为电路板过度复位是由汇编器指令之前的看门狗过期引起的、但这没有解决问题。 很遗憾、我使用的是 Energia IDE (而不是 CCS)、因此我无法执行调试并单步进入汇编器代码。

    请您(或 John)确认我将设置 lm4fcpp_Snowflak.ld 链接器文件进行编译、如下所示?

    存储器

    闪存(Rx):origin = 0x00000000、length = 0x00100000
    RAM (rwx):origin = 0x20000000,length = 0x00040000

    引导加载程序

    存储器

    闪存(Rx):origin = 0x00010000、length = 0x00040000
    RAM (rwx):origin = 0x20000000,length = 0x00040000

    用于编译主应用程序。

    Simone

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Simone、
    您需要坚持使用 Energia IDE 有何原因?如果您正在进行任何认真的软件开发、我强烈建议您使用 CCS 或 IAR 等成熟的 IDE 我不熟悉 Energia 平台。 如果无法提供任何调试功能、则很难知道正在发生什么情况。 您可以将 Energia 导入 CCS。 也许这是您在 CCS 中调试问题的一种方法。 不过 BTW、CCS 是免费的。

    我在先前的答覆中有一个错误的评论。 我想让您注释掉 system_watchdog_feed(),而不是 asm (" BX r0")。 很抱歉。 我想您已经尝试注释出 system_watchdog_feed(),对吧?

    您没有告诉过我 TivaWare 引导加载程序示例是否有任何错误、该示例会阻止您为项目引用它。

    这两个链接器命令文件来自哪里? 您是否仅显示部分文件? 我不会发现上面显示的链接器命令有问题。

    您在下拉框中显示 John 的引导加载程序项目的论坛链接可能已被截取。 我建议您直接与他联系以获得建议。 在论坛中、您可以尝试通过朋友请求与他联系。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Charles、
    为了使用 TivaWare 引导加载程序通过互联网(而不是在简单的 LAN 中)执行更新、我应该使用哪个应用程序作为 TCP 客户端?

    链接器命令来自 Energia IDE 中包含的链接器文件、并在编译时使用。 该文件具有更多的"指令"、但我仅在编译引导加载程序或主应用程序时修改了闪存部分的地址和大小。

    谢谢
    Simone
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Simone、
    TivaWare 以太网示例可以使用 LM 闪存编程器或 eflash.exe 实用程序来更新固件。 LM 闪存编程器充当 BOOTP/TFTP 服务器。 我认为它仅用于 LAN。

    引导加载程序和主应用程序是两个不同的项目。 因此、乍一看、我看不到您的命令文件有问题。 我注意到、对于引导加载程序、闪存大小为0x100000 (这是整个1M 字节范围)。 您的引导加载程序映像应小于0x10000、因为您的应用程序将从0x10000开始。 由于它们是两个不同的项目、如果您确信引导加载程序映像不会超过0x10000、那么指定0x100000应该是可以的。 但是、要保持在安全的一侧、您可以将引导加载程序的闪存长度更改为0x10000。 我会将引导加载程序链接器命令映像为包含段、其中该段会指定"run"和"load"地址。 加载地址将为0x0。 将引导加载程序编程到闪存中后、将有代码将引导加载程序本身复制到 SRAM 中、引导加载程序实际上从 SRAM 中运行。 运行地址将为0x20000000。 请参阅 TivaWare 示例。 我不确定这是否在 John 的引导加载程序中完成。 您需要进行检查。 总之、如果 John 的引导加载程序正在为您工作、您为什么要修改他的链接器命令文件?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我认为它仅用于 LAN。

    -->这就是为什么我使用了 John 的 BL 而不是 TivaWare。

    关于链接器文件的修改、这是 John 的 BL 请求的。 我只需要确认是否正确。

    我会尝试联系他。

    谢谢

    Simone

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Simone、您好、感谢您提到"my"引导加载程序、这当然是论坛中许多其他开发人员的工作、论坛经理/Gurus 为我提供的帮助以及我的一些网络辣味的集体成果。 好的一点是、它始终工作。 互联网引导加载/固件更新上载的主要问题是、在远程访问时、您可以安全使用的数据块每个传输周期不应超过512字节、而在本地、每个传输周期最多可扩展到16KB。
    我对项目进行了编码已经有一段时间了、其间进行了一些细微的修改、现在似乎已经成功处理了超过1500个物联网单元上的远程固件更新和控制问题。 Tiva Ware 的以太网本地引导加载程序也具有出色的质量、但我在尝试进行一些修改以使其能够访问云固件服务器而不仅仅是本地 PC 时遇到了问题。 当然,问题是由于我迄今仍没有解决的错误,因为我对这些问题的深入讨论时间有限。 明年夏天、我希望在云更新系统等推送通知方面取得很好的效果、我会不时地进行编码、当然、我会在这里发布整个项目。
    我将于明天某个时候通过永久的下拉列表框链接在这里发布最新版本的当前引导加载程序软件和固件。 现在、让我看看我是否很清楚您遇到的问题:

    链接器文件的地址正确、前提是当您为引导加载程序编译时、应用程序的 RAM 范围将被禁用、反之亦然。 (不要忘记主应用程序代码中应用程序的 RAM 地址声明)

    关于 Charles 所说的 Tivaware 的引导加载程序在初始加载后自动加载到 SRAM 的内容、完全正确。 Tivaware 使用的方案如下:a)您始终为相同的闪存地址0x00000000编译/链接您的应用程序和 Tivaware 引导加载程序。 b)然后、一些引导加载程序代码自动将引导加载程序从闪存传输到 SRAM c)然后引导加载程序等待您的应用程序并将其放置在闪存地址0x00000000处、当然会覆盖不再需要的闪存映像、并且还会将自身永久重新定位到上部闪存中。
    因此、下次您想要更改固件时、只需使用触发引导加载程序来触发外部引脚功能、或者如果您在内部具有 EEPROM、当然、也可以在所选的 Tivaware 引导加载程序上使用 EEPROM。

    通过首次加载 SRAM 方案、我的引导加载程序也可以轻松修改为将自身重新定位到上部闪存、但由于我在 IOT 的同一闪存上使用了三种不同的应用/固件、这些应用程序根据每个不同应用程序的行为导致的 EEPROM 变化自行启动、 我希望闪存前48KB 以上的所有空间都是免费的、并根据不同应用的大小随意管理。

    因此、请检查应用程序的源代码是否正确定义了 RAM /闪存地址的初始定义、以便编译器知道如何处理源的重定位。 明天我将有更多的时间、我将彻底检查您的来源、我将告诉您。

    在这个论坛和快乐的赤道诺克斯,这里的所有人都是最棒的。
    John
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、John、感谢您的回复。

    我无法获得以下几点:

    链接器文件的地址正确、前提是当您为引导加载程序编译时、应用程序的 RAM 范围将被禁用、反之亦然。


    如果我使用以下代码编译引导加载程序、是否正确:

    内存
    {
    闪存(Rx):origin = 0x00000000、length = 0x00100000
    RAM (rwx):origin = 0x20000000,length = 0x00040000
    //FLASH (Rx):origin = 0x00010000,length = 0x00040000
    //ram (rwx):origin = 0x20000000,length = 0x00040000
    
    } 

    和我的应用:

    内存
    {
    //FLASH (Rx):origin = 0x00000000,length = 0x00100000
    //ram (rwx):origin = 0x20000000,length = 0x00040000
    闪存(Rx):origin = 0x00010000、length = 0x00040000
    RAM (rwx):origin = 0x20000000,length = 0x00040000
    
    } 

    ? 或者我应该修改其他内容吗?

    关于您在我的应用程序开头提到的定义:

    (不要忘记主应用程序代码中应用程序的 RAM 地址声明)

    #define APP_BASE 0x00010000 (我将 MAIN_APP_1放在这里)
    #define APP_Leng 0x00040000 (主应用程序的长度+裕度)
    #define RAM_base 0x20000000
    #define RAM_Leng 0x00040000 

    我在输出二进制文件中没有看到任何变化(我将它们与特定程序进行了比较)、无论我是否在应用程序的开头包含上述定义。 不带4个定义的输出文件与带4个定义的相关输出文件相同。 当然、如果我尝试使用以下代码编译我的应用:

    内存
    {
    闪存(Rx):origin = 0x00000000、length = 0x00100000
    RAM (rwx):origin = 0x20000000,length = 0x00040000
    //FLASH (Rx):origin = 0x00010000,length = 0x00040000
    //ram (rwx):origin = 0x20000000,length = 0x00040000
    
    } 

    输出二进制文件与使用以下代码编译应用程序不同:

    内存
    {
    //FLASH (Rx):origin = 0x00000000,length = 0x00100000
    //ram (rwx):origin = 0x20000000,length = 0x00040000
    闪存(Rx):origin = 0x00010000、length = 0x00040000
    RAM (rwx):origin = 0x20000000,length = 0x00040000
    
    } 

    但它对一开始的定义并不敏感。

    感谢您的帮助、

    Simone

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

    Simone、您好!

    Snowflake 文件按应有的方式处理、您可以在这里正常处理。 但在主应用程序中、定义是这样的

    #define APP_BASE 0x00010000
    #define APP_Leng 0x00040000
    #define RAM_BASE 0x20000000
    #define RAM_Leng 0x00040000 

    必须与上述内容相同,而且必须将其纳入来文提交人。

    我建议在任何新的尝试之前、先对一个小容器进行编码、然后将所有 EEPROM 位置归零、或者至少将您使用的位置归零。
    有时、在测试期间、我们会使用特定的值设置一些 EEPROM 或闪存地址、而我们忘记了
    在崩溃或意外重新引导后进行清理。 因此、我们的应用程序可能会将它们切换为我们所期望的状态、或者在没有任何操作的情况下对它们进行测试
    成功地找到预期目标。

    此致、
    John
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    John、您好、我不确定我是否理解您的观点、但:

    1) 1)在板上刷写引导加载程序之前、我始终刷写并执行一个小型程序来清除(即设置为0xff)所有 EEPROM 位置、然后使用 LAN 所需的值设置网关、MAC、IP 和端口位置
    2) 2)在任何情况下、我的意愿是、在闪存上传输固件后、无论 EEPROM 位置值如何(即不写入和检查 EEPROM BOOTLOADING 位置)、引导加载程序都会执行到应用的跳转、因此、一旦闪存上的固件上传完成、 EEPROM 值应该没有意义、不是吗?

    谢谢
    Simone
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Simone、
    您能否解释 #if 0和1检查的目的是什么? 稍后、我将发布最新的引导加载程序固件。
    John
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!
    只需在编译中包含我的修改(#if 1)、即直接跳转到应用程序、而不是初始实现(#if 0)、即写入 BOOTLOADING 位置和由看门狗过期导致的电路板重启。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我无法真正理解电路板发生了什么情况。 我尝试重新刷写 John 的原始引导加载程序、然后上载简单应用程序失败。

    我执行了以下步骤:

    1)在板上刷写了一个简单的应用程序、清除(0xff)整个 EEPROM、然后设置网关、IP、端口、子网->它执行正确

    2) 2)在地址0x0上刷写了 LM 闪存编程器 John 在电路板上的原始二进制文件 tcp_bootloader.bin。 操作成功完成。 CRC32在器件和源之间匹配( 0xA233A7B4)

    3) 3)使用 Snowflake .ld 文件中的以下设置编译了 Energia Blink 示例:

    内存
    {
    //FLASH (Rx):origin = 0x00000000,length = 0x00100000
    闪存(Rx):origin = 0x00010000、length = 0x00040000
    RAM (rwx):origin = 0x20000000,length = 0x00040000
    
    } 

    在源代码开始时还使用以下定义:

    #define APP_BASE 0x00010000
    #define APP_Leng 0x00040000
    #define RAM_BASE 0x20000000
    #define RAM_Leng 0x00040000 

    尽管它们的存在或不存在不会修改生成的二进制文件。

    4) 4)使用 SendFiles.exe 应用在板上加载 Blink.cpp.bin。 下载显然是成功的:

    TCP 服务器侦听器已启动。 正在等待新固件
    外部复位
    
    (一
    System Clock Frequency (系统时钟频率)已设置为:120000000
    System Watchdog Reboot Time (系统看门狗重新引导时间)设置为:6秒。
    (一
    (一
    
    
    
    从0x10000到0x000FA000的闪存存储器现在被擦除。
    
    正在等待新固件更新..........
    2428
    文件大小:2428***每个2048字节的1个部分。
    
    ~~~~~~~~~~~~~~~~部分的***字节:380 μ V 2428FFFF!!!FFFF!!!
    
    
    正在进入接收模式...
    65536 >< 0 >*< 2048字节的块传输.......... 块编号1
    67584 >< 0 >*< 2048字节块传输.......... 第2个数据块
    末尾380字节传输的最终数据块..........
    
    >>> 物联网模块现在将在6秒内重新启动 MAIN_application <<<<<<<<<<<<<<<<<<<<<<<<
    

    但电路板会复位、但闪烁示例不会运行:

    我是 我现在在3秒内将控制权传递给 main_app_1。。。
    
    
    
    

    (此时会被吸入)

    因此、作为验证、使用 LM 闪存编程器、我从地址0x10000到0x50000读取闪存内容、并将生成的二进制文件与 Blink.cpp.bin 进行比较。 最后一个块(从偏移量0x800开始)似乎没有被正确存储到闪存中。 请参阅随附的文件以比较两个二进制文件。 我使用同一个文件执行了不同的尝试、结果是相同的。 然后尝试使用更大的文件、该文件具有不同数量的块。 在这种情况下、除了最后一个块外、所有块都在原始文件和闪存内容之间匹配。

    发生什么事了?  

    感谢你的帮助

    Simone

    e2e.ti.com/.../BlinkCompare.html

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

    Simone、您好!  

    从打印的消息中可以看到、引导加载程序的固件开始计算1个2048字节的部分  

    和380字节。 然后、在上载日志中、引导加载程序显示2048字节的2个部分的传输  

    最后一部分是380。 显然、代码内部的意外修改会导致错误行为。  

    闪烁二进制文件最终总共有多少字节?  

    John

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

    它是2428字节。 我已刷写您的 Bin、如从压缩文件夹中提取的那样。 无修改。 此外,打印消息似乎与源代码兼容: Write_Flash()函数在每个块(甚至是最后一个块)上调用,并且每次打印消息“2048 字节块已传输..........” "(在 写入闪存之前、最后一个块中超过380字节的部分用'\0'填充)。 因此、它会打印两倍的消息、这一点并不奇怪。

    在从闪存读取的内容中、从0x97C 到0xFFF 的零(最后一个块未使用的1668字节的零填充)正确存在。 唯一不相干的是前380个字节:它们不是原始二进制文件所期望的那样。 具体而言、它们是第二个块的前380个字节的重复。

    谢谢你

    Simone

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

    我无法说出原因、但为了使您的引导加载程序再次正常工作、我不得不引入一个小延迟:
    延迟(500);
    刚刚完成:
    bl_localClient.write ('$');

    似乎网络上最后一个块的传输没有发生、因此   INPU_BUFFER 的第一个 LAST_part (380)字节保留了之前的值(这说明了从闪存检索到的二进制文件中这些字节与第二个块相同的原因)。

    由于延迟、它可以正常工作、并且地址0x10000中的闪存内容与生成和上传的二进制文件完全匹配。
    但是、我想到的初始修改(禁止写入 BOOTLOADING 位置、直接跳转到应用程序初始地址)不起作用。 我将尝试了解我的错误。 请提供任何帮助。
    您告知我们提供了新版本的引导加载程序:非常感谢您能与我们分享它、了解实施中的新增功能。

    感谢您的帮助和耐心。
    Simone

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

    您好 Simone。

    以下是我用于 TM4C1294NCPDT 芯    片的最新引导加载程序固件的链接:"。">www.dropbox.com/.../jopil_Bootloader.ino C#应用程序源不再包含在内、因为它现在是包含许多受保护的源商业部分的较大命名空间的一部分。 但是、初始 C#固件更新应用程序的逻辑是99%相同的、您仍可以参考它。

    还请记住、擦除闪存时、地址位置填充为0xff 而不是0x00、因此您在引导加载程序中的签入应该是从引导加载程序的源代码内部进行的0xff。

    祝你一切顺利、

    John

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

    John、非常感谢您上传新固件。

    当您说"还要记住、擦除闪存时、地址位置填充为0xff 而不是0x00、因此您在引导加载程序中的签入应该是从引导加载程序的源代码内部进行的0xff。"时、您指的是哪项检查?

    Simone

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    设置部分中的初始检查、确定是直接跳转到应用程序空间、还是执行固件更新等待循环。 John
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    好的、您是指擦除 EEPROM 吗? (不是闪存)
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    正确的 Simone、EEPROM、我是说、
    John
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    正确的 Simone。 你试过吗?

    John

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

    您好、John、很遗憾我现在没有电路板、因此我无法尝试您的新引导加载程序。 此外、我还需要修改 c#客户端以将其足够用于新的引导加载程序、因此需要一点时间。 总之、我快速了解了代码、非常喜欢按钮管理和"动态"数据包大小管理。 很棒的想法!

    我当时在考虑我最初的修改想法。 也许汇编器指令放置正确、但不允许执行某些操作:例如、我认为如果 bootloader 已经调用 serial.begin、那么即使在主应用程序的设置函数中也无法调用它。 Ethernet.begin 也是如此。

    我认为这可能是导致我的应用 程序在从引导加载程序调用时无法正常工作而不进行电路板复位的原因。 可以吗?

    谢谢

    Simone

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    嗯、我无法理解 Simone 可能是什么问题。 我不能想到会阻止您的应用程序在固件引导加载后启动的其他东西。 我的最后一个猜测是尝试使用 UniFlash 编程器而不是 LM 闪存、看看会发生什么情况。
    John
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Simone。 您最终是否解决了该问题? 祝你一切顺利、John

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

    John、您好、感谢您的关注。

    遗憾的是、我没有时间测试您的新引导加载程序、也没有时间使用 Uniflash 进行闪存、我修改了该引导加载程序、以便在固件下载后直接跳转到应用程序。 我将在周末按以下顺序进行尝试:

    1) 1)首先、我将尝试消除我必须在旧引导加载程序中引入的延迟、以查看它是否像过去那样再次发挥出色作用。 在此阶段、我将排除我对直接跳转的修改

    2)尝试介绍远程固件下载后直接跳转到应用程序、并使用 uniflash 刷写修改后的引导加载程序(如您所建议)、以查看它是否对 LM 闪存编程器有所不同

    3) 3)我将尝试您的新引导加载程序。 遗憾的是、我会将此保留为最后一次尝试、因为我必须修改 TCP 客户端应用程序、而且我对 C#中的字符串操作不太熟悉

    4) 4)如果步骤2成功、我将尝试修改您的新引导加载程序、以引入直接跳转的修改

    第1点是最大的问题:我不理解为什么在某个时候您的原始引导加载程序未正确存储最后一个数据块、我不得不介绍延迟。 你有什么想法吗? 我在您的旧引导加载程序中看不到任何错误。 新的唯一区别是消除 了已填充但未使用的 OUT_BUFFER[i]、但我不会将其视为错误、只是一些未使用的代码。

    此致

    Simone

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

    尊敬的 John:

    我尝试了上述步骤。

    1) 1)遗憾的是、您的原始引导加载程序不再适用于我。 我必须在 BL_localClient.write ('$')之后保留延迟、以使其正常工作。 可能是由于网络中的一些延迟、即使我尝试使用以太网连接(无 WiFi、无 WAN)

    2) 2)我无法使用 Uniflash 刷写引导加载程序。 出现以下错误:

    [09:56:25]在目标内核上启动多个程序的操作...
    [09:56:26]正在加载程序:C:\Dati\Download\Elettronica\TM4C\Bootloader\tcp_bootloader\bootloader_CCS7_projects\tcp_bootloader\Release\tcp_bootloader.bin
    [09:56:26]错误>> Tiva_LM_device:GEL:在加载文件时遇到问题:C:\Dati\Download\Elettronica\TM4C\Bootloader\tcp_bootloader\bootloader_CCS7_projects\tcp_bootloader\Release\tcp_bootloader.bin 无法确定文件的目标类型

    [09:56:26]加载文件时遇到问题:C:\Dati\Download\Elettronica\TM4C\Bootloader\tcp_bootloader\bootloader_CCS7_projects\tcp_bootloader\Release\tcp_bootloader.bin
    无法确定文件的目标类型
    [09:56:26]程序操作完成。

    II 已使用 Uniflash 3.4。

    3) 3)修改了 C#客户端应用程序、以便尝试使用新的引导加载程序。 这也仅在我在  BL_localClient.write ('$')之后放置一个延迟时才有效。 但至少我设法修改了客户、使其适应您的新 BL、因此我非常满意。

    4) 4)跳过第4点、因为我在任务2中没有成功

    结论:

    A)这可能只是我个人网络的一个问题、但要使两个引导加载程序正常工作、需要在一个块和另一个块之间有一个很小的延迟、

    b)在固件上传后无法找到跳转到主应用程序的解决方案、无需重置电路板。

    感谢您的支持。

    Simone